Use SCREEN_SPACE_SPECULAR_TRANSMISSION_* name (kinda verbose?)
This commit is contained in:
parent
14e3753751
commit
30eec56e81
@ -39,14 +39,14 @@ pub struct Camera3d {
|
||||
///
|
||||
/// Setting this to `0` disables the screen-space refraction effect entirely, and falls
|
||||
/// back to refracting only the environment map light's texture.
|
||||
pub screen_space_transmission_steps: usize,
|
||||
pub screen_space_specular_transmission_steps: usize,
|
||||
/// The quality of the screen space transmission blur effect, applied to the whatever's “behind” transmissive
|
||||
/// objects when their `roughness` is greater than `0.0`.
|
||||
///
|
||||
/// Higher qualities are more GPU-intensive.
|
||||
///
|
||||
/// **Note:** You can get better-looking results at any quality level by enabling TAA. See: [`TemporalAntiAliasPlugin`](crate::experimental::taa::TemporalAntiAliasPlugin).
|
||||
pub screen_space_transmission_quality: ScreenSpaceTransmissionQuality,
|
||||
pub screen_space_specular_transmission_quality: ScreenSpaceTransmissionQuality,
|
||||
}
|
||||
|
||||
impl Default for Camera3d {
|
||||
@ -55,8 +55,8 @@ impl Default for Camera3d {
|
||||
clear_color: ClearColorConfig::Default,
|
||||
depth_load_op: Default::default(),
|
||||
depth_texture_usages: TextureUsages::RENDER_ATTACHMENT.into(),
|
||||
screen_space_transmission_steps: 1,
|
||||
screen_space_transmission_quality: Default::default(),
|
||||
screen_space_specular_transmission_steps: 1,
|
||||
screen_space_specular_transmission_quality: Default::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -66,12 +66,13 @@ impl ViewNode for MainTransmissivePass3dNode {
|
||||
let _main_transmissive_pass_3d_span = info_span!("main_transmissive_pass_3d").entered();
|
||||
|
||||
if !transmissive_phase.items.is_empty() {
|
||||
let screen_space_transmission_steps = camera_3d.screen_space_transmission_steps;
|
||||
if screen_space_transmission_steps > 0 {
|
||||
let screen_space_specular_transmission_steps =
|
||||
camera_3d.screen_space_specular_transmission_steps;
|
||||
if screen_space_specular_transmission_steps > 0 {
|
||||
let transmission =
|
||||
transmission.expect("`ViewTransmissionTexture` should exist at this point");
|
||||
|
||||
// `transmissive_phase.items` are depth sorted, so we split them into N = `screen_space_transmission_steps`
|
||||
// `transmissive_phase.items` are depth sorted, so we split them into N = `screen_space_specular_transmission_steps`
|
||||
// ranges, rendering them back-to-front in multiple steps, allowing multiple levels of transparency.
|
||||
//
|
||||
// Note: For the sake of simplicity, we currently split items evenly among steps. In the future, we
|
||||
@ -79,7 +80,7 @@ impl ViewNode for MainTransmissivePass3dNode {
|
||||
// falloff so that nearby objects have more levels of transparency available to them)
|
||||
for range in split_range(
|
||||
0..transmissive_phase.items.len(),
|
||||
screen_space_transmission_steps,
|
||||
screen_space_specular_transmission_steps,
|
||||
) {
|
||||
// Copy the main texture to the transmission texture, allowing to use the color output of the
|
||||
// previous step (or of the `Opaque3d` phase, for the first step) as a transmissive color input
|
||||
|
||||
@ -547,7 +547,7 @@ pub fn prepare_core_3d_transmission_textures(
|
||||
};
|
||||
|
||||
// Don't prepare a transmission texture if the number of steps is set to 0
|
||||
if camera_3d.screen_space_transmission_steps == 0 {
|
||||
if camera_3d.screen_space_specular_transmission_steps == 0 {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@ -426,14 +426,22 @@ const fn tonemapping_pipeline_key(tonemapping: Tonemapping) -> MeshPipelineKey {
|
||||
}
|
||||
}
|
||||
|
||||
const fn screen_space_transmission_pipeline_key(
|
||||
const fn screen_space_specular_transmission_pipeline_key(
|
||||
screen_space_transmissive_blur_quality: ScreenSpaceTransmissionQuality,
|
||||
) -> MeshPipelineKey {
|
||||
match screen_space_transmissive_blur_quality {
|
||||
ScreenSpaceTransmissionQuality::Low => MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_LOW,
|
||||
ScreenSpaceTransmissionQuality::Medium => MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_MEDIUM,
|
||||
ScreenSpaceTransmissionQuality::High => MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_HIGH,
|
||||
ScreenSpaceTransmissionQuality::Ultra => MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_ULTRA,
|
||||
ScreenSpaceTransmissionQuality::Low => {
|
||||
MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_LOW
|
||||
}
|
||||
ScreenSpaceTransmissionQuality::Medium => {
|
||||
MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_MEDIUM
|
||||
}
|
||||
ScreenSpaceTransmissionQuality::High => {
|
||||
MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_HIGH
|
||||
}
|
||||
ScreenSpaceTransmissionQuality::Ultra => {
|
||||
MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_ULTRA
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -519,8 +527,9 @@ pub fn queue_material_meshes<M: Material>(
|
||||
view_key |= MeshPipelineKey::SCREEN_SPACE_AMBIENT_OCCLUSION;
|
||||
}
|
||||
if let Some(camera_3d) = camera_3d {
|
||||
view_key |=
|
||||
screen_space_transmission_pipeline_key(camera_3d.screen_space_transmission_quality);
|
||||
view_key |= screen_space_specular_transmission_pipeline_key(
|
||||
camera_3d.screen_space_specular_transmission_quality,
|
||||
);
|
||||
}
|
||||
let rangefinder = view.rangefinder3d();
|
||||
for visible_entity in &visible_entities.entities {
|
||||
|
||||
@ -729,11 +729,11 @@ bitflags::bitflags! {
|
||||
const TONEMAP_METHOD_SOMEWHAT_BORING_DISPLAY_TRANSFORM = 5 << Self::TONEMAP_METHOD_SHIFT_BITS;
|
||||
const TONEMAP_METHOD_TONY_MC_MAPFACE = 6 << Self::TONEMAP_METHOD_SHIFT_BITS;
|
||||
const TONEMAP_METHOD_BLENDER_FILMIC = 7 << Self::TONEMAP_METHOD_SHIFT_BITS;
|
||||
const SCREEN_SPACE_TRANSMISSION_RESERVED_BITS = Self::SCREEN_SPACE_TRANSMISSION_MASK_BITS << Self::SCREEN_SPACE_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_TRANSMISSION_LOW = 0 << Self::SCREEN_SPACE_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_TRANSMISSION_MEDIUM = 1 << Self::SCREEN_SPACE_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_TRANSMISSION_HIGH = 2 << Self::SCREEN_SPACE_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_TRANSMISSION_ULTRA = 3 << Self::SCREEN_SPACE_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_SPECULAR_TRANSMISSION_RESERVED_BITS = Self::SCREEN_SPACE_SPECULAR_TRANSMISSION_MASK_BITS << Self::SCREEN_SPACE_SPECULAR_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_SPECULAR_TRANSMISSION_LOW = 0 << Self::SCREEN_SPACE_SPECULAR_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_SPECULAR_TRANSMISSION_MEDIUM = 1 << Self::SCREEN_SPACE_SPECULAR_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_SPECULAR_TRANSMISSION_HIGH = 2 << Self::SCREEN_SPACE_SPECULAR_TRANSMISSION_SHIFT_BITS;
|
||||
const SCREEN_SPACE_SPECULAR_TRANSMISSION_ULTRA = 3 << Self::SCREEN_SPACE_SPECULAR_TRANSMISSION_SHIFT_BITS;
|
||||
}
|
||||
}
|
||||
|
||||
@ -749,9 +749,9 @@ impl MeshPipelineKey {
|
||||
const TONEMAP_METHOD_MASK_BITS: u32 = 0b111;
|
||||
const TONEMAP_METHOD_SHIFT_BITS: u32 =
|
||||
Self::BLEND_SHIFT_BITS - Self::TONEMAP_METHOD_MASK_BITS.count_ones();
|
||||
const SCREEN_SPACE_TRANSMISSION_MASK_BITS: u32 = 0b11;
|
||||
const SCREEN_SPACE_TRANSMISSION_SHIFT_BITS: u32 =
|
||||
Self::TONEMAP_METHOD_SHIFT_BITS - Self::SCREEN_SPACE_TRANSMISSION_MASK_BITS.count_ones();
|
||||
const SCREEN_SPACE_SPECULAR_TRANSMISSION_MASK_BITS: u32 = 0b11;
|
||||
const SCREEN_SPACE_SPECULAR_TRANSMISSION_SHIFT_BITS: u32 = Self::TONEMAP_METHOD_SHIFT_BITS
|
||||
- Self::SCREEN_SPACE_SPECULAR_TRANSMISSION_MASK_BITS.count_ones();
|
||||
|
||||
pub fn from_msaa_samples(msaa_samples: u32) -> Self {
|
||||
let msaa_bits =
|
||||
@ -984,15 +984,15 @@ impl SpecializedMeshPipeline for MeshPipeline {
|
||||
}
|
||||
|
||||
let blur_quality =
|
||||
key.intersection(MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_RESERVED_BITS);
|
||||
key.intersection(MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_RESERVED_BITS);
|
||||
|
||||
shader_defs.push(ShaderDefVal::Int(
|
||||
"SCREEN_SPACE_TRANSMISSION_BLUR_TAPS".into(),
|
||||
"SCREEN_SPACE_SPECULAR_TRANSMISSION_BLUR_TAPS".into(),
|
||||
match blur_quality {
|
||||
MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_LOW => 4,
|
||||
MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_MEDIUM => 8,
|
||||
MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_HIGH => 16,
|
||||
MeshPipelineKey::SCREEN_SPACE_TRANSMISSION_ULTRA => 32,
|
||||
MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_LOW => 4,
|
||||
MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_MEDIUM => 8,
|
||||
MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_HIGH => 16,
|
||||
MeshPipelineKey::SCREEN_SPACE_SPECULAR_TRANSMISSION_ULTRA => 32,
|
||||
_ => unreachable!(), // Not possible, since the mask is 2 bits, and we've covered all 4 cases
|
||||
},
|
||||
));
|
||||
|
||||
@ -356,8 +356,8 @@ fn fetch_transmissive_background(offset_position: vec2<f32>, frag_coord: vec3<f3
|
||||
// - inversely proportional to view z
|
||||
let blur_intensity = (perceptual_roughness * perceptual_roughness) / view_z;
|
||||
|
||||
#ifdef SCREEN_SPACE_TRANSMISSION_BLUR_TAPS
|
||||
let num_taps = #{SCREEN_SPACE_TRANSMISSION_BLUR_TAPS}; // Controlled by the `Camera3d::transmissive_quality` property
|
||||
#ifdef SCREEN_SPACE_SPECULAR_TRANSMISSION_BLUR_TAPS
|
||||
let num_taps = #{SCREEN_SPACE_SPECULAR_TRANSMISSION_BLUR_TAPS}; // Controlled by the `Camera3d::transmissive_quality` property
|
||||
#else
|
||||
let num_taps = 8; // Fallback to 8 taps
|
||||
#endif
|
||||
|
||||
@ -519,28 +519,30 @@ fn example_control_system(
|
||||
}
|
||||
}
|
||||
|
||||
if input.just_pressed(KeyCode::O) && camera_3d.screen_space_transmission_steps > 0 {
|
||||
camera_3d.screen_space_transmission_steps -= 1;
|
||||
if input.just_pressed(KeyCode::O) && camera_3d.screen_space_specular_transmission_steps > 0 {
|
||||
camera_3d.screen_space_specular_transmission_steps -= 1;
|
||||
}
|
||||
|
||||
if input.just_pressed(KeyCode::P) && camera_3d.screen_space_transmission_steps < 4 {
|
||||
camera_3d.screen_space_transmission_steps += 1;
|
||||
if input.just_pressed(KeyCode::P) && camera_3d.screen_space_specular_transmission_steps < 4 {
|
||||
camera_3d.screen_space_specular_transmission_steps += 1;
|
||||
}
|
||||
|
||||
if input.just_pressed(KeyCode::J) {
|
||||
camera_3d.screen_space_transmission_quality = ScreenSpaceTransmissionQuality::Low;
|
||||
camera_3d.screen_space_specular_transmission_quality = ScreenSpaceTransmissionQuality::Low;
|
||||
}
|
||||
|
||||
if input.just_pressed(KeyCode::K) {
|
||||
camera_3d.screen_space_transmission_quality = ScreenSpaceTransmissionQuality::Medium;
|
||||
camera_3d.screen_space_specular_transmission_quality =
|
||||
ScreenSpaceTransmissionQuality::Medium;
|
||||
}
|
||||
|
||||
if input.just_pressed(KeyCode::L) {
|
||||
camera_3d.screen_space_transmission_quality = ScreenSpaceTransmissionQuality::High;
|
||||
camera_3d.screen_space_specular_transmission_quality = ScreenSpaceTransmissionQuality::High;
|
||||
}
|
||||
|
||||
if input.just_pressed(KeyCode::Semicolon) {
|
||||
camera_3d.screen_space_transmission_quality = ScreenSpaceTransmissionQuality::Ultra;
|
||||
camera_3d.screen_space_specular_transmission_quality =
|
||||
ScreenSpaceTransmissionQuality::Ultra;
|
||||
}
|
||||
|
||||
let rotation = if input.pressed(KeyCode::Right) {
|
||||
@ -580,7 +582,7 @@ fn example_control_system(
|
||||
state.thickness,
|
||||
state.ior,
|
||||
state.perceptual_roughness,
|
||||
camera_3d.screen_space_transmission_steps,
|
||||
camera_3d.screen_space_specular_transmission_steps,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user