From ea40b886f5a272d277108471bbc4f8c153416d89 Mon Sep 17 00:00:00 2001 From: arby Date: Sat, 18 Mar 2023 14:18:49 +0100 Subject: [PATCH] Fixed normal calculation in PBR shaders --- src/6.pbr/1.1.lighting/1.1.pbr.vs | 3 ++- src/6.pbr/1.1.lighting/lighting.cpp | 2 ++ src/6.pbr/1.2.lighting_textured/1.2.pbr.vs | 3 ++- src/6.pbr/1.2.lighting_textured/lighting_textured.cpp | 2 ++ src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.vs | 3 ++- .../ibl_irradiance_conversion.cpp | 2 ++ src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.vs | 3 ++- src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp | 2 ++ src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.vs | 3 ++- src/6.pbr/2.2.1.ibl_specular/ibl_specular.cpp | 2 ++ src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.vs | 3 ++- .../2.2.2.ibl_specular_textured/ibl_specular_textured.cpp | 6 ++++++ 12 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/6.pbr/1.1.lighting/1.1.pbr.vs b/src/6.pbr/1.1.lighting/1.1.pbr.vs index bdb37da..16321b7 100644 --- a/src/6.pbr/1.1.lighting/1.1.pbr.vs +++ b/src/6.pbr/1.1.lighting/1.1.pbr.vs @@ -10,12 +10,13 @@ out vec3 Normal; uniform mat4 projection; uniform mat4 view; uniform mat4 model; +uniform mat3 normalMatrix; void main() { TexCoords = aTexCoords; WorldPos = vec3(model * vec4(aPos, 1.0)); - Normal = mat3(model) * aNormal; + Normal = normalMatrix * aNormal; gl_Position = projection * view * vec4(WorldPos, 1.0); } \ No newline at end of file diff --git a/src/6.pbr/1.1.lighting/lighting.cpp b/src/6.pbr/1.1.lighting/lighting.cpp index e24f8c9..cd2a0da 100644 --- a/src/6.pbr/1.1.lighting/lighting.cpp +++ b/src/6.pbr/1.1.lighting/lighting.cpp @@ -151,6 +151,7 @@ int main() 0.0f )); shader.setMat4("model", model); + shader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } } @@ -169,6 +170,7 @@ int main() model = glm::translate(model, newPos); model = glm::scale(model, glm::vec3(0.5f)); shader.setMat4("model", model); + shader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } diff --git a/src/6.pbr/1.2.lighting_textured/1.2.pbr.vs b/src/6.pbr/1.2.lighting_textured/1.2.pbr.vs index bdb37da..16321b7 100644 --- a/src/6.pbr/1.2.lighting_textured/1.2.pbr.vs +++ b/src/6.pbr/1.2.lighting_textured/1.2.pbr.vs @@ -10,12 +10,13 @@ out vec3 Normal; uniform mat4 projection; uniform mat4 view; uniform mat4 model; +uniform mat3 normalMatrix; void main() { TexCoords = aTexCoords; WorldPos = vec3(model * vec4(aPos, 1.0)); - Normal = mat3(model) * aNormal; + Normal = normalMatrix * aNormal; gl_Position = projection * view * vec4(WorldPos, 1.0); } \ No newline at end of file diff --git a/src/6.pbr/1.2.lighting_textured/lighting_textured.cpp b/src/6.pbr/1.2.lighting_textured/lighting_textured.cpp index b64b00f..2bd43b9 100644 --- a/src/6.pbr/1.2.lighting_textured/lighting_textured.cpp +++ b/src/6.pbr/1.2.lighting_textured/lighting_textured.cpp @@ -162,6 +162,7 @@ int main() 0.0f )); shader.setMat4("model", model); + shader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } } @@ -180,6 +181,7 @@ int main() model = glm::translate(model, newPos); model = glm::scale(model, glm::vec3(0.5f)); shader.setMat4("model", model); + shader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } diff --git a/src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.vs b/src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.vs index bdb37da..16321b7 100644 --- a/src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.vs +++ b/src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.vs @@ -10,12 +10,13 @@ out vec3 Normal; uniform mat4 projection; uniform mat4 view; uniform mat4 model; +uniform mat3 normalMatrix; void main() { TexCoords = aTexCoords; WorldPos = vec3(model * vec4(aPos, 1.0)); - Normal = mat3(model) * aNormal; + Normal = normalMatrix * aNormal; gl_Position = projection * view * vec4(WorldPos, 1.0); } \ No newline at end of file diff --git a/src/6.pbr/2.1.1.ibl_irradiance_conversion/ibl_irradiance_conversion.cpp b/src/6.pbr/2.1.1.ibl_irradiance_conversion/ibl_irradiance_conversion.cpp index de2ce95..6f6a2d4 100644 --- a/src/6.pbr/2.1.1.ibl_irradiance_conversion/ibl_irradiance_conversion.cpp +++ b/src/6.pbr/2.1.1.ibl_irradiance_conversion/ibl_irradiance_conversion.cpp @@ -252,6 +252,7 @@ int main() -2.0f )); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } } @@ -271,6 +272,7 @@ int main() model = glm::translate(model, newPos); model = glm::scale(model, glm::vec3(0.5f)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } diff --git a/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.vs b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.vs index bdb37da..16321b7 100644 --- a/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.vs +++ b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.vs @@ -10,12 +10,13 @@ out vec3 Normal; uniform mat4 projection; uniform mat4 view; uniform mat4 model; +uniform mat3 normalMatrix; void main() { TexCoords = aTexCoords; WorldPos = vec3(model * vec4(aPos, 1.0)); - Normal = mat3(model) * aNormal; + Normal = normalMatrix * aNormal; gl_Position = projection * view * vec4(WorldPos, 1.0); } \ No newline at end of file diff --git a/src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp b/src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp index 38cf5a4..853453f 100644 --- a/src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp +++ b/src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp @@ -297,6 +297,7 @@ int main() -2.0f )); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } } @@ -316,6 +317,7 @@ int main() model = glm::translate(model, newPos); model = glm::scale(model, glm::vec3(0.5f)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } diff --git a/src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.vs b/src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.vs index bdb37da..16321b7 100644 --- a/src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.vs +++ b/src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.vs @@ -10,12 +10,13 @@ out vec3 Normal; uniform mat4 projection; uniform mat4 view; uniform mat4 model; +uniform mat3 normalMatrix; void main() { TexCoords = aTexCoords; WorldPos = vec3(model * vec4(aPos, 1.0)); - Normal = mat3(model) * aNormal; + Normal = normalMatrix * aNormal; gl_Position = projection * view * vec4(WorldPos, 1.0); } \ No newline at end of file diff --git a/src/6.pbr/2.2.1.ibl_specular/ibl_specular.cpp b/src/6.pbr/2.2.1.ibl_specular/ibl_specular.cpp index 1e5f62d..42b3e4b 100644 --- a/src/6.pbr/2.2.1.ibl_specular/ibl_specular.cpp +++ b/src/6.pbr/2.2.1.ibl_specular/ibl_specular.cpp @@ -389,6 +389,7 @@ int main() -2.0f )); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } } @@ -408,6 +409,7 @@ int main() model = glm::translate(model, newPos); model = glm::scale(model, glm::vec3(0.5f)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); } diff --git a/src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.vs b/src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.vs index bdb37da..16321b7 100644 --- a/src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.vs +++ b/src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.vs @@ -10,12 +10,13 @@ out vec3 Normal; uniform mat4 projection; uniform mat4 view; uniform mat4 model; +uniform mat3 normalMatrix; void main() { TexCoords = aTexCoords; WorldPos = vec3(model * vec4(aPos, 1.0)); - Normal = mat3(model) * aNormal; + Normal = normalMatrix * aNormal; gl_Position = projection * view * vec4(WorldPos, 1.0); } \ No newline at end of file diff --git a/src/6.pbr/2.2.2.ibl_specular_textured/ibl_specular_textured.cpp b/src/6.pbr/2.2.2.ibl_specular_textured/ibl_specular_textured.cpp index bdd36d2..8f64b32 100644 --- a/src/6.pbr/2.2.2.ibl_specular_textured/ibl_specular_textured.cpp +++ b/src/6.pbr/2.2.2.ibl_specular_textured/ibl_specular_textured.cpp @@ -424,6 +424,7 @@ int main() model = glm::mat4(1.0f); model = glm::translate(model, glm::vec3(-5.0, 0.0, 2.0)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); // gold @@ -441,6 +442,7 @@ int main() model = glm::mat4(1.0f); model = glm::translate(model, glm::vec3(-3.0, 0.0, 2.0)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); // grass @@ -458,6 +460,7 @@ int main() model = glm::mat4(1.0f); model = glm::translate(model, glm::vec3(-1.0, 0.0, 2.0)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); // plastic @@ -475,6 +478,7 @@ int main() model = glm::mat4(1.0f); model = glm::translate(model, glm::vec3(1.0, 0.0, 2.0)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); // wall @@ -492,6 +496,7 @@ int main() model = glm::mat4(1.0f); model = glm::translate(model, glm::vec3(3.0, 0.0, 2.0)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); // render light source (simply re-render sphere at light positions) @@ -508,6 +513,7 @@ int main() model = glm::translate(model, newPos); model = glm::scale(model, glm::vec3(0.5f)); pbrShader.setMat4("model", model); + pbrShader.setMat3("normalMatrix", glm::transpose(glm::inverse(glm::mat3(model)))); renderSphere(); }