Use SCREEN_SPACE_SPECULAR_TRANSMISSION_* name (kinda verbose?)

This commit is contained in:
Marco Buono 2023-10-08 18:52:22 -03:00
parent 14e3753751
commit 30eec56e81
7 changed files with 53 additions and 41 deletions

View File

@ -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(),
}
}
}

View File

@ -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

View File

@ -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;
}

View File

@ -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 {

View File

@ -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
},
));

View File

@ -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

View File

@ -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,
);
}