diff --git a/include/Engine/Rendering/ModelJob.h b/include/Engine/Rendering/ModelJob.h index 05a4e5b0..22a4614d 100644 --- a/include/Engine/Rendering/ModelJob.h +++ b/include/Engine/Rendering/ModelJob.h @@ -111,7 +111,7 @@ struct ModelJob : RenderJob Color = modelComponent["Color"]; GlowIntensity = ((double)modelComponent["GlowIntensity"]); Entity = modelComponent.EntityID; - glm::vec3 abspos = Transform::AbsolutePosition(world, modelComponent.EntityID); + glm::vec3 abspos = glm::vec3(matrix[3][0], matrix[3][1], matrix[3][2]); glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1)); Depth = worldpos.z; World = world; @@ -164,7 +164,9 @@ struct ModelJob : RenderJob bool IsShielded; void CalculateHash() override { - Hash = ShaderID << 20 + ModelID << 10 + TextureID; + Hash = TextureID; + Hash += ModelID << 10; + Hash += ShaderID << 20; } }; diff --git a/include/Engine/Rendering/RenderJob.h b/include/Engine/Rendering/RenderJob.h index bcffc4a5..6fd8963e 100644 --- a/include/Engine/Rendering/RenderJob.h +++ b/include/Engine/Rendering/RenderJob.h @@ -16,16 +16,15 @@ struct RenderJob public: float Depth; + bool operator<(const RenderJob& rhs) + { + return this->Hash < rhs.Hash; + } + protected: uint64_t Hash; virtual void CalculateHash() = 0; - - bool operator<(const RenderJob& rhs) - { - return this->Hash < rhs.Hash; - } - }; #endif \ No newline at end of file diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index b76ba3e6..91d362c0 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -118,7 +118,12 @@ LightResult CalcDirectionalLightSource(vec4 direction, vec4 color, float intensi return result; } -#include "Shaders/Util/CommonUniforms.glsl" +vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textureCoordinate, sampler2D normalMap) +{ + mat3 TBN = mat3(tangent, bitangent, normal); + vec3 NormalMap = texture(normalMap, textureCoordinate).xyz * 2.0 - vec3(1.0); + return vec4(TBN * normalize(NormalMap), 0.0); +} void main() { diff --git a/resources/Shaders/Picking.vert.glsl b/resources/Shaders/Picking.vert.glsl index a10121cf..00013383 100644 --- a/resources/Shaders/Picking.vert.glsl +++ b/resources/Shaders/Picking.vert.glsl @@ -1,6 +1,5 @@ #version 430 -#include "StandarUniform.glsl" -layout(location = PVM_UNIFORM_LOCATION) uniform mat4 PVM; +uniform mat4 PVM; layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; diff --git a/resources/Shaders/PickingSkinned.vert.glsl b/resources/Shaders/PickingSkinned.vert.glsl index 98a5b394..4d72fa49 100644 --- a/resources/Shaders/PickingSkinned.vert.glsl +++ b/resources/Shaders/PickingSkinned.vert.glsl @@ -1,6 +1,5 @@ #version 430 -#include "StandarUniform.glsl" -layout(location = PVM_UNIFORM_LOCATION) uniform mat4 PVM; +uniform mat4 PVM; uniform mat4 Bones[100]; layout(location = 0) in vec3 Position; diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index b364688a..0b33d166 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -343,6 +343,8 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& GLuint explosionSkinnedHandle = m_ExplosionEffectSkinnedProgram->GetHandle(); GLuint explosionSplatMapSkinnedHandle = m_ExplosionEffectSplatMapSkinnedProgram->GetHandle(); GLuint forwardSplatMapSkinnedHandle = m_ForwardPlusSplatMapSkinnedProgram->GetHandle(); + GLuint lastShader = 0; + unsigned int lastModel = 0; glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO()); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO()); @@ -359,9 +361,17 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& case RawModel::MaterialType::SingleTextures: { if (explosionEffectJob->Model->IsSkinned()) { - - m_ExplosionEffectSkinnedProgram->Bind(); - GLERROR("Bind ExplosionEffectSkinned program"); + if (lastShader != m_ExplosionEffectSkinnedProgram->GetHandle()) { + m_ExplosionEffectSkinnedProgram->Bind(); + lastShader = m_ExplosionEffectSkinnedProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSkinned program"); + glUniform1i(glGetUniformLocation(explosionSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSkinned Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSkinnedHandle, explosionEffectJob, scene); //bind textures @@ -381,8 +391,17 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& } else { - m_ExplosionEffectProgram->Bind(); - GLERROR("Bind ExplosionEffect program"); + if (lastShader != m_ExplosionEffectProgram->GetHandle()) { + m_ExplosionEffectProgram->Bind(); + lastShader = m_ExplosionEffectProgram->GetHandle(); + GLERROR("Bind ExplosionEffect program"); + glUniform1i(glGetUniformLocation(explosionHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffect Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionHandle, explosionEffectJob, scene); //bind textures @@ -396,8 +415,17 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& case RawModel::MaterialType::SplatMapping: { if (explosionEffectJob->Model->IsSkinned()) { - m_ExplosionEffectSplatMapSkinnedProgram->Bind(); - GLERROR("Bind ExplosionEffectSplatMapSkinned program"); + if (lastShader != m_ExplosionEffectSplatMapSkinnedProgram->GetHandle()) { + m_ExplosionEffectSplatMapSkinnedProgram->Bind(); + lastShader = m_ExplosionEffectSplatMapSkinnedProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSplatMapSkinned program"); + glUniform1i(glGetUniformLocation(explosionSplatMapSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSplatMapSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSplatMapSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSplatMapSkinned Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSplatMapSkinnedHandle, explosionEffectJob, scene); //bind textures @@ -413,9 +441,17 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& } else { - m_ExplosionEffectSplatMapProgram->Bind(); - GLERROR("Bind ExplosionEffectSplatMap program"); - //bind uniforms + if (lastShader != m_ExplosionEffectSplatMapProgram->GetHandle()) { + m_ExplosionEffectSplatMapProgram->Bind(); + lastShader = m_ExplosionEffectSplatMapProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSplatMap program"); + glUniform1i(glGetUniformLocation(explosionSplatMapHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSplatMapHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSplatMapHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSplatMap Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSplatMapHandle, explosionEffectJob, scene); //bind textures @@ -428,8 +464,11 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& glDisable(GL_CULL_FACE); //draw - glBindVertexArray(explosionEffectJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, explosionEffectJob->Model->ElementBuffer); + if (lastModel != explosionEffectJob->ModelID) { + glBindVertexArray(explosionEffectJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, explosionEffectJob->Model->ElementBuffer); + lastModel = explosionEffectJob->ModelID; + } glDrawElements(GL_TRIANGLES, explosionEffectJob->EndIndex - explosionEffectJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(explosionEffectJob->StartIndex*sizeof(unsigned int))); glEnable(GL_CULL_FACE); GLERROR("explosion effect end"); @@ -443,8 +482,17 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& case RawModel::MaterialType::SingleTextures: { if (modelJob->Model->IsSkinned()) { - m_ForwardPlusSkinnedProgram->Bind(); - GLERROR("Bind ForwardPlusSkinnedProgram"); + if (lastShader != m_ForwardPlusSkinnedProgram->GetHandle()) { + m_ForwardPlusSkinnedProgram->Bind(); + lastShader = m_ForwardPlusSkinnedProgram->GetHandle(); + GLERROR("Bind ForwardPlusSkinnedProgram program"); + glUniform1i(glGetUniformLocation(forwardSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ForwardPlusSkinnedProgram Uniforms"); + } //bind uniforms BindModelUniforms(forwardSkinnedHandle, modelJob, scene); //bind textures @@ -462,8 +510,17 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); } else { - m_ForwardPlusProgram->Bind(); - GLERROR("Bind ForwardPlusProgram"); + if (lastShader != m_ForwardPlusProgram->GetHandle()) { + m_ForwardPlusProgram->Bind(); + lastShader = m_ForwardPlusProgram->GetHandle(); + GLERROR("Bind ForwardPlusProgram program"); + glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ForwardPlusProgram Uniforms"); + } //bind uniforms BindModelUniforms(forwardHandle, modelJob, scene); //bind textures @@ -477,8 +534,17 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& case RawModel::MaterialType::SplatMapping: { if (modelJob->Model->IsSkinned()) { - m_ForwardPlusSplatMapSkinnedProgram->Bind(); - GLERROR("Bind SplatMap program"); + if (lastShader != m_ForwardPlusSplatMapSkinnedProgram->GetHandle()) { + m_ForwardPlusSplatMapSkinnedProgram->Bind(); + lastShader = m_ForwardPlusSplatMapSkinnedProgram->GetHandle(); + GLERROR("Bind SkinnedSplatMapProgram program"); + glUniform1i(glGetUniformLocation(forwardSplatMapSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSplatMapSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSplatMapSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind SkinnedSplatMapProgram Uniforms"); + } //bind uniforms BindModelUniforms(forwardSplatMapSkinnedHandle, modelJob, scene); //bind textures @@ -494,8 +560,17 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& } else { - m_ForwardPlusSplatMapProgram->Bind(); - GLERROR("Bind SplatMap program"); + if (lastShader != m_ForwardPlusSplatMapProgram->GetHandle()) { + m_ForwardPlusSplatMapProgram->Bind(); + lastShader = m_ForwardPlusSplatMapProgram->GetHandle(); + GLERROR("Bind SplatMap program"); + glUniform1i(glGetUniformLocation(forwardSplatMapHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSplatMapHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSplatMapHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind SplatMap Uniforms"); + } //bind uniforms BindModelUniforms(forwardSplatMapHandle, modelJob, scene); //bind textures @@ -506,8 +581,11 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& } } //draw - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + if (lastModel != modelJob->ModelID) { + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + lastModel = modelJob->ModelID; + } glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex*sizeof(unsigned int))); if (GLERROR("models end")) { continue; @@ -536,6 +614,8 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listGetHandle(); GLuint explosionSplatMapSkinnedShieldCheckHandle = m_ExplosionEffectSplatMapSkinnedShieldCheckProgram->GetHandle(); GLuint forwardSplatMapSkinnedShieldCheckHandle = m_ForwardPlusSplatMapSkinnedShieldCheckProgram->GetHandle(); + GLuint lastShader = 0; + unsigned int lastModel = 0; glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightCullingPass->LightSSBO()); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightCullingPass->LightGridSSBO()); @@ -556,9 +636,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->IsSkinned()) { - - m_ExplosionEffectSkinnedShieldCheckProgram->Bind(); - GLERROR("Bind ExplosionEffectSkinned program"); + if (lastShader != m_ExplosionEffectSkinnedShieldCheckProgram->GetHandle()) { + m_ExplosionEffectSkinnedShieldCheckProgram->Bind(); + lastShader = m_ExplosionEffectSkinnedShieldCheckProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSkinned program"); + glUniform1i(glGetUniformLocation(explosionSkinnedShieldCheckHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSkinnedShieldCheckHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSkinnedShieldCheckHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSkinnedShieldCheckHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSkinnedShieldCheckHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSkinned Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSkinnedShieldCheckHandle, explosionEffectJob, scene); //bind textures @@ -577,8 +665,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listBind(); - GLERROR("Bind ExplosionEffect program"); + if (lastShader != m_ExplosionEffectShieldCheckProgram->GetHandle()) { + m_ExplosionEffectShieldCheckProgram->Bind(); + lastShader = m_ExplosionEffectShieldCheckProgram->GetHandle(); + GLERROR("Bind ExplosionEffect program"); + glUniform1i(glGetUniformLocation(explosionShieldCheckHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionShieldCheckHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionShieldCheckHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionShieldCheckHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionShieldCheckHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffect Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionShieldCheckHandle, explosionEffectJob, scene); //bind textures @@ -593,8 +690,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->IsSkinned()) { - m_ExplosionEffectSplatMapSkinnedShieldCheckProgram->Bind(); - GLERROR("Bind ExplosionEffectSplatMapSkinned program"); + if (lastShader != m_ExplosionEffectSplatMapSkinnedShieldCheckProgram->GetHandle()) { + m_ExplosionEffectSplatMapSkinnedShieldCheckProgram->Bind(); + lastShader = m_ExplosionEffectSplatMapSkinnedShieldCheckProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSplatMapSkinned program"); + glUniform1i(glGetUniformLocation(explosionSplatMapSkinnedShieldCheckHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapSkinnedShieldCheckHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapSkinnedShieldCheckHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSplatMapSkinnedShieldCheckHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSplatMapSkinnedShieldCheckHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSplatMapSkinned Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSplatMapSkinnedShieldCheckHandle, explosionEffectJob, scene); //bind textures @@ -611,9 +717,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listBind(); - GLERROR("Bind ExplosionEffectSplatMap program"); - //bind uniforms + if (lastShader != m_ExplosionEffectSplatMapShieldCheckProgram->GetHandle()) { + m_ExplosionEffectSplatMapShieldCheckProgram->Bind(); + lastShader = m_ExplosionEffectSplatMapShieldCheckProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSplatMap program"); + glUniform1i(glGetUniformLocation(explosionSplatMapShieldCheckHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapShieldCheckHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapShieldCheckHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSplatMapShieldCheckHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSplatMapShieldCheckHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSplatMap Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSplatMapShieldCheckHandle, explosionEffectJob, scene); //bind textures @@ -629,9 +743,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->IsSkinned()) { - - m_ExplosionEffectSkinnedProgram->Bind(); - GLERROR("Bind ExplosionEffectSkinned program"); + if (lastShader != m_ExplosionEffectSkinnedProgram->GetHandle()) { + m_ExplosionEffectSkinnedProgram->Bind(); + lastShader = m_ExplosionEffectSkinnedProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSkinned program"); + glUniform1i(glGetUniformLocation(explosionSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSkinned Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSkinnedHandle, explosionEffectJob, scene); //bind textures @@ -649,8 +771,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listBind(); - GLERROR("Bind ExplosionEffect program"); + if (lastShader != m_ExplosionEffectProgram->GetHandle()) { + m_ExplosionEffectProgram->Bind(); + lastShader = m_ExplosionEffectProgram->GetHandle(); + GLERROR("Bind ExplosionEffect program"); + glUniform1i(glGetUniformLocation(explosionHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffect Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionHandle, explosionEffectJob, scene); //bind textures @@ -664,8 +795,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->IsSkinned()) { - m_ExplosionEffectSplatMapSkinnedProgram->Bind(); - GLERROR("Bind ExplosionEffectSplatMapSkinned program"); + if (lastShader != m_ExplosionEffectSplatMapSkinnedProgram->GetHandle()) { + m_ExplosionEffectSplatMapSkinnedProgram->Bind(); + lastShader = m_ExplosionEffectSplatMapSkinnedProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSkinnedSplatMap program"); + glUniform1i(glGetUniformLocation(explosionSplatMapSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSplatMapSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSplatMapSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSkinnedSplatMap Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSplatMapSkinnedHandle, explosionEffectJob, scene); //bind textures @@ -681,9 +821,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listBind(); - GLERROR("Bind ExplosionEffectSplatMap program"); - //bind uniforms + if (lastShader != m_ExplosionEffectSplatMapProgram->GetHandle()) { + m_ExplosionEffectSplatMapProgram->Bind(); + lastShader = m_ExplosionEffectSplatMapProgram->GetHandle(); + GLERROR("Bind ExplosionEffectSplatMap program"); + glUniform1i(glGetUniformLocation(explosionSplatMapHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(explosionSplatMapHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(explosionSplatMapHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(explosionSplatMapHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ExplosionEffectSplatMap Uniforms"); + } //bind uniforms BindExplosionUniforms(explosionSplatMapHandle, explosionEffectJob, scene); //bind textures @@ -697,8 +845,11 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, explosionEffectJob->Model->ElementBuffer); + if (lastModel != explosionEffectJob->ModelID) { + glBindVertexArray(explosionEffectJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, explosionEffectJob->Model->ElementBuffer); + lastModel = explosionEffectJob->ModelID; + } glDrawElements(GL_TRIANGLES, explosionEffectJob->EndIndex - explosionEffectJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(explosionEffectJob->StartIndex*sizeof(unsigned int))); glEnable(GL_CULL_FACE); GLERROR("explosion effect end"); @@ -713,8 +864,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->IsSkinned()) { - m_ForwardPlusSkinnedShieldCheckProgram->Bind(); - GLERROR("Bind ForwardPlusSkinnedProgram"); + if (lastShader != m_ForwardPlusSkinnedShieldCheckProgram->GetHandle()) { + m_ForwardPlusSkinnedShieldCheckProgram->Bind(); + lastShader = m_ForwardPlusSkinnedShieldCheckProgram->GetHandle(); + GLERROR("Bind ForwardPlusSkinnedProgram program"); + glUniform1i(glGetUniformLocation(forwardSkinnedShieldCheckHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedShieldCheckHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedShieldCheckHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSkinnedShieldCheckHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSkinnedShieldCheckHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ForwardPlusSkinnedProgram Uniforms"); + } //bind uniforms BindModelUniforms(forwardSkinnedShieldCheckHandle, modelJob, scene); //bind textures @@ -733,8 +893,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listBind(); - GLERROR("Bind ForwardPlusProgram"); + if (lastShader != m_ForwardPlusShieldCheckProgram->GetHandle()) { + m_ForwardPlusShieldCheckProgram->Bind(); + lastShader = m_ForwardPlusShieldCheckProgram->GetHandle(); + GLERROR("Bind ForwardPlusProgram program"); + glUniform1i(glGetUniformLocation(forwardShieldCheckHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardShieldCheckHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardShieldCheckHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardShieldCheckHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardShieldCheckHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ForwardPlusProgram Uniforms"); + } //bind uniforms BindModelUniforms(forwardShieldCheckHandle, modelJob, scene); //bind textures @@ -748,8 +917,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->IsSkinned()) { - m_ForwardPlusSplatMapSkinnedShieldCheckProgram->Bind(); - GLERROR("Bind SplatMap program"); + if (lastShader != m_ForwardPlusSplatMapSkinnedShieldCheckProgram->GetHandle()) { + m_ForwardPlusSplatMapSkinnedShieldCheckProgram->Bind(); + lastShader = m_ForwardPlusSplatMapSkinnedShieldCheckProgram->GetHandle(); + GLERROR("Bind ForwardPlusProgramSplatMapSkinned program"); + glUniform1i(glGetUniformLocation(forwardSplatMapSkinnedShieldCheckHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapSkinnedShieldCheckHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapSkinnedShieldCheckHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSplatMapSkinnedShieldCheckHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSplatMapSkinnedShieldCheckHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ForwardPlusProgramSplatMapSkinned Uniforms"); + } //bind uniforms BindModelUniforms(forwardSplatMapSkinnedShieldCheckHandle, modelJob, scene); //bind textures @@ -765,8 +943,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listBind(); - GLERROR("Bind SplatMap program"); + if (lastShader != m_ForwardPlusSplatMapShieldCheckProgram->GetHandle()) { + m_ForwardPlusSplatMapShieldCheckProgram->Bind(); + lastShader = m_ForwardPlusSplatMapShieldCheckProgram->GetHandle(); + GLERROR("Bind SplatMap program"); + glUniform1i(glGetUniformLocation(forwardSplatShieldCheckHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatShieldCheckHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatShieldCheckHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSplatShieldCheckHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSplatShieldCheckHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind SplatMap Uniforms"); + } //bind uniforms BindModelUniforms(forwardSplatShieldCheckHandle, modelJob, scene); //bind textures @@ -782,8 +969,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->IsSkinned()) { - m_ForwardPlusSkinnedProgram->Bind(); - GLERROR("Bind ForwardPlusSkinnedProgram"); + if (lastShader != m_ForwardPlusSkinnedProgram->GetHandle()) { + m_ForwardPlusSkinnedProgram->Bind(); + lastShader = m_ForwardPlusSkinnedProgram->GetHandle(); + GLERROR("Bind ForwardPlusSkinnedProgram program"); + glUniform1i(glGetUniformLocation(forwardSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ForwardPlusSkinnedProgram Uniforms"); + } //bind uniforms BindModelUniforms(forwardSkinnedHandle, modelJob, scene); //bind textures @@ -802,8 +998,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listBind(); - GLERROR("Bind ForwardPlusProgram"); + if (lastShader != m_ForwardPlusProgram->GetHandle()) { + m_ForwardPlusProgram->Bind(); + lastShader = m_ForwardPlusProgram->GetHandle(); + GLERROR("Bind ForwardPlusProgram program"); + glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind ForwardPlusProgram Uniforms"); + } //bind uniforms BindModelUniforms(forwardHandle, modelJob, scene); //bind textures @@ -817,8 +1022,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->IsSkinned()) { - m_ForwardPlusSplatMapSkinnedProgram->Bind(); - GLERROR("Bind SplatMap program"); + if (lastShader != m_ForwardPlusSplatMapSkinnedProgram->GetHandle()) { + m_ForwardPlusSplatMapSkinnedProgram->Bind(); + lastShader = m_ForwardPlusSplatMapSkinnedProgram->GetHandle(); + GLERROR("Bind SplatMap program"); + glUniform1i(glGetUniformLocation(forwardSplatMapSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSplatMapSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSplatMapSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind SplatMap Uniforms"); + } //bind uniforms BindModelUniforms(forwardSplatMapSkinnedHandle, modelJob, scene); //bind textures @@ -834,8 +1048,17 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listBind(); - GLERROR("Bind SplatMap program"); + if (lastShader != m_ForwardPlusSplatMapProgram->GetHandle()) { + m_ForwardPlusSplatMapProgram->Bind(); + lastShader = m_ForwardPlusSplatMapProgram->GetHandle(); + GLERROR("Bind SplatMap program"); + glUniform1i(glGetUniformLocation(forwardSplatMapHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(forwardSplatMapHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(forwardSplatMapHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(forwardSplatMapHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind SplatMap Uniforms"); + } //bind uniforms BindModelUniforms(forwardSplatMapHandle, modelJob, scene); //bind textures @@ -847,8 +1070,11 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listModel->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + if (lastModel != modelJob->ModelID) { + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + lastModel = modelJob->ModelID; + } glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex*sizeof(unsigned int))); if (GLERROR("models end")) { continue; @@ -953,15 +1179,25 @@ void DrawFinalPass::DrawShieldedModelRenderQueue(std::list>& jobs, RenderScene& scene) { - - + GLuint shaderSkinnedHandle = m_FillDepthStencilBufferSkinnedProgram->GetHandle(); + GLuint shaderHandle = m_FillDepthStencilBufferProgram->GetHandle(); + GLuint lastShader = 0; for (auto &job : jobs) { auto modelJob = std::dynamic_pointer_cast(job); if(modelJob->Model->IsSkinned()) { - m_FillDepthStencilBufferSkinnedProgram->Bind(); - GLuint shaderHandle = m_FillDepthStencilBufferSkinnedProgram->GetHandle(); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); + if (lastShader != m_FillDepthStencilBufferSkinnedProgram->GetHandle()) { + m_FillDepthStencilBufferSkinnedProgram->Bind(); + lastShader = m_FillDepthStencilBufferSkinnedProgram->GetHandle(); + glUniform1i(glGetUniformLocation(shaderSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(shaderSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(shaderSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind Uniforms 1"); + } + + glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); GLERROR("Bind PVM uniform"); std::vector frameBones; @@ -973,8 +1209,17 @@ void DrawFinalPass::DrawToDepthStencilBuffer(std::listBind(); - GLuint shaderHandle = m_FillDepthStencilBufferProgram->GetHandle(); + if (lastShader != m_FillDepthStencilBufferProgram->GetHandle()) { + m_FillDepthStencilBufferProgram->Bind(); + lastShader = m_FillDepthStencilBufferProgram->GetHandle(); + glUniform1i(glGetUniformLocation(shaderHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform2f(glGetUniformLocation(shaderHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); + GLERROR("Bind Uniforms 2"); + } + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); GLERROR("Bind PVM uniform"); } @@ -998,6 +1243,9 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend GLuint shaderHandle = m_SpriteProgram->GetHandle(); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform3fv(glGetUniformLocation(shaderHandle, "CameraPos"), 1, glm::value_ptr(scene.Camera->Position())); + for(auto& job : jobs) { auto spriteJob = std::dynamic_pointer_cast(job); RenderState jobState; @@ -1007,9 +1255,6 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend jobState.Disable(GL_DEPTH_TEST); } glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * spriteJob->Matrix)); - - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); - glUniform3fv(glGetUniformLocation(shaderHandle, "CameraPos"), 1, glm::value_ptr(scene.Camera->Position())); glUniform4fv(glGetUniformLocation(shaderHandle, "Color"), 1, glm::value_ptr(spriteJob->Color)); glUniform4fv(glGetUniformLocation(shaderHandle, "FillColor"), 1, glm::value_ptr(spriteJob->FillColor)); glUniform1f(glGetUniformLocation(shaderHandle, "FillPercentage"), spriteJob->FillPercentage); @@ -1039,14 +1284,8 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend void DrawFinalPass::BindExplosionUniforms(GLuint shaderHandle, std::shared_ptr& job, RenderScene& scene) { - glUniform1i(glGetUniformLocation(shaderHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); - GLERROR("Bind 1 uniform"); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(job->Matrix)); GLERROR("Bind 2 uniform"); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); - GLERROR("Bind 3 uniform"); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); - GLERROR("Bind 4 uniform"); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * job->Matrix)); GLERROR("Bind PVM uniform"); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "VM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix() * job->Matrix)); @@ -1054,9 +1293,6 @@ void DrawFinalPass::BindExplosionUniforms(GLuint shaderHandle, std::shared_ptrMatrix)))); GLERROR("Bind TIM uniform"); - glUniform2f(glGetUniformLocation(shaderHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); - GLERROR("Bind 5 uniform"); - glUniform3fv(glGetUniformLocation(shaderHandle, "ExplosionOrigin"), 1, glm::value_ptr(job->ExplosionOrigin)); GLERROR("Bind 6 uniform"); glUniform1f(glGetUniformLocation(shaderHandle, "TimeSinceDeath"), job->TimeSinceDeath); @@ -1086,25 +1322,15 @@ void DrawFinalPass::BindExplosionUniforms(GLuint shaderHandle, std::shared_ptrFillPercentage); GLERROR("Bind 19 uniform"); - glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); - GLERROR("Bind 20 uniform"); glUniform1f(glGetUniformLocation(shaderHandle, "GlowIntensity"), job->GlowIntensity); GLERROR("END"); } void DrawFinalPass::BindModelUniforms(GLuint shaderHandle, std::shared_ptr& job, RenderScene& scene) { - glUniform1i(glGetUniformLocation(shaderHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); - GLERROR("Bind 1 uniform"); GLint Location_M = glGetUniformLocation(shaderHandle, "M"); glUniformMatrix4fv(Location_M, 1, GL_FALSE, glm::value_ptr(job->Matrix)); GLERROR("Bind 2 uniform"); - GLint Location_V = glGetUniformLocation(shaderHandle, "V"); - glUniformMatrix4fv(Location_V, 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); - GLERROR("Bind 3 uniform"); - GLint Location_P = glGetUniformLocation(shaderHandle, "P"); - glUniformMatrix4fv(Location_P, 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); - GLERROR("Bind 4 uniform"); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * job->Matrix)); GLERROR("Bind PVM uniform"); glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "VM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix() * job->Matrix)); @@ -1112,10 +1338,6 @@ void DrawFinalPass::BindModelUniforms(GLuint shaderHandle, std::shared_ptrMatrix)))); GLERROR("Bind TIM uniform"); - GLint Location_ScreenDimensions = glGetUniformLocation(shaderHandle, "ScreenDimensions"); - glUniform2f(Location_ScreenDimensions, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); - GLERROR("Bind 5 uniform"); - GLint Location_FillPercentage = glGetUniformLocation(shaderHandle, "FillPercentage"); glUniform1f(Location_FillPercentage, job->FillPercentage); GLERROR("Bind 6 uniform"); @@ -1127,11 +1349,6 @@ void DrawFinalPass::BindModelUniforms(GLuint shaderHandle, std::shared_ptrColor)); - GLERROR("Bind 9 uniform"); - GLint Location_AmbientColor = glGetUniformLocation(shaderHandle, "AmbientColor"); - glUniform4fv(Location_AmbientColor, 1, glm::value_ptr(scene.AmbientColor)); - - GLERROR("Bind 10 uniform"); GLint Location_GlowIntensity = glGetUniformLocation(shaderHandle, "GlowIntensity"); glUniform1f(Location_GlowIntensity, job->GlowIntensity); diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index 3f97e375..b5162e72 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -62,6 +62,8 @@ void PickingPass::Draw(RenderScene& scene) //TODO: Render: Add code for more jobs than modeljobs. GLuint shaderHandle = m_PickingProgram->GetHandle(); GLuint shaderSkinnedHandle = m_PickingSkinnedProgram->GetHandle(); + GLuint lastShader = 0; + unsigned int lastModel = 0; m_PickingProgram->Bind(); if (scene.ClearDepth) { //glClear(GL_DEPTH_BUFFER_BIT); @@ -98,8 +100,11 @@ void PickingPass::Draw(RenderScene& scene) m_PickingColorsToEntity[glm::ivec2(pickColor[0], pickColor[1])] = pickInfo; if (modelJob->Model->IsSkinned()) { - m_PickingSkinnedProgram->Bind(); - glUniformMatrix4fv(100, 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); + if (lastShader != m_PickingSkinnedProgram->GetHandle()) { + m_PickingSkinnedProgram->Bind(); + lastShader = m_PickingSkinnedProgram->GetHandle(); + } + glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); glUniform2fv(glGetUniformLocation(shaderSkinnedHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); std::vector frameBones; @@ -112,13 +117,19 @@ void PickingPass::Draw(RenderScene& scene) } else { - m_PickingProgram->Bind(); - glUniformMatrix4fv(100, 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); + if (lastShader != m_PickingProgram->GetHandle()) { + m_PickingProgram->Bind(); + lastShader = m_PickingProgram->GetHandle(); + } + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); glUniform2fv(glGetUniformLocation(shaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); } - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + if (lastModel != modelJob->ModelID) { + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + lastModel = modelJob->ModelID; + } glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int))); } } @@ -204,10 +215,11 @@ void PickingPass::Draw(RenderScene& scene) m_PickingColorsToEntity[glm::ivec2(pickColor[0], pickColor[1])] = pickInfo; if (modelJob->Model->IsSkinned()) { - m_PickingSkinnedProgram->Bind(); - glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + if (lastShader != m_PickingSkinnedProgram->GetHandle()) { + m_PickingSkinnedProgram->Bind(); + lastShader = m_PickingSkinnedProgram->GetHandle(); + } + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); glUniform2fv(glGetUniformLocation(shaderSkinnedHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); std::vector frameBones; @@ -220,19 +232,24 @@ void PickingPass::Draw(RenderScene& scene) glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); } else { - m_PickingProgram->Bind(); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + if (lastShader != m_PickingProgram->GetHandle()) { + m_PickingProgram->Bind(); + lastShader = m_PickingProgram->GetHandle(); + } + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * modelJob->Matrix)); glUniform2fv(glGetUniformLocation(shaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); } - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + if (lastModel != modelJob->ModelID) { + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + lastModel = modelJob->ModelID; + } glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int))); } } + m_PickingProgram->Bind(); for (auto& job : scene.Jobs.SpriteJob) { auto spriteJob = std::dynamic_pointer_cast(job); if (!spriteJob->Pickable) { @@ -267,14 +284,11 @@ void PickingPass::Draw(RenderScene& scene) m_PickingColorsToEntity[glm::ivec2(pickColor[0], pickColor[1])] = pickInfo; - m_PickingProgram->Bind(); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(spriteJob->Matrix)); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * spriteJob->Matrix)); glUniform2fv(glGetUniformLocation(shaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); - glBindVertexArray(spriteJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer); + glBindVertexArray(spriteJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer); glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex * sizeof(unsigned int))); } } diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index a1f00c88..a91530d3 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -448,7 +448,7 @@ void RenderSystem::Update(double dt) fillModels(scene.Jobs); fillPointLights(scene.Jobs.PointLight, m_World); //TODO: Make sure all objects needed are also sorted. - scene.Jobs.OpaqueObjects.sort(); + scene.Jobs.OpaqueObjects.sort([](auto& a, auto& b) {return *a < *b; }); fillSprites(scene.Jobs.SpriteJob, m_World); fillDirectionalLights(scene.Jobs.DirectionalLight, m_World); fillText(scene.Jobs.Text, m_World); diff --git a/src/Engine/Rendering/Util/ScreenCoords.cpp b/src/Engine/Rendering/Util/ScreenCoords.cpp index 8b7768c8..a858524d 100644 --- a/src/Engine/Rendering/Util/ScreenCoords.cpp +++ b/src/Engine/Rendering/Util/ScreenCoords.cpp @@ -37,7 +37,7 @@ ScreenCoords::PixelData ScreenCoords::ToPixelData(float x, float y, FrameBuffer* glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pdata); GLERROR("glReadPixels(pdata) Error"); PickDataBuffer->Unbind(); - + GLERROR("Unbind Error"); glBindFramebuffer(GL_FRAMEBUFFER, DepthBuffer); GLERROR("glBindFramebuffer(DepthBuffer) Error"); float depthData;