Let me share with you my code that I wrote by myself, I share it to help you how to fix the bug.

Code:

matrixScale(float3 v){ return matrix(v.x, 0, 0, 0, 0, v.y, 0, 0, 0, 0, v.z, 0, 0, 0, 0, 1 ); } void Obj::CalculateTransformMatrices() { if (m_isTransformCalculated == false) { m_isTransformCalculated = true; // R = RotateX * RotateY * RotateZ matrix R = IdentityMatrix(); R = mul(R, Rotate(float3(1, 0, 0), m_rotation.x)); R = mul(R, Rotate(float3(0, 1, 0), m_rotation.y)); R = mul(R, Rotate(float3(0, 0, 1), m_rotation.z)); // M = Scale * R * Translate matrix M = IdentityMatrix(); M = mul(M, Scale(m_scale)); M = mul(M, R); M = mul(M, Translate(m_location)); m_transform = M; // M^-1 m_invertTransform = M.Invert(); // Transform for normals: Scale^-1 * R float3x3 S_1 = (float3x3)Scale(float3( 1.0f / m_scale.x, 1.0f / m_scale.y, 1.0f / m_scale.z )); m_transformForNormals= mul(S_1, (float3x3)R); } }

Code:

```
void main(ShaderVertex input, out PS_Input output)
{
output.position = mul(float4(input.position, 1), g_worldViewProjectionMatrix);
output.normal = mul(input.normal, (float3x3)
```**g_transformForNormals**);
output.texCoord = input.texCoord;
}

The code I shared above is too complicate because I use a matrix, so here is the very easy method:

## Leave a comment: