diff --git a/crates/bevy_pbr/src/render_graph/pbr_pipeline/pbr.vert b/crates/bevy_pbr/src/render_graph/pbr_pipeline/pbr.vert index 533a163a1c903..3a8471805b514 100644 --- a/crates/bevy_pbr/src/render_graph/pbr_pipeline/pbr.vert +++ b/crates/bevy_pbr/src/render_graph/pbr_pipeline/pbr.vert @@ -24,10 +24,24 @@ layout(set = 2, binding = 0) uniform Transform { mat4 Model; }; +// inverts the scaling, but keeps the rotation of a mat3 +// ! assumes that m is an orthogonal matrix +mat3 to_normal_matrix(mat3 m) { + vec3 fac = 1.0 / vec3( + dot(m[0], m[0]), + dot(m[1], m[1]), + dot(m[2], m[2]) + ); + m[0] *= fac.x; + m[1] *= fac.y; + m[2] *= fac.z; + return m; +} + void main() { vec4 world_position = Model * vec4(Vertex_Position, 1.0); v_WorldPosition = world_position.xyz; - v_WorldNormal = mat3(Model) * Vertex_Normal; + v_WorldNormal = to_normal_matrix(mat3(Model)) * Vertex_Normal; v_Uv = Vertex_Uv; #ifdef STANDARDMATERIAL_NORMAL_MAP v_WorldTangent = vec4(mat3(Model) * Vertex_Tangent.xyz, Vertex_Tangent.w);