diff --git a/include/Nazara/Graphics/DeferredFogPass.hpp b/include/Nazara/Graphics/DeferredFogPass.hpp index b17e346b0..9a785b3e4 100644 --- a/include/Nazara/Graphics/DeferredFogPass.hpp +++ b/include/Nazara/Graphics/DeferredFogPass.hpp @@ -25,6 +25,7 @@ class NAZARA_API NzDeferredFogPass : public NzDeferredRenderPass NzRenderStates m_states; NzShaderRef m_shader; NzTextureSampler m_pointSampler; + int m_shaderEyePositionLocation; }; #endif // NAZARA_DEFERREDFOGPASS_HPP diff --git a/include/Nazara/Graphics/DeferredGeometryPass.hpp b/include/Nazara/Graphics/DeferredGeometryPass.hpp index 8bdc2703c..8f90f1609 100644 --- a/include/Nazara/Graphics/DeferredGeometryPass.hpp +++ b/include/Nazara/Graphics/DeferredGeometryPass.hpp @@ -22,6 +22,18 @@ class NAZARA_API NzDeferredGeometryPass : public NzDeferredRenderPass bool Resize(const NzVector2ui& dimensions); protected: + struct ShaderUniforms; + + const ShaderUniforms* GetShaderUniforms(const NzShader* shader) const; + + struct ShaderUniforms + { + int eyePosition; + int sceneAmbient; + int textureOverlay; + }; + + mutable std::unordered_map m_shaderUniforms; NzRenderStates m_clearStates; NzShaderRef m_clearShader; }; diff --git a/include/Nazara/Graphics/DeferredPhongLightingPass.hpp b/include/Nazara/Graphics/DeferredPhongLightingPass.hpp index 38c92be48..2b8f37ac1 100644 --- a/include/Nazara/Graphics/DeferredPhongLightingPass.hpp +++ b/include/Nazara/Graphics/DeferredPhongLightingPass.hpp @@ -39,7 +39,11 @@ class NAZARA_API NzDeferredPhongLightingPass : public NzDeferredRenderPass NzStaticMesh* m_coneMesh; NzStaticMesh* m_sphereMesh; bool m_lightMeshesDrawing; + int m_directionalLightShaderEyePositionLocation; + int m_directionalLightShaderSceneAmbientLocation; int m_pointSpotLightShaderDiscardLocation; + int m_pointSpotLightShaderEyePositionLocation; + int m_pointSpotLightShaderSceneAmbientLocation; }; #endif // NAZARA_DEFERREDPHONGLIGHTINGPASS_HPP diff --git a/include/Nazara/Graphics/ForwardRenderTechnique.hpp b/include/Nazara/Graphics/ForwardRenderTechnique.hpp index 6aa2da571..d0c23292b 100644 --- a/include/Nazara/Graphics/ForwardRenderTechnique.hpp +++ b/include/Nazara/Graphics/ForwardRenderTechnique.hpp @@ -49,6 +49,8 @@ class NAZARA_API NzForwardRenderTechnique : public NzAbstractRenderTechnique, Nz int lightOffset; // "Distance" entre Lights[0].type et Lights[1].type // Autre uniformes + int eyePosition; + int sceneAmbient; int textureOverlay; }; diff --git a/include/Nazara/Renderer/Enums.hpp b/include/Nazara/Renderer/Enums.hpp index 7100d198e..2a1959a46 100644 --- a/include/Nazara/Renderer/Enums.hpp +++ b/include/Nazara/Renderer/Enums.hpp @@ -187,8 +187,6 @@ enum nzSamplerWrap enum nzShaderUniform { - ///FIXME: Virer EyePosition et SceneAmbient de l'énumération (ils n'ont rien à faire dans le module de rendu) - nzShaderUniform_EyePosition, nzShaderUniform_InvProjMatrix, nzShaderUniform_InvTargetSize, nzShaderUniform_InvViewMatrix, @@ -197,7 +195,6 @@ enum nzShaderUniform nzShaderUniform_InvWorldViewMatrix, nzShaderUniform_InvWorldViewProjMatrix, nzShaderUniform_ProjMatrix, - nzShaderUniform_SceneAmbient, nzShaderUniform_TargetSize, nzShaderUniform_ViewMatrix, nzShaderUniform_ViewProjMatrix, diff --git a/src/Nazara/Graphics/DeferredFogPass.cpp b/src/Nazara/Graphics/DeferredFogPass.cpp index 1f2e23af4..abd439d23 100644 --- a/src/Nazara/Graphics/DeferredFogPass.cpp +++ b/src/Nazara/Graphics/DeferredFogPass.cpp @@ -125,6 +125,7 @@ NzDeferredFogPass::NzDeferredFogPass() m_pointSampler.SetWrapMode(nzSamplerWrap_Clamp); m_shader = BuildFogShader(); + m_shaderEyePositionLocation = m_shader->GetUniformLocation("EyePosition"); m_states.parameters[nzRendererParameter_DepthBuffer] = false; } @@ -138,7 +139,7 @@ bool NzDeferredFogPass::Process(const NzScene* scene, unsigned int firstWorkText NzRenderer::SetViewport(NzRecti(0, 0, m_dimensions.x, m_dimensions.y)); NzRenderer::SetShader(m_shader); - m_shader->SendVector(m_shader->GetUniformLocation(nzShaderUniform_EyePosition), scene->GetViewer()->GetEyePosition()); + m_shader->SendVector(m_shaderEyePositionLocation, scene->GetViewer()->GetEyePosition()); NzRenderer::SetRenderStates(m_states); NzRenderer::SetTexture(0, m_workTextures[secondWorkTexture]); diff --git a/src/Nazara/Graphics/DeferredGeometryPass.cpp b/src/Nazara/Graphics/DeferredGeometryPass.cpp index 228fdfe8c..a9b10f652 100644 --- a/src/Nazara/Graphics/DeferredGeometryPass.cpp +++ b/src/Nazara/Graphics/DeferredGeometryPass.cpp @@ -51,6 +51,7 @@ bool NzDeferredGeometryPass::Process(const NzScene* scene, unsigned int firstWor NzRenderer::SetMatrix(nzMatrixType_View, viewer->GetViewMatrix()); const NzShader* lastShader = nullptr; + const ShaderUniforms* shaderUniforms = nullptr; for (auto& matIt : m_renderQueue->opaqueModels) { @@ -76,10 +77,13 @@ bool NzDeferredGeometryPass::Process(const NzScene* scene, unsigned int firstWor // Les uniformes sont conservées au sein d'un programme, inutile de les renvoyer tant qu'il ne change pas if (shader != lastShader) { + // Index des uniformes dans le shader + shaderUniforms = GetShaderUniforms(shader); + // Couleur ambiante de la scène - shader->SendColor(shader->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); // Position de la caméra - shader->SendVector(shader->GetUniformLocation(nzShaderUniform_EyePosition), viewer->GetEyePosition()); + shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); lastShader = shader; } @@ -230,3 +234,19 @@ bool NzDeferredGeometryPass::Resize(const NzVector2ui& dimensions) return false; } } + +const NzDeferredGeometryPass::ShaderUniforms* NzDeferredGeometryPass::GetShaderUniforms(const NzShader* shader) const +{ + auto it = m_shaderUniforms.find(shader); + if (it == m_shaderUniforms.end()) + { + ShaderUniforms uniforms; + uniforms.eyePosition = shader->GetUniformLocation("EyePosition"); + uniforms.sceneAmbient = shader->GetUniformLocation("SceneAmbient"); + uniforms.textureOverlay = shader->GetUniformLocation("TextureOverlay"); + + it = m_shaderUniforms.emplace(shader, uniforms).first; + } + + return &it->second; +} diff --git a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp index 7068114cc..64b58ddb1 100644 --- a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp +++ b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp @@ -17,6 +17,8 @@ NzDeferredPhongLightingPass::NzDeferredPhongLightingPass() : m_lightMeshesDrawing(false) { m_directionalLightShader = NzShaderLibrary::Get("DeferredDirectionnalLight"); + m_directionalLightShaderEyePositionLocation = m_directionalLightShader->GetUniformLocation("EyePosition"); + m_directionalLightShaderSceneAmbientLocation = m_directionalLightShader->GetUniformLocation("SceneAmbient"); m_directionalLightUniforms.ubo = false; m_directionalLightUniforms.locations.type = -1; // Type déjà connu @@ -28,6 +30,8 @@ m_lightMeshesDrawing(false) m_pointSpotLightShader = NzShaderLibrary::Get("DeferredPointSpotLight"); m_pointSpotLightShaderDiscardLocation = m_pointSpotLightShader->GetUniformLocation("Discard"); + m_pointSpotLightShaderEyePositionLocation = m_pointSpotLightShader->GetUniformLocation("EyePosition"); + m_pointSpotLightShaderSceneAmbientLocation = m_pointSpotLightShader->GetUniformLocation("SceneAmbient"); m_pointSpotLightUniforms.ubo = false; m_pointSpotLightUniforms.locations.type = m_pointSpotLightShader->GetUniformLocation("LightType"); @@ -96,8 +100,8 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir { NzRenderer::SetRenderStates(lightStates); NzRenderer::SetShader(m_directionalLightShader); - m_directionalLightShader->SendColor(m_directionalLightShader->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); - m_directionalLightShader->SendVector(m_directionalLightShader->GetUniformLocation(nzShaderUniform_EyePosition), scene->GetViewer()->GetEyePosition()); + m_directionalLightShader->SendColor(m_directionalLightShaderSceneAmbientLocation, scene->GetAmbientColor()); + m_directionalLightShader->SendVector(m_directionalLightShaderEyePositionLocation, scene->GetViewer()->GetEyePosition()); for (const NzLight* light : m_renderQueue->directionalLights) { @@ -126,8 +130,8 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir NzRenderer::SetRenderStates(lightStates); NzRenderer::SetShader(m_pointSpotLightShader); - m_pointSpotLightShader->SendColor(m_pointSpotLightShader->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); - m_pointSpotLightShader->SendVector(m_pointSpotLightShader->GetUniformLocation(nzShaderUniform_EyePosition), scene->GetViewer()->GetEyePosition()); + m_pointSpotLightShader->SendColor(m_pointSpotLightShaderEyePositionLocation, scene->GetAmbientColor()); + m_pointSpotLightShader->SendVector(m_pointSpotLightShaderSceneAmbientLocation, scene->GetViewer()->GetEyePosition()); NzMatrix4f lightMatrix; lightMatrix.MakeIdentity(); diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index e7f6168de..39a9587dd 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -210,11 +210,11 @@ void NzForwardRenderTechnique::DrawBasicSprites(const NzScene* scene) const shaderUniforms = GetShaderUniforms(shader); // Couleur ambiante de la scène - shader->SendColor(shader->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); // Overlay shader->SendInteger(shaderUniforms->textureOverlay, overlayUnit); // Position de la caméra - shader->SendVector(shader->GetUniformLocation(nzShaderUniform_EyePosition), viewer->GetEyePosition()); + shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); lastShader = shader; } @@ -299,9 +299,9 @@ void NzForwardRenderTechnique::DrawOpaqueModels(const NzScene* scene) const shaderUniforms = GetShaderUniforms(shader); // Couleur ambiante de la scène - shader->SendColor(shader->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); // Position de la caméra - shader->SendVector(shader->GetUniformLocation(nzShaderUniform_EyePosition), viewer->GetEyePosition()); + shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); lastShader = shader; } @@ -503,9 +503,9 @@ void NzForwardRenderTechnique::DrawTransparentModels(const NzScene* scene) const shaderUniforms = GetShaderUniforms(shader); // Couleur ambiante de la scène - shader->SendColor(shader->GetUniformLocation(nzShaderUniform_SceneAmbient), scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); // Position de la caméra - shader->SendVector(shader->GetUniformLocation(nzShaderUniform_EyePosition), viewer->GetEyePosition()); + shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); // On envoie les lumières directionnelles s'il y a (Les mêmes pour tous) lightCount = std::min(m_directionalLights.GetLightCount(), NazaraSuffixMacro(NAZARA_GRAPHICS_MAX_LIGHT_PER_PASS, U)); @@ -563,11 +563,11 @@ void NzForwardRenderTechnique::DrawTransparentModels(const NzScene* scene) const const NzForwardRenderTechnique::ShaderUniforms* NzForwardRenderTechnique::GetShaderUniforms(const NzShader* shader) const { auto it = m_shaderUniforms.find(shader); - if (it != m_shaderUniforms.end()) - return &(it->second); - else + if (it == m_shaderUniforms.end()) { ShaderUniforms uniforms; + uniforms.eyePosition = shader->GetUniformLocation("EyePosition"); + uniforms.sceneAmbient = shader->GetUniformLocation("SceneAmbient"); uniforms.textureOverlay = shader->GetUniformLocation("TextureOverlay"); int type0Location = shader->GetUniformLocation("Lights[0].type"); @@ -588,7 +588,8 @@ const NzForwardRenderTechnique::ShaderUniforms* NzForwardRenderTechnique::GetSha else uniforms.hasLightUniforms = false; - auto pair = m_shaderUniforms.emplace(shader, uniforms); - return &(pair.first->second); + it = m_shaderUniforms.emplace(shader, uniforms).first; } + + return &it->second; } diff --git a/src/Nazara/Renderer/Shader.cpp b/src/Nazara/Renderer/Shader.cpp index 8d9239da2..e9c4fd968 100644 --- a/src/Nazara/Renderer/Shader.cpp +++ b/src/Nazara/Renderer/Shader.cpp @@ -789,7 +789,6 @@ bool NzShader::PostLinkage() // Pour éviter de se tromper entre le nom et la constante #define CacheUniform(name) m_uniformLocations[nzShaderUniform_##name] = glGetUniformLocation(m_program, #name) - CacheUniform(EyePosition); CacheUniform(InvProjMatrix); CacheUniform(InvTargetSize); CacheUniform(InvViewMatrix); @@ -798,7 +797,6 @@ bool NzShader::PostLinkage() CacheUniform(InvWorldViewMatrix); CacheUniform(InvWorldViewProjMatrix); CacheUniform(ProjMatrix); - CacheUniform(SceneAmbient); CacheUniform(TargetSize); CacheUniform(ViewMatrix); CacheUniform(ViewProjMatrix);