fix normal prepass (#8890)
# Objective
- Fix broken normals when the NormalPrepass is enabled
## Solution
- Don't use the normal prepass for the world_normal
- Only loadthe normal prepass
- when msaa is disabled
- for opaque or alpha mask meshes and only for use it for N not
world_normal
This commit is contained in:
parent
0294bb191d
commit
72b4aacf86
@ -682,10 +682,6 @@ impl SpecializedMeshPipeline for MeshPipeline {
|
|||||||
let mut shader_defs = Vec::new();
|
let mut shader_defs = Vec::new();
|
||||||
let mut vertex_attributes = Vec::new();
|
let mut vertex_attributes = Vec::new();
|
||||||
|
|
||||||
if key.contains(MeshPipelineKey::NORMAL_PREPASS) {
|
|
||||||
shader_defs.push("LOAD_PREPASS_NORMALS".into());
|
|
||||||
}
|
|
||||||
|
|
||||||
if layout.contains(Mesh::ATTRIBUTE_POSITION) {
|
if layout.contains(Mesh::ATTRIBUTE_POSITION) {
|
||||||
shader_defs.push("VERTEX_POSITIONS".into());
|
shader_defs.push("VERTEX_POSITIONS".into());
|
||||||
vertex_attributes.push(Mesh::ATTRIBUTE_POSITION.at_shader_location(0));
|
vertex_attributes.push(Mesh::ATTRIBUTE_POSITION.at_shader_location(0));
|
||||||
@ -747,6 +743,7 @@ impl SpecializedMeshPipeline for MeshPipeline {
|
|||||||
|
|
||||||
let (label, blend, depth_write_enabled);
|
let (label, blend, depth_write_enabled);
|
||||||
let pass = key.intersection(MeshPipelineKey::BLEND_RESERVED_BITS);
|
let pass = key.intersection(MeshPipelineKey::BLEND_RESERVED_BITS);
|
||||||
|
let mut is_opaque = false;
|
||||||
if pass == MeshPipelineKey::BLEND_ALPHA {
|
if pass == MeshPipelineKey::BLEND_ALPHA {
|
||||||
label = "alpha_blend_mesh_pipeline".into();
|
label = "alpha_blend_mesh_pipeline".into();
|
||||||
blend = Some(BlendState::ALPHA_BLENDING);
|
blend = Some(BlendState::ALPHA_BLENDING);
|
||||||
@ -783,6 +780,11 @@ impl SpecializedMeshPipeline for MeshPipeline {
|
|||||||
// the current fragment value in the output and the depth is written to the
|
// the current fragment value in the output and the depth is written to the
|
||||||
// depth buffer
|
// depth buffer
|
||||||
depth_write_enabled = true;
|
depth_write_enabled = true;
|
||||||
|
is_opaque = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if key.contains(MeshPipelineKey::NORMAL_PREPASS) && key.msaa_samples() == 1 && is_opaque {
|
||||||
|
shader_defs.push("LOAD_PREPASS_NORMALS".into());
|
||||||
}
|
}
|
||||||
|
|
||||||
if key.contains(MeshPipelineKey::TONEMAP_IN_SHADER) {
|
if key.contains(MeshPipelineKey::TONEMAP_IN_SHADER) {
|
||||||
|
|||||||
@ -109,18 +109,17 @@ fn fragment(in: FragmentInput) -> @location(0) vec4<f32> {
|
|||||||
pbr_input.frag_coord = in.frag_coord;
|
pbr_input.frag_coord = in.frag_coord;
|
||||||
pbr_input.world_position = in.world_position;
|
pbr_input.world_position = in.world_position;
|
||||||
|
|
||||||
#ifdef LOAD_PREPASS_NORMALS
|
|
||||||
pbr_input.world_normal = prepass_normal(in.frag_coord, 0u);
|
|
||||||
#else // LOAD_PREPASS_NORMALS
|
|
||||||
pbr_input.world_normal = prepare_world_normal(
|
pbr_input.world_normal = prepare_world_normal(
|
||||||
in.world_normal,
|
in.world_normal,
|
||||||
(material.flags & STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT) != 0u,
|
(material.flags & STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT) != 0u,
|
||||||
in.is_front,
|
in.is_front,
|
||||||
);
|
);
|
||||||
#endif // LOAD_PREPASS_NORMALS
|
|
||||||
|
|
||||||
pbr_input.is_orthographic = is_orthographic;
|
pbr_input.is_orthographic = is_orthographic;
|
||||||
|
|
||||||
|
#ifdef LOAD_PREPASS_NORMALS
|
||||||
|
pbr_input.N = prepass_normal(in.frag_coord, 0u);
|
||||||
|
#else
|
||||||
pbr_input.N = apply_normal_mapping(
|
pbr_input.N = apply_normal_mapping(
|
||||||
material.flags,
|
material.flags,
|
||||||
pbr_input.world_normal,
|
pbr_input.world_normal,
|
||||||
@ -133,6 +132,8 @@ fn fragment(in: FragmentInput) -> @location(0) vec4<f32> {
|
|||||||
uv,
|
uv,
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
#endif
|
||||||
|
|
||||||
pbr_input.V = V;
|
pbr_input.V = V;
|
||||||
pbr_input.occlusion = occlusion;
|
pbr_input.occlusion = occlusion;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user