From 4494e7592d881156866c9934bec6528459b659e1 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Sat, 10 May 2014 16:01:36 +0200 Subject: [PATCH] How NOT to do normal maps --- src/GameWorld.cpp | 10 ++--- src/Model.cpp | 4 +- src/Renderer.cpp | 38 ++++++++++++++++--- src/Renderer.h | 1 + src/Shaders/Fragment-Normal.glsl | 32 ++++++++++++++++ src/Shaders/Fragment.glsl | 5 +++ vs11/Returngeance/Returngeance.vcxproj | 1 + .../Returngeance/Returngeance.vcxproj.filters | 3 ++ 8 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 src/Shaders/Fragment-Normal.glsl diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 6e78089..879380f 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -69,7 +69,7 @@ void GameWorld::Initialize() auto transform = AddComponent(chassis, "Transform"); transform->Position = glm::vec3(0, -0.6577f, 0); auto model = AddComponent(chassis, "Model"); - model->ModelFile = "Models/JeepV2/Chassi/chassi.OBJ"; + model->ModelFile = "Models/Jeep/Chassi/chassi.OBJ"; } @@ -79,7 +79,7 @@ void GameWorld::Initialize() transform->Position = glm::vec3(1.4f, 0.5546f - 0.6577f - 0.2, -0.9242f); transform->Scale = glm::vec3(1.0f); auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/JeepV2/WheelFront/wheelFront.obj"; + model->ModelFile = "Models/Jeep/WheelFront/wheelFront.obj"; auto Wheel = AddComponent(wheel, "Wheel"); Wheel->Hardpoint = transform->Position + glm::vec3(0.f, 1.f, 0.f); Wheel->AxleID = 0; @@ -99,7 +99,7 @@ void GameWorld::Initialize() transform->Scale = glm::vec3(1.0f); transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 0, 1)); auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/JeepV2/WheelFront/wheelFront.obj"; + model->ModelFile = "Models/Jeep/WheelFront/wheelFront.obj"; auto Wheel = AddComponent(wheel, "Wheel"); Wheel->Hardpoint = transform->Position + glm::vec3(0.f, 1.f, 0.f); Wheel->AxleID = 0; @@ -117,7 +117,7 @@ void GameWorld::Initialize() auto transform = AddComponent(wheel, "Transform"); transform->Position = glm::vec3(0.2726f, 0.2805f - 0.6577f, 1.9307f); auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/JeepV2/WheelBack/wheelBack.obj"; + model->ModelFile = "Models/Jeep/WheelBack/wheelBack.obj"; auto Wheel = AddComponent(wheel, "Wheel"); Wheel->Hardpoint = transform->Position + glm::vec3(0.f, 1.f, 0.f); Wheel->AxleID = 1; @@ -135,7 +135,7 @@ void GameWorld::Initialize() transform->Position = glm::vec3(-0.2726f, 0.2805f - 0.6577f, 1.9307f); transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 0, 1)); auto model = AddComponent(wheel, "Model"); - model->ModelFile = "Models/JeepV2/WheelBack/wheelBack.obj"; + model->ModelFile = "Models/Jeep/WheelBack/wheelBack.obj"; auto Wheel = AddComponent(wheel, "Wheel"); Wheel->Hardpoint = transform->Position + glm::vec3(0.f, 1.f, 0.f); Wheel->AxleID = 1; diff --git a/src/Model.cpp b/src/Model.cpp index 547e940..71c5349 100755 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -20,8 +20,10 @@ Model::Model(OBJ &obj, ResourceManager* rm) // Load texture auto texture = std::shared_ptr(rm->Load("Texture", currentMaterial->DiffuseTexture.FileName)); - // TODO: Load normal map + // Load normal map std::shared_ptr normalMap = nullptr; + if (!currentMaterial->NormalMap.FileName.empty()) + normalMap = std::shared_ptr(rm->Load("Texture", currentMaterial->NormalMap.FileName)); // Load specular map std::shared_ptr specularMap = nullptr; if (!currentMaterial->SpecularMap.FileName.empty()) diff --git a/src/Renderer.cpp b/src/Renderer.cpp index 27820a9..ff97fe9 100755 --- a/src/Renderer.cpp +++ b/src/Renderer.cpp @@ -118,6 +118,14 @@ void Renderer::LoadContent() glBindFragDataLocation(m_FirstPassProgram.GetHandle(), 2, "frag_Normal"); m_FirstPassProgram.Link(); + m_FirstPassNormalProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Vertex.glsl"))); + m_FirstPassNormalProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Fragment-Normal.glsl"))); + m_FirstPassNormalProgram.Compile(); + glBindFragDataLocation(m_FirstPassNormalProgram.GetHandle(), 0, "frag_Diffuse"); + glBindFragDataLocation(m_FirstPassNormalProgram.GetHandle(), 1, "frag_Position"); + glBindFragDataLocation(m_FirstPassNormalProgram.GetHandle(), 2, "frag_Normal"); + m_FirstPassNormalProgram.Link(); + m_SecondPassProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Vertex2.glsl"))); m_SecondPassProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Fragment2.glsl"))); m_SecondPassProgram.Compile(); @@ -694,7 +702,6 @@ void Renderer::DrawFBO() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Execute the first render stage which will fill out the internal buffers with data(??) - m_FirstPassProgram.Bind(); GLenum windowBuffOpaque[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; glDrawBuffers(3, windowBuffOpaque); @@ -823,15 +830,36 @@ void Renderer::DrawFBOScene() continue; MVP = cameraMatrix * modelMatrix; - glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); - glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); glBindVertexArray(model->VAO); for (auto texGroup : model->TextureGroups) { + if (texGroup.NormalMap) + { + m_FirstPassNormalProgram.Bind(); + + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassNormalProgram.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassNormalProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassNormalProgram.GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassNormalProgram.GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); + } + else + { + m_FirstPassProgram.Bind(); + + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(m_FirstPassProgram.GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); + } + + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, *texGroup.Texture); + if (texGroup.NormalMap) + { + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, *texGroup.NormalMap); + } glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1); } } diff --git a/src/Renderer.h b/src/Renderer.h index 6754701..066a7ce 100755 --- a/src/Renderer.h +++ b/src/Renderer.h @@ -111,6 +111,7 @@ private: ShaderProgram m_ShaderProgram; ShaderProgram m_FirstPassProgram; + ShaderProgram m_FirstPassNormalProgram; ShaderProgram m_SecondPassProgram; ShaderProgram m_SecondPassProgram_Debug; ShaderProgram m_FinalPassProgram; diff --git a/src/Shaders/Fragment-Normal.glsl b/src/Shaders/Fragment-Normal.glsl new file mode 100644 index 0000000..ee6964f --- /dev/null +++ b/src/Shaders/Fragment-Normal.glsl @@ -0,0 +1,32 @@ +#version 430 + +uniform mat4 MVP; +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; + +layout (binding=0) uniform sampler2D DiffuseTexture; +layout (binding=1) uniform sampler2D NormalMap; + +in VertexData +{ + vec3 Position; + vec3 Normal; + vec2 TextureCoord; +} Input; + +out vec4 frag_Diffuse; +out vec4 frag_Position; +out vec4 frag_Normal; + +void main() +{ + // Diffuse Texture + frag_Diffuse = texture2D(DiffuseTexture, Input.TextureCoord); + + // G-buffer Position + frag_Position = vec4(Input.Position.xyz, 0.0); + + // G-buffer Normal + frag_Normal = vec4(normalize(vec3(Input.Normal * (texture2D(NormalMap, Input.TextureCoord)).xyz)), 0.0); +} \ No newline at end of file diff --git a/src/Shaders/Fragment.glsl b/src/Shaders/Fragment.glsl index 64d4a59..2361c14 100755 --- a/src/Shaders/Fragment.glsl +++ b/src/Shaders/Fragment.glsl @@ -1,5 +1,10 @@ #version 430 +uniform mat4 MVP; +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; + layout (binding=0) uniform sampler2D DiffuseTexture; in VertexData diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index b079859..9b528f6 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -169,6 +169,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index e416604..34cc8ab 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -277,5 +277,8 @@ Shaders + + Shaders + \ No newline at end of file