...
 
Commits (2)
    https://gitcode.net/cpp/LearnOpenGL/-/commit/ea40b886f5a272d277108471bbc4f8c153416d89 Fixed normal calculation in PBR shaders 2023-03-18T14:18:49+01:00 arby arbocz.marton@gmail.com https://gitcode.net/cpp/LearnOpenGL/-/commit/1257b69ebc878d1a2e18f5fae604582a7d34f03d Merge pull request #348 from arbmarton/fix_pbr_normals 2023-03-27T11:38:36+02:00 Joey de Vries JoeyDeVries@users.noreply.github.com Fixed normal calculation in PBR shaders
...@@ -10,12 +10,13 @@ out vec3 Normal; ...@@ -10,12 +10,13 @@ out vec3 Normal;
uniform mat4 projection; uniform mat4 projection;
uniform mat4 view; uniform mat4 view;
uniform mat4 model; uniform mat4 model;
uniform mat3 normalMatrix;
void main() void main()
{ {
TexCoords = aTexCoords; TexCoords = aTexCoords;
WorldPos = vec3(model * vec4(aPos, 1.0)); WorldPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(model) * aNormal; Normal = normalMatrix * aNormal;
gl_Position = projection * view * vec4(WorldPos, 1.0); gl_Position = projection * view * vec4(WorldPos, 1.0);
} }
\ No newline at end of file
...@@ -151,6 +151,7 @@ int main() ...@@ -151,6 +151,7 @@ int main()
0.0f 0.0f
)); ));
shader.setMat4("model", model); shader.setMat4("model", model);
shader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
} }
...@@ -169,6 +170,7 @@ int main() ...@@ -169,6 +170,7 @@ int main()
model = glm::translate(model, newPos); model = glm::translate(model, newPos);
model = glm::scale(model, glm::vec3(0.5f)); model = glm::scale(model, glm::vec3(0.5f));
shader.setMat4("model", model); shader.setMat4("model", model);
shader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
......
...@@ -10,12 +10,13 @@ out vec3 Normal; ...@@ -10,12 +10,13 @@ out vec3 Normal;
uniform mat4 projection; uniform mat4 projection;
uniform mat4 view; uniform mat4 view;
uniform mat4 model; uniform mat4 model;
uniform mat3 normalMatrix;
void main() void main()
{ {
TexCoords = aTexCoords; TexCoords = aTexCoords;
WorldPos = vec3(model * vec4(aPos, 1.0)); WorldPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(model) * aNormal; Normal = normalMatrix * aNormal;
gl_Position = projection * view * vec4(WorldPos, 1.0); gl_Position = projection * view * vec4(WorldPos, 1.0);
} }
\ No newline at end of file
...@@ -162,6 +162,7 @@ int main() ...@@ -162,6 +162,7 @@ int main()
0.0f 0.0f
)); ));
shader.setMat4("model", model); shader.setMat4("model", model);
shader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
} }
...@@ -180,6 +181,7 @@ int main() ...@@ -180,6 +181,7 @@ int main()
model = glm::translate(model, newPos); model = glm::translate(model, newPos);
model = glm::scale(model, glm::vec3(0.5f)); model = glm::scale(model, glm::vec3(0.5f));
shader.setMat4("model", model); shader.setMat4("model", model);
shader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
......
...@@ -10,12 +10,13 @@ out vec3 Normal; ...@@ -10,12 +10,13 @@ out vec3 Normal;
uniform mat4 projection; uniform mat4 projection;
uniform mat4 view; uniform mat4 view;
uniform mat4 model; uniform mat4 model;
uniform mat3 normalMatrix;
void main() void main()
{ {
TexCoords = aTexCoords; TexCoords = aTexCoords;
WorldPos = vec3(model * vec4(aPos, 1.0)); WorldPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(model) * aNormal; Normal = normalMatrix * aNormal;
gl_Position = projection * view * vec4(WorldPos, 1.0); gl_Position = projection * view * vec4(WorldPos, 1.0);
} }
\ No newline at end of file
...@@ -252,6 +252,7 @@ int main() ...@@ -252,6 +252,7 @@ int main()
-2.0f -2.0f
)); ));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
} }
...@@ -271,6 +272,7 @@ int main() ...@@ -271,6 +272,7 @@ int main()
model = glm::translate(model, newPos); model = glm::translate(model, newPos);
model = glm::scale(model, glm::vec3(0.5f)); model = glm::scale(model, glm::vec3(0.5f));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
......
...@@ -10,12 +10,13 @@ out vec3 Normal; ...@@ -10,12 +10,13 @@ out vec3 Normal;
uniform mat4 projection; uniform mat4 projection;
uniform mat4 view; uniform mat4 view;
uniform mat4 model; uniform mat4 model;
uniform mat3 normalMatrix;
void main() void main()
{ {
TexCoords = aTexCoords; TexCoords = aTexCoords;
WorldPos = vec3(model * vec4(aPos, 1.0)); WorldPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(model) * aNormal; Normal = normalMatrix * aNormal;
gl_Position = projection * view * vec4(WorldPos, 1.0); gl_Position = projection * view * vec4(WorldPos, 1.0);
} }
\ No newline at end of file
...@@ -297,6 +297,7 @@ int main() ...@@ -297,6 +297,7 @@ int main()
-2.0f -2.0f
)); ));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
} }
...@@ -316,6 +317,7 @@ int main() ...@@ -316,6 +317,7 @@ int main()
model = glm::translate(model, newPos); model = glm::translate(model, newPos);
model = glm::scale(model, glm::vec3(0.5f)); model = glm::scale(model, glm::vec3(0.5f));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
......
...@@ -10,12 +10,13 @@ out vec3 Normal; ...@@ -10,12 +10,13 @@ out vec3 Normal;
uniform mat4 projection; uniform mat4 projection;
uniform mat4 view; uniform mat4 view;
uniform mat4 model; uniform mat4 model;
uniform mat3 normalMatrix;
void main() void main()
{ {
TexCoords = aTexCoords; TexCoords = aTexCoords;
WorldPos = vec3(model * vec4(aPos, 1.0)); WorldPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(model) * aNormal; Normal = normalMatrix * aNormal;
gl_Position = projection * view * vec4(WorldPos, 1.0); gl_Position = projection * view * vec4(WorldPos, 1.0);
} }
\ No newline at end of file
...@@ -389,6 +389,7 @@ int main() ...@@ -389,6 +389,7 @@ int main()
-2.0f -2.0f
)); ));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
} }
...@@ -408,6 +409,7 @@ int main() ...@@ -408,6 +409,7 @@ int main()
model = glm::translate(model, newPos); model = glm::translate(model, newPos);
model = glm::scale(model, glm::vec3(0.5f)); model = glm::scale(model, glm::vec3(0.5f));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
......
...@@ -10,12 +10,13 @@ out vec3 Normal; ...@@ -10,12 +10,13 @@ out vec3 Normal;
uniform mat4 projection; uniform mat4 projection;
uniform mat4 view; uniform mat4 view;
uniform mat4 model; uniform mat4 model;
uniform mat3 normalMatrix;
void main() void main()
{ {
TexCoords = aTexCoords; TexCoords = aTexCoords;
WorldPos = vec3(model * vec4(aPos, 1.0)); WorldPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(model) * aNormal; Normal = normalMatrix * aNormal;
gl_Position = projection * view * vec4(WorldPos, 1.0); gl_Position = projection * view * vec4(WorldPos, 1.0);
} }
\ No newline at end of file
...@@ -424,6 +424,7 @@ int main() ...@@ -424,6 +424,7 @@ int main()
model = glm::mat4(1.0f); model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(-5.0, 0.0, 2.0)); model = glm::translate(model, glm::vec3(-5.0, 0.0, 2.0));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
// gold // gold
...@@ -441,6 +442,7 @@ int main() ...@@ -441,6 +442,7 @@ int main()
model = glm::mat4(1.0f); model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(-3.0, 0.0, 2.0)); model = glm::translate(model, glm::vec3(-3.0, 0.0, 2.0));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
// grass // grass
...@@ -458,6 +460,7 @@ int main() ...@@ -458,6 +460,7 @@ int main()
model = glm::mat4(1.0f); model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(-1.0, 0.0, 2.0)); model = glm::translate(model, glm::vec3(-1.0, 0.0, 2.0));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
// plastic // plastic
...@@ -475,6 +478,7 @@ int main() ...@@ -475,6 +478,7 @@ int main()
model = glm::mat4(1.0f); model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(1.0, 0.0, 2.0)); model = glm::translate(model, glm::vec3(1.0, 0.0, 2.0));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
// wall // wall
...@@ -492,6 +496,7 @@ int main() ...@@ -492,6 +496,7 @@ int main()
model = glm::mat4(1.0f); model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(3.0, 0.0, 2.0)); model = glm::translate(model, glm::vec3(3.0, 0.0, 2.0));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
// render light source (simply re-render sphere at light positions) // render light source (simply re-render sphere at light positions)
...@@ -508,6 +513,7 @@ int main() ...@@ -508,6 +513,7 @@ int main()
model = glm::translate(model, newPos); model = glm::translate(model, newPos);
model = glm::scale(model, glm::vec3(0.5f)); model = glm::scale(model, glm::vec3(0.5f));
pbrShader.setMat4("model", model); pbrShader.setMat4("model", model);
pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model))));
renderSphere(); renderSphere();
} }
......