diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index 2b3bb5903..7c9a4a821 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -383,6 +383,8 @@ void IrrDriver::renderScene(scene::ICameraSceneNode * const camnode, unsigned po if (!UserConfigParams::m_dynamic_lights && !forceRTT) { glDisable(GL_FRAMEBUFFER_SRGB); + glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); return; } diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index bf77beee9..1727c3508 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -404,7 +404,6 @@ void Shaders::loadShaders() FullScreenShader::MLAAColorEdgeDetectionSHader::init(); FullScreenShader::MLAABlendWeightSHader::init(); FullScreenShader::MLAAGatherSHader::init(); - MeshShader::ColorizeShader::init(); MeshShader::BubbleShader::init(); LightShader::PointLightShader::init(); MeshShader::RSMShader::init(); @@ -704,7 +703,7 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_pass2.frag").c_str()); - AssignUniforms("ModelMatrix", "TextureMatrix", "ambient"); + AssignUniforms("ModelMatrix", "TextureMatrix"); GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); @@ -726,7 +725,7 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_pass2.frag").c_str()); - AssignUniforms("ambient"); + AssignUniforms(); TU_Albedo = 3; AssignTextureUnit(Program, @@ -748,11 +747,11 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectref_pass2.frag").c_str()); - AssignUniforms("ambient"); + AssignUniforms(); TU_Albedo = 3; AssignTextureUnit(Program, - TexUnit(0, "DiffuseMap"), + TexUnit(0, "DiffuseMap"), TexUnit(1, "SpecularMap"), TexUnit(2, "SSAO"), TexUnit(TU_Albedo, "Albedo") @@ -768,7 +767,7 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/detailledobject_pass2.frag").c_str()); - AssignUniforms("ModelMatrix", "ambient"); + AssignUniforms("ModelMatrix"); GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); TU_Albedo = 3; @@ -804,7 +803,7 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectref_pass2.frag").c_str()); - AssignUniforms("ModelMatrix", "TextureMatrix", "ambient"); + AssignUniforms("ModelMatrix", "TextureMatrix"); GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); @@ -825,7 +824,7 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/grass_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/grass_pass2.frag").c_str()); - AssignUniforms("ModelMatrix", "windDir", "ambient"); + AssignUniforms("ModelMatrix", "windDir"); TU_Albedo = 3; AssignTextureUnit(Program, @@ -843,7 +842,7 @@ namespace MeshShader GL_VERTEX_SHADER, file_manager->getAsset("shaders/instanced_grass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/grass_pass2.frag").c_str()); - AssignUniforms("windDir", "SunDir", "ambient"); + AssignUniforms("windDir", "SunDir"); TU_Albedo = 3; TU_dtex = 4; @@ -866,7 +865,7 @@ namespace MeshShader GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getLightFactor.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/objectpass_spheremap.frag").c_str()); - AssignUniforms("ModelMatrix", "InverseModelMatrix", "ambient"); + AssignUniforms("ModelMatrix", "InverseModelMatrix"); GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); @@ -886,7 +885,7 @@ namespace MeshShader Program = LoadProgram( GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/splatting.frag").c_str()); - AssignUniforms("ModelMatrix", "ambient"); + AssignUniforms("ModelMatrix"); TU_tex_layout = 3; TU_tex_detail0 = 4; TU_tex_detail1 = 5; @@ -974,30 +973,17 @@ namespace MeshShader AssignTextureUnit(Program, TexUnit(TU_tex, "tex")); } - GLuint ColorizeShader::Program; - GLuint ColorizeShader::uniform_MM; - GLuint ColorizeShader::uniform_col; - - void ColorizeShader::init() + ColorizeShader::ColorizeShader() { Program = LoadProgram( GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/colorize.frag").c_str()); - uniform_MM = glGetUniformLocation(Program, "ModelMatrix"); - uniform_col = glGetUniformLocation(Program, "col"); + AssignUniforms("ModelMatrix", "col"); GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); } - void ColorizeShader::setUniforms(const core::matrix4 &ModelMatrix, float r, float g, float b) - { - if (irr_driver->needUBOWorkaround()) - bypassUBO(Program); - glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer()); - glUniform3f(uniform_col, r, g, b); - } - ShadowShader::ShadowShader() { // Geometry shader needed diff --git a/src/graphics/shaders.hpp b/src/graphics/shaders.hpp index f39391255..127de8d65 100644 --- a/src/graphics/shaders.hpp +++ b/src/graphics/shaders.hpp @@ -119,16 +119,22 @@ class ShaderHelperSingleton : public Singleton protected: std::vector uniforms; - void AssignUniforms(const char* name) + void AssignUniforms_impl() { - uniforms.push_back(getUniformLocation(Program, name)); } template - void AssignUniforms(const char* name, U... rest) + void AssignUniforms_impl(const char* name, U... rest) { uniforms.push_back(getUniformLocation(Program, name)); - AssignUniforms(rest...); + AssignUniforms_impl(rest...); + } + + template + void AssignUniforms(U... rest) + { + static_assert(sizeof...(rest) == sizeof...(Args), "Count of Uniform's name mismatch"); + AssignUniforms_impl(rest...); } public: @@ -313,14 +319,10 @@ public: }; -class ColorizeShader +class ColorizeShader : public ShaderHelperSingleton { public: - static GLuint Program; - static GLuint uniform_MM, uniform_col; - - static void init(); - static void setUniforms(const core::matrix4 &ModelMatrix, float r, float g, float b); + ColorizeShader(); }; class ShadowShader : public ShaderHelperSingleton diff --git a/src/graphics/stkmeshscenenode.cpp b/src/graphics/stkmeshscenenode.cpp index 9eb02ea03..986e72cdf 100644 --- a/src/graphics/stkmeshscenenode.cpp +++ b/src/graphics/stkmeshscenenode.cpp @@ -142,7 +142,7 @@ void STKMeshSceneNode::drawGlow(const GLMesh &mesh) GLenum itype = mesh.IndexType; size_t count = mesh.IndexCount; - MeshShader::ColorizeShader::setUniforms(AbsoluteTransformation, cb->getRed(), cb->getGreen(), cb->getBlue()); + MeshShader::ColorizeShader::getInstance()->setUniforms(AbsoluteTransformation, video::SColorf(cb->getRed(), cb->getGreen(), cb->getBlue())); glDrawElementsBaseVertex(ptype, count, itype, (GLvoid *)mesh.vaoOffset, mesh.vaoBaseVertex); } @@ -312,7 +312,7 @@ void STKMeshSceneNode::render() if (irr_driver->getPhase() == GLOW_PASS) { - glUseProgram(MeshShader::ColorizeShader::Program); + glUseProgram(MeshShader::ColorizeShader::getInstance()->Program); for (u32 i = 0; i < Mesh->getMeshBufferCount(); ++i) { scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);