From 84592ef6314154a8e3cb8daadf2ca29a35f55fad Mon Sep 17 00:00:00 2001 From: Elderme Date: Sun, 8 Nov 2015 21:16:29 +0100 Subject: [PATCH] Removed singleton class SolidPassCmd --- src/graphics/command_buffer.cpp | 47 +- src/graphics/command_buffer.hpp | 75 ++- src/graphics/draw_calls.cpp | 107 ++-- src/graphics/draw_calls.hpp | 4 + src/graphics/geometry_passes.cpp | 645 +------------------------ src/graphics/irr_driver.cpp | 1 - src/graphics/materials.hpp | 615 ++++++++++++++++++++++- src/graphics/shader_based_renderer.cpp | 8 - src/graphics/shader_based_renderer.hpp | 2 - src/graphics/solid_first_pass.cpp | 63 --- src/graphics/solid_first_pass.hpp | 52 -- src/graphics/stk_scene_manager.hpp | 6 - 12 files changed, 754 insertions(+), 871 deletions(-) delete mode 100644 src/graphics/solid_first_pass.cpp delete mode 100644 src/graphics/solid_first_pass.hpp diff --git a/src/graphics/command_buffer.cpp b/src/graphics/command_buffer.cpp index 5e7df80a9..41c496168 100644 --- a/src/graphics/command_buffer.cpp +++ b/src/graphics/command_buffer.cpp @@ -18,6 +18,7 @@ #include "graphics/command_buffer.hpp" #include "graphics/central_settings.hpp" + template<> void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataSingleTex &instance) { @@ -49,6 +50,35 @@ STKMeshSceneNode *nd = dynamic_cast(node); instance.Color = nd->getGlowColor().color; } + + template<> + void expandTexSecondPass(const GLMesh &mesh, + const std::vector &prefilled_tex) + { + TexExpander::template + expandTex(mesh, GrassMat::SecondPassTextures, prefilled_tex[0], + prefilled_tex[1], prefilled_tex[2], prefilled_tex[3]); + } + + + + +template +void CommandBuffer::fillMaterial(int material_id, + MeshMap *mesh_map, + T *instance_buffer) +{ + m_offset[material_id] = m_command_buffer_offset; + FillInstances(mesh_map[material_id], + m_meshes[material_id], + instance_buffer, + m_draw_indirect_cmd, + m_instance_buffer_offset, + m_command_buffer_offset, + m_poly_count); + + m_size[material_id] = m_command_buffer_offset - m_instance_buffer_offset; +} CommandBuffer::CommandBuffer(): @@ -83,23 +113,6 @@ CommandBuffer::~CommandBuffer() } -template -void CommandBuffer::fillMaterial(int material_id, - MeshMap *mesh_map, - T *instance_buffer) -{ - m_offset[material_id] = m_command_buffer_offset; - FillInstances(mesh_map[material_id], - m_meshes[material_id], - instance_buffer, - m_draw_indirect_cmd, - m_instance_buffer_offset, - m_command_buffer_offset, - m_poly_count); - - m_size[material_id] = m_command_buffer_offset - m_instance_buffer_offset; -} - SolidCommandBuffer::SolidCommandBuffer(): CommandBuffer() { m_meshes = new std::vector[static_cast(Material::SHADERTYPE_COUNT)]; diff --git a/src/graphics/command_buffer.hpp b/src/graphics/command_buffer.hpp index d3533072b..a09b6962c 100644 --- a/src/graphics/command_buffer.hpp +++ b/src/graphics/command_buffer.hpp @@ -18,8 +18,11 @@ #ifndef HEADER_COMMAND_BUFFER_HPP #define HEADER_COMMAND_BUFFER_HPP +#include "graphics/draw_tools.hpp" #include "graphics/gl_headers.hpp" #include "graphics/material.hpp" +#include "graphics/materials.hpp" + #include "graphics/stk_mesh_scene_node.hpp" #include "graphics/vao_manager.hpp" @@ -103,6 +106,19 @@ void FillInstances( const MeshMap &gathered_GL_mesh, } } +template +void expandTexSecondPass(const GLMesh &mesh, + const std::vector &prefilled_tex) +{ + TexExpander::template + expandTex(mesh, T::SecondPassTextures, prefilled_tex[0], + prefilled_tex[1], prefilled_tex[2]); +} + +template<> +void expandTexSecondPass(const GLMesh &mesh, + const std::vector &prefilled_tex); + class CommandBuffer { @@ -120,7 +136,8 @@ protected: void fillMaterial(int material_id, MeshMap *mesh_map, T *instance_buffer); - + + public: CommandBuffer(); virtual ~CommandBuffer(); @@ -135,6 +152,60 @@ public: glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_draw_indirect_cmd_id); } + + template + void drawIndirect(Uniforms...uniforms) const + { + T::InstancedFirstPassShader::getInstance()->use(); + T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...); + + glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, T::Instance)); + for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++) + { + GLMesh *mesh = m_meshes[T::MaterialType][i]; + #ifdef DEBUG + if (mesh->VAOType != T::VertexType) + { + Log::error("RenderGeometry", "Wrong instanced vertex format (hint : %s)", + mesh->textures[0]->getName().getPath().c_str()); + continue; + } + #endif + TexExpander::template expandTex(*mesh, T::FirstPassTextures); + + glDrawElementsIndirect(GL_TRIANGLES, + GL_UNSIGNED_SHORT, + (const void*)((m_offset[T::MaterialType] + i) * sizeof(DrawElementsIndirectCommand))); + } + + } + + + // ---------------------------------------------------------------------------- + template + void drawIndirect2ndPass(const std::vector &prefilled_tex, + Uniforms...uniforms ) const + { + T::InstancedSecondPassShader::getInstance()->use(); + T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...); + + glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, + T::Instance)); + for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++) + { + GLMesh *mesh = m_meshes[T::MaterialType][i]; + expandTexSecondPass(*mesh, prefilled_tex); + glDrawElementsIndirect(GL_TRIANGLES, + GL_UNSIGNED_SHORT, + (const void*)((m_offset[T::MaterialType] + i) * sizeof(DrawElementsIndirectCommand))); + } + } + + + + + + /** Draw the i-th mesh with the specified material * (require at least OpenGL 4.0 * or GL_ARB_base_instance and GL_ARB_draw_indirect extensions) @@ -159,6 +230,8 @@ public: } }; + + class SolidCommandBuffer: public CommandBuffer { public: diff --git a/src/graphics/draw_calls.cpp b/src/graphics/draw_calls.cpp index b68ae589f..708d406ce 100644 --- a/src/graphics/draw_calls.cpp +++ b/src/graphics/draw_calls.cpp @@ -17,6 +17,7 @@ #include "graphics/draw_calls.hpp" #include "graphics/lod_node.hpp" +#include "graphics/materials.hpp" #include "graphics/stk_mesh_scene_node.hpp" #include "graphics/stk_scene_manager.hpp" #include "graphics/vao_manager.hpp" @@ -500,12 +501,9 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer if (!CVS->supportsIndirectInstancingRendering()) return; - InstanceDataDualTex *InstanceBufferDualTex; - InstanceDataThreeTex *InstanceBufferThreeTex; InstanceDataSingleTex *ShadowInstanceBuffer; InstanceDataSingleTex *RSMInstanceBuffer; GlowInstanceData *GlowInstanceBuffer; - DrawElementsIndirectCommand *CmdBuffer; DrawElementsIndirectCommand *ShadowCmdBuffer; DrawElementsIndirectCommand *RSMCmdBuffer; DrawElementsIndirectCommand *GlowCmdBuffer; @@ -514,12 +512,9 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer if (CVS->supportsAsyncInstanceUpload()) { - InstanceBufferDualTex = (InstanceDataDualTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeDualTex); - InstanceBufferThreeTex = (InstanceDataThreeTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeThreeTex); ShadowInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeShadow); RSMInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeRSM); GlowInstanceBuffer = (GlowInstanceData*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeGlow); - CmdBuffer = SolidPassCmd::getInstance()->Ptr; ShadowCmdBuffer = ShadowPassCmd::getInstance()->Ptr; GlowCmdBuffer = GlowPassCmd::getInstance()->Ptr; RSMCmdBuffer = RSMPassCmd::getInstance()->Ptr; @@ -545,81 +540,7 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer { #pragma omp section { - - //TODO - /*std::vector instanced_lists[Material::SHADERTYPE_COUNT]; - instanced_lists[static_cast(Material::SHADERTYPE_SOLID)] = ListInstancedMatDefault::getInstance()->SolidPass; - instanced_lists[static_cast(Material::SHADERTYPE_ALPHA_TEST)] = ListInstancedMatAlphaRef::getInstance()->SolidPass; - instanced_lists[static_cast(Material::SHADERTYPE_SOLID_UNLIT)] = ListInstancedMatUnlit::getInstance()->SolidPass; - instanced_lists[static_cast(Material::SHADERTYPE_SPHERE_MAP)] = ListInstancedMatSphereMap::getInstance()->SolidPass; - instanced_lists[static_cast(Material::SHADERTYPE_VEGETATION)] = ListInstancedMatGrass::getInstance()->SolidPass; - instanced_lists[static_cast(Material::SHADERTYPE_DETAIL_MAP)] = ListInstancedMatDetails::getInstance()->SolidPass; - instanced_lists[static_cast(Material::SHADERTYPE_NORMAL_MAP)] = ListInstancedMatNormalMap::getInstance()->SolidPass;*/ - m_solid_cmd_buffer.fill(m_solid_pass_mesh); - - - size_t offset = 0, current_cmd = 0; - if (!CVS->supportsAsyncInstanceUpload()) - { - glBindBuffer(GL_ARRAY_BUFFER, VAOManager::getInstance()->getInstanceBuffer(InstanceTypeDualTex)); - InstanceBufferDualTex = (InstanceDataDualTex*)glMapBufferRange(GL_ARRAY_BUFFER, 0, 10000 * sizeof(InstanceDataDualTex), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); - glBindBuffer(GL_DRAW_INDIRECT_BUFFER, SolidPassCmd::getInstance()->drawindirectcmd); - CmdBuffer = (DrawElementsIndirectCommand*)glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, 0, 10000 * sizeof(DrawElementsIndirectCommand), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); - } - - - // Default Material - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID] = current_cmd; - FillInstances(m_solid_pass_mesh[Material::SHADERTYPE_SOLID], - ListInstancedMatDefault::getInstance()->SolidPass, - InstanceBufferDualTex, - CmdBuffer, - offset, - current_cmd, - SolidPoly); - SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_SOLID] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID]; - - // Alpha Ref - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_ALPHA_TEST] = current_cmd; - FillInstances(m_solid_pass_mesh[Material::SHADERTYPE_ALPHA_TEST], ListInstancedMatAlphaRef::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly); - SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_ALPHA_TEST] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_ALPHA_TEST]; - // Unlit - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID_UNLIT] = current_cmd; - FillInstances(m_solid_pass_mesh[Material::SHADERTYPE_SOLID_UNLIT], ListInstancedMatUnlit::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly); - SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_SOLID_UNLIT] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SOLID_UNLIT]; - // Spheremap - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SPHERE_MAP] = current_cmd; - FillInstances(m_solid_pass_mesh[Material::SHADERTYPE_SPHERE_MAP], ListInstancedMatSphereMap::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly); - SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_SPHERE_MAP] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_SPHERE_MAP]; - // Grass - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_VEGETATION] = current_cmd; - FillInstances(m_solid_pass_mesh[Material::SHADERTYPE_VEGETATION], ListInstancedMatGrass::getInstance()->SolidPass, InstanceBufferDualTex, CmdBuffer, offset, current_cmd, SolidPoly); - SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_VEGETATION] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_VEGETATION]; - - if (!CVS->supportsAsyncInstanceUpload()) - { - glUnmapBuffer(GL_ARRAY_BUFFER); - glBindBuffer(GL_ARRAY_BUFFER, VAOManager::getInstance()->getInstanceBuffer(InstanceTypeThreeTex)); - InstanceBufferThreeTex = (InstanceDataThreeTex*)glMapBufferRange(GL_ARRAY_BUFFER, 0, 10000 * sizeof(InstanceDataSingleTex), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); - - } - - // Detail - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_DETAIL_MAP] = current_cmd; - FillInstances(m_solid_pass_mesh[Material::SHADERTYPE_DETAIL_MAP], ListInstancedMatDetails::getInstance()->SolidPass, InstanceBufferThreeTex, CmdBuffer, offset, current_cmd, SolidPoly); - SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_DETAIL_MAP] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_DETAIL_MAP]; - // Normal Map - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_NORMAL_MAP] = current_cmd; - FillInstances(m_solid_pass_mesh[Material::SHADERTYPE_NORMAL_MAP], ListInstancedMatNormalMap::getInstance()->SolidPass, InstanceBufferThreeTex, CmdBuffer, offset, current_cmd, SolidPoly); - SolidPassCmd::getInstance()->Size[Material::SHADERTYPE_NORMAL_MAP] = current_cmd - SolidPassCmd::getInstance()->Offset[Material::SHADERTYPE_NORMAL_MAP]; - - - if (!CVS->supportsAsyncInstanceUpload()) - { - glUnmapBuffer(GL_ARRAY_BUFFER); - glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER); - } } #pragma omp section { @@ -776,3 +697,29 @@ void DrawCalls::multidrawIndirectSolidCmd(Material::ShaderType shader_type) cons { m_solid_cmd_buffer.multidrawIndirect(static_cast(shader_type)); } + +void DrawCalls::drawIndirectSolidFirstPass() const +{ + m_solid_cmd_buffer.drawIndirect(); + m_solid_cmd_buffer.drawIndirect(); + m_solid_cmd_buffer.drawIndirect(); + m_solid_cmd_buffer.drawIndirect(); + m_solid_cmd_buffer.drawIndirect(windDir); + m_solid_cmd_buffer.drawIndirect(); + m_solid_cmd_buffer.drawIndirect(); +} + + +void DrawCalls::drawIndirectSolidSecondPass(const std::vector &prefilled_tex) const +{ + + m_solid_cmd_buffer.drawIndirect2ndPass(prefilled_tex); + m_solid_cmd_buffer.drawIndirect2ndPass(prefilled_tex); + m_solid_cmd_buffer.drawIndirect2ndPass(prefilled_tex); + m_solid_cmd_buffer.drawIndirect2ndPass(prefilled_tex); + m_solid_cmd_buffer.drawIndirect2ndPass(prefilled_tex, windDir, irr_driver->getSunDirection()); + m_solid_cmd_buffer.drawIndirect2ndPass(prefilled_tex); + m_solid_cmd_buffer.drawIndirect2ndPass(prefilled_tex); +} + + diff --git a/src/graphics/draw_calls.hpp b/src/graphics/draw_calls.hpp index c3edacc14..277c13029 100644 --- a/src/graphics/draw_calls.hpp +++ b/src/graphics/draw_calls.hpp @@ -102,6 +102,10 @@ public: { return m_solid_cmd_buffer.isEmpty(shader_type); } void drawIndirectSolidCmd(Material::ShaderType shader_type, int i) const; void multidrawIndirectSolidCmd(Material::ShaderType shader_type) const; + + void drawIndirectSolidFirstPass() const; + //void multidrawIndirectSolidCmd() const; //TODO + void drawIndirectSolidSecondPass(const std::vector &prefilled_tex) const; }; #endif //HEADER_DRAW_CALLS_HPP diff --git a/src/graphics/geometry_passes.cpp b/src/graphics/geometry_passes.cpp index b5f3c7f22..86d74323e 100644 --- a/src/graphics/geometry_passes.cpp +++ b/src/graphics/geometry_passes.cpp @@ -77,612 +77,6 @@ layout(location = 6) in vec3 Bitangent; */ -// ============================================================================ -class InstancedObjectPass1Shader : public TextureShader -{ -public: - InstancedObjectPass1Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_FRAGMENT_SHADER, "utils/encode_normal.frag", - GL_FRAGMENT_SHADER, "instanced_object_pass1.frag"); - - assignUniforms(); - assignSamplerNames(0, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedObjectPass1Shader -}; // class InstancedObjectPass1Shader - -// ============================================================================ -class InstancedObjectRefPass1Shader : public TextureShader -{ -public: - InstancedObjectRefPass1Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_FRAGMENT_SHADER, "utils/encode_normal.frag", - GL_FRAGMENT_SHADER, "instanced_objectref_pass1.frag"); - - assignUniforms(); - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } - -}; // InstancedObjectRefPass1Shader - -// ============================================================================ -class ObjectRefPass2Shader : public TextureShader -{ -public: - ObjectRefPass2Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "objectref_pass2.frag"); - assignUniforms("ModelMatrix", "TextureMatrix"); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // ObjectRefPass2Shader -}; // ObjectRefPass2Shader - -// ============================================================================ -class InstancedObjectPass2Shader : public TextureShader -{ -public: - InstancedObjectPass2Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "instanced_object_pass2.frag"); - assignUniforms(); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedObjectPass2Shader -}; // InstancedObjectPass2Shader - -// ============================================================================ -class InstancedObjectRefPass2Shader : public TextureShader -{ -public: - InstancedObjectRefPass2Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "instanced_objectref_pass2.frag"); - assignUniforms(); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedObjectRefPass2Shader -}; // InstancedObjectRefPass2Shader - -// ============================================================================ -class ShadowShader : public TextureShader -{ -public: - ShadowShader() - { - // Geometry shader needed - if (CVS->getGLSLVersion() < 150) - return; - if (CVS->isAMDVertexShaderLayerUsable()) - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow.vert", - GL_FRAGMENT_SHADER, "shadow.frag"); - } - else - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow.vert", - GL_GEOMETRY_SHADER, "shadow.geom", - GL_FRAGMENT_SHADER, "shadow.frag"); - } - assignUniforms("ModelMatrix", "layer"); - } // ShadowShader -}; // ShadowShader - -// ============================================================================ -class InstancedShadowShader : public TextureShader -{ -public: - InstancedShadowShader() - { - // Geometry shader needed - if (CVS->getGLSLVersion() < 150) - return; - if (CVS->isAMDVertexShaderLayerUsable()) - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanciedshadow.vert", - GL_FRAGMENT_SHADER, "shadow.frag"); - } - else - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanciedshadow.vert", - GL_GEOMETRY_SHADER, "instanced_shadow.geom", - GL_FRAGMENT_SHADER, "shadow.frag"); - } - assignUniforms("layer"); - } // InstancedShadowShader - -}; // InstancedShadowShader - -// ============================================================================ -// reflective shadow map -class CRSMShader : public TextureShader -{ -public: - CRSMShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "rsm.vert", - GL_FRAGMENT_SHADER, "rsm.frag"); - - assignUniforms("ModelMatrix", "TextureMatrix", "RSMMatrix"); - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // CRSMShader -}; // CRSMShader - - -// ============================================================================ -class SplattingRSMShader : public TextureShader -{ -public: - SplattingRSMShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "rsm.vert", - GL_FRAGMENT_SHADER, "splatting_rsm.frag"); - - assignUniforms("ModelMatrix", "RSMMatrix"); - assignSamplerNames(0, "tex_layout", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 1, "tex_detail0", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 2, "tex_detail1", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 3, "tex_detail2", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 4, "tex_detail3", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // SplattingRSMShader - -}; // SplattingRSMShader - -// ============================================================================ -class CInstancedRSMShader : public TextureShader -{ -public: - CInstancedRSMShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_rsm.vert", - GL_FRAGMENT_SHADER, "instanced_rsm.frag"); - - assignUniforms("RSMMatrix"); - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // CInstancedRSMShader -}; // CInstancedRSMShader - - -// ============================================================================ -class SphereMapShader : public TextureShader -{ -public: - SphereMapShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "utils/getPosFromUVDepth.frag", - GL_FRAGMENT_SHADER, "objectpass_spheremap.frag"); - assignUniforms("ModelMatrix", "InverseModelMatrix"); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // SphereMapShader -}; // SphereMapShader - -// ============================================================================ -class InstancedSphereMapShader : public TextureShader -{ -public: - InstancedSphereMapShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "utils/getPosFromUVDepth.frag", - GL_FRAGMENT_SHADER, "instanced_objectpass_spheremap.frag"); - assignUniforms(); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedSphereMapShader -}; // InstancedSphereMapShader - -// ============================================================================ -class SplattingShader : public TextureShader -{ -public: - SplattingShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "splatting.frag"); - assignUniforms("ModelMatrix"); - - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "tex_layout", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 4, "tex_detail0", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 5, "tex_detail1", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 6, "tex_detail2", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 7, "tex_detail3", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // SplattingShader -}; // SplattingShader - -// ============================================================================ -class ObjectRefPass1Shader : public TextureShader -{ -public: - ObjectRefPass1Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", - GL_FRAGMENT_SHADER, "utils/encode_normal.frag", - GL_FRAGMENT_SHADER, "objectref_pass1.frag"); - assignUniforms("ModelMatrix", "InverseModelMatrix", "TextureMatrix"); - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // ObjectRefPass1Shader -}; // ObjectRefPass1Shader - - -// ============================================================================ -class NormalMapShader : public TextureShader -{ -public: - NormalMapShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", - GL_FRAGMENT_SHADER, "utils/encode_normal.frag", - GL_FRAGMENT_SHADER, "normalmap.frag"); - assignUniforms("ModelMatrix", "InverseModelMatrix"); - assignSamplerNames(1, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 0, "DiffuseForAlpha", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // NormalMapShader - -}; // NormalMapShader - -// ============================================================================ -class InstancedNormalMapShader : public TextureShader -{ -public: - InstancedNormalMapShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_FRAGMENT_SHADER, "utils/encode_normal.frag", - GL_FRAGMENT_SHADER, "instanced_normalmap.frag"); - assignUniforms(); - assignSamplerNames(0, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 1, "glossMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedNormalMapShader -}; // InstancedNormalMapShader - -// ============================================================================ -class ObjectUnlitShader : public TextureShader -{ -public: - ObjectUnlitShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", - GL_FRAGMENT_SHADER, "object_unlit.frag"); - assignUniforms("ModelMatrix", "TextureMatrix"); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // ObjectUnlitShader -}; // ObjectUnlitShader - -// ============================================================================ -class InstancedObjectUnlitShader : public TextureShader -{ -public: - InstancedObjectUnlitShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_FRAGMENT_SHADER, "instanced_object_unlit.frag"); - assignUniforms(); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedObjectUnlitShader -}; // InstancedObjectUnlitShader - -// ============================================================================ -class RefShadowShader : public TextureShader -{ -public: - RefShadowShader() - { - // Geometry shader needed - if (CVS->getGLSLVersion() < 150) - return; - if (CVS->isAMDVertexShaderLayerUsable()) - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow.vert", - GL_FRAGMENT_SHADER, "shadowref.frag"); - } - else - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow.vert", - GL_GEOMETRY_SHADER, "shadow.geom", - GL_FRAGMENT_SHADER, "shadowref.frag"); - } - assignUniforms("ModelMatrix", "layer"); - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // RefShadowShader -}; // RefShadowShader - -// ============================================================================ -class InstancedRefShadowShader : public TextureShader -{ -public: - InstancedRefShadowShader() - { - // Geometry shader needed - if (CVS->getGLSLVersion() < 150) - return; - if (CVS->isAMDVertexShaderLayerUsable()) - { - loadProgram(OBJECT,GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanciedshadow.vert", - GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); - } - else - { - loadProgram(OBJECT,GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanciedshadow.vert", - GL_GEOMETRY_SHADER, "instanced_shadow.geom", - GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); - } - assignUniforms("layer"); - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedRefShadowShader -}; // InstancedRefShadowShader - -// ============================================================================ -class DisplaceMaskShader : public Shader -{ -public: - DisplaceMaskShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "displace.vert", - GL_FRAGMENT_SHADER, "white.frag"); - assignUniforms("ModelMatrix"); - } // DisplaceMaskShader -}; // DisplaceMaskShader - -// ============================================================================ -class DisplaceShader : public TextureShader -{ -public: - DisplaceShader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "displace.vert", - GL_FRAGMENT_SHADER, "displace.frag"); - assignUniforms("ModelMatrix", "dir", "dir2"); - - assignSamplerNames(0, "displacement_tex", ST_BILINEAR_FILTERED, - 1, "color_tex", ST_BILINEAR_FILTERED, - 2, "mask_tex", ST_BILINEAR_FILTERED, - 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // DisplaceShader -}; // DisplaceShader - -// ============================================================================ -class NormalVisualizer : public Shader -{ -public: - NormalVisualizer() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_GEOMETRY_SHADER, "normal_visualizer.geom", - GL_FRAGMENT_SHADER, "coloredquad.frag"); - assignUniforms("color"); - } // NormalVisualizer -}; // NormalVisualizer - -// ============================================================================ -class GrassPass1Shader : public TextureShader -{ -public: - GrassPass1Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "grass_pass.vert", - GL_FRAGMENT_SHADER, "utils/encode_normal.frag", - GL_FRAGMENT_SHADER, "objectref_pass1.frag"); - assignUniforms("ModelMatrix", "InverseModelMatrix", "windDir"); - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // GrassPass1Shader - -}; // class GrassPass1Shader - -// ============================================================================ -class InstancedGrassPass1Shader : public TextureShader -{ -public: - InstancedGrassPass1Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_grass.vert", - GL_FRAGMENT_SHADER, "utils/encode_normal.frag", - GL_FRAGMENT_SHADER, "instanced_objectref_pass1.frag"); - assignUniforms("windDir"); - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedGrassPass1Shader -}; // InstancedGrassPass1Shader - -// ============================================================================ -class GrassShadowShader : public TextureShader -{ -public: - GrassShadowShader() - { - // Geometry shader needed - if (CVS->getGLSLVersion() < 150) - return; - if (CVS->isAMDVertexShaderLayerUsable()) - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow_grass.vert", - GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); - } - else - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow_grass.vert", - GL_GEOMETRY_SHADER, "shadow.geom", - GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); - } - assignUniforms("ModelMatrix", "windDir", "layer"); //TODO: check if order is correct - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // GrassShadowShader -}; // GrassShadowShader - -// ============================================================================ -class InstancedGrassShadowShader : public TextureShader -{ -public: - InstancedGrassShadowShader() - { - // Geometry shader needed - if (CVS->getGLSLVersion() < 150) - return; - if (CVS->isAMDVertexShaderLayerUsable()) - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanciedgrassshadow.vert", - GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); - } - else - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanciedgrassshadow.vert", - GL_GEOMETRY_SHADER, "instanced_shadow.geom", - GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); - } - - assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); - assignUniforms("windDir", "layer"); - } // InstancedGrassShadowShader -}; // InstancedGrassShadowShader - - -// ============================================================================ -class GrassPass2Shader : public TextureShader -{ -public: - GrassPass2Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "grass_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "grass_pass2.frag"); - assignUniforms("ModelMatrix", "windDir"); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // GrassPass2Shader -}; // GrassPass2Shader - -// ============================================================================ -class InstancedGrassPass2Shader : public TextureShader -{ -public: - InstancedGrassPass2Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_grass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "instanced_grass_pass2.frag"); - assignUniforms("windDir", "SunDir"); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "dtex", ST_NEAREST_FILTERED, - 4, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 5, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedGrassPass2Shader -}; // InstancedGrassPass2Shader - -// ============================================================================ -class DetailedObjectPass2Shader : public TextureShader -{ -public: - DetailedObjectPass2Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "detailed_object_pass2.frag"); - assignUniforms("ModelMatrix"); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 4, "Detail", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 5, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // DetailedObjectPass2Shader -}; // DetailedObjectPass2Shader - -// ============================================================================ -class InstancedDetailedObjectPass2Shader : public TextureShader -{ -public: - InstancedDetailedObjectPass2Shader() - { - loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", - GL_VERTEX_SHADER, "instanced_object_pass.vert", - GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", - GL_FRAGMENT_SHADER, "instanced_detailed_object_pass2.frag"); - assignUniforms(); - assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, - 1, "SpecularMap", ST_NEAREST_FILTERED, - 2, "SSAO", ST_BILINEAR_FILTERED, - 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 4, "Detail", ST_TRILINEAR_ANISOTROPIC_FILTERED, - 5, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); - } // InstancedDetailedObjectPass2Shader -}; // InstancedDetailedObjectPass2Shader // ============================================================================ @@ -853,13 +247,7 @@ void GeometryPasses::renderSolidFirstPass(const DrawCalls& draw_calls) } else if (CVS->supportsIndirectInstancingRendering()) { - renderInstancedMeshes1stPass(draw_calls); - renderInstancedMeshes1stPass(draw_calls); - renderInstancedMeshes1stPass(draw_calls); - renderInstancedMeshes1stPass(draw_calls); - renderInstancedMeshes1stPass(draw_calls, m_wind_dir); - renderInstancedMeshes1stPass(draw_calls); - renderInstancedMeshes1stPass(draw_calls); + draw_calls.drawIndirectSolidFirstPass(); } } } // renderSolidFirstPass @@ -1029,31 +417,12 @@ void GeometryPasses::renderSolidSecondPass( const DrawCalls& draw_calls, } else if (CVS->supportsIndirectInstancingRendering()) { - renderInstancedMeshes2ndPass(draw_calls, DiffSpecSSAOTex); - renderInstancedMeshes2ndPass(draw_calls, DiffSpecSSAOTex); - renderInstancedMeshes2ndPass(draw_calls, DiffSpecSSAOTex); - renderInstancedMeshes2ndPass(draw_calls, DiffSpecSSAOTex); - renderInstancedMeshes2ndPass(draw_calls, DiffSpecSSAOTex); - renderInstancedMeshes2ndPass(draw_calls, DiffSpecSSAOTex); - - // template does not work with template due to extra depth texture - { - std::vector &meshes = GrassMat::InstancedList::getInstance()->SolidPass; - GrassMat::InstancedSecondPassShader::getInstance()->use(); - glBindVertexArray(VAOManager::getInstance() - ->getInstanceVAO(GrassMat::VertexType, GrassMat::Instance)); - for (unsigned i = 0; i < meshes.size(); i++) - { - GLMesh *mesh = meshes[i]; - TexExpander - ::expandTex(*mesh, GrassMat::SecondPassTextures, DiffSpecSSAOTex[0], - DiffSpecSSAOTex[1], DiffSpecSSAOTex[2], - irr_driver->getDepthStencilTexture()); - GrassMat::InstancedSecondPassShader::getInstance() - ->setUniforms(m_wind_dir, irr_driver->getSunDirection()); - draw_calls.drawIndirectSolidCmd(GrassMat::MaterialType, i); - } - } + std::vector prefilled_tex = + createVector(render_target_diffuse, + render_target_specular, + render_target_half_red, + irr_driver->getDepthStencilTexture()); + draw_calls.drawIndirectSolidSecondPass(prefilled_tex); } } } // renderSolidSecondPass diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index 118686a06..fee7b972b 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -814,7 +814,6 @@ void IrrDriver::applyResolutionSettings() // (we're sure to update main.cpp at some point and forget this one...) ShaderBase::updateShaders(); VAOManager::getInstance()->kill(); - SolidPassCmd::getInstance()->kill(); ShadowPassCmd::getInstance()->kill(); RSMPassCmd::getInstance()->kill(); GlowPassCmd::getInstance()->kill(); diff --git a/src/graphics/materials.hpp b/src/graphics/materials.hpp index a8a742f86..bbf1ad020 100644 --- a/src/graphics/materials.hpp +++ b/src/graphics/materials.hpp @@ -23,11 +23,10 @@ #include "graphics/stk_mesh.hpp" #include "graphics/vao_manager.hpp" -class InstancedObjectPass1Shader; +/*class InstancedObjectPass1Shader; class InstancedObjectPass2Shader; class InstancedShadowShader; class CInstancedRSMShader; -class ListInstancedMatDefault; class ShadowShader; class CRSMShader; class InstancedObjectRefPass1Shader; @@ -51,7 +50,617 @@ class NormalMapShader; class InstancedDetailedObjectPass2Shader; class DetailedObjectPass2Shader; class SplattingShader; -class SplattingRSMShader; +class SplattingRSMShader;*/ + +// ============================================================================ +class InstancedObjectPass1Shader : public TextureShader +{ +public: + InstancedObjectPass1Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_FRAGMENT_SHADER, "utils/encode_normal.frag", + GL_FRAGMENT_SHADER, "instanced_object_pass1.frag"); + + assignUniforms(); + assignSamplerNames(0, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedObjectPass1Shader +}; // class InstancedObjectPass1Shader + +// ============================================================================ +class InstancedObjectRefPass1Shader : public TextureShader +{ +public: + InstancedObjectRefPass1Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_FRAGMENT_SHADER, "utils/encode_normal.frag", + GL_FRAGMENT_SHADER, "instanced_objectref_pass1.frag"); + + assignUniforms(); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } + +}; // InstancedObjectRefPass1Shader + +// ============================================================================ +class ObjectRefPass2Shader : public TextureShader +{ +public: + ObjectRefPass2Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "objectref_pass2.frag"); + assignUniforms("ModelMatrix", "TextureMatrix"); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // ObjectRefPass2Shader +}; // ObjectRefPass2Shader + +// ============================================================================ +class InstancedObjectPass2Shader : public TextureShader +{ +public: + InstancedObjectPass2Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "instanced_object_pass2.frag"); + assignUniforms(); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedObjectPass2Shader +}; // InstancedObjectPass2Shader + +// ============================================================================ +class InstancedObjectRefPass2Shader : public TextureShader +{ +public: + InstancedObjectRefPass2Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "instanced_objectref_pass2.frag"); + assignUniforms(); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedObjectRefPass2Shader +}; // InstancedObjectRefPass2Shader + +// ============================================================================ +class ShadowShader : public TextureShader +{ +public: + ShadowShader() + { + // Geometry shader needed + if (CVS->getGLSLVersion() < 150) + return; + if (CVS->isAMDVertexShaderLayerUsable()) + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow.vert", + GL_FRAGMENT_SHADER, "shadow.frag"); + } + else + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow.vert", + GL_GEOMETRY_SHADER, "shadow.geom", + GL_FRAGMENT_SHADER, "shadow.frag"); + } + assignUniforms("ModelMatrix", "layer"); + } // ShadowShader +}; // ShadowShader + +// ============================================================================ +class InstancedShadowShader : public TextureShader +{ +public: + InstancedShadowShader() + { + // Geometry shader needed + if (CVS->getGLSLVersion() < 150) + return; + if (CVS->isAMDVertexShaderLayerUsable()) + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanciedshadow.vert", + GL_FRAGMENT_SHADER, "shadow.frag"); + } + else + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanciedshadow.vert", + GL_GEOMETRY_SHADER, "instanced_shadow.geom", + GL_FRAGMENT_SHADER, "shadow.frag"); + } + assignUniforms("layer"); + } // InstancedShadowShader + +}; // InstancedShadowShader + +// ============================================================================ +// reflective shadow map +class CRSMShader : public TextureShader +{ +public: + CRSMShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "rsm.vert", + GL_FRAGMENT_SHADER, "rsm.frag"); + + assignUniforms("ModelMatrix", "TextureMatrix", "RSMMatrix"); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // CRSMShader +}; // CRSMShader + + +// ============================================================================ +class SplattingRSMShader : public TextureShader +{ +public: + SplattingRSMShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "rsm.vert", + GL_FRAGMENT_SHADER, "splatting_rsm.frag"); + + assignUniforms("ModelMatrix", "RSMMatrix"); + assignSamplerNames(0, "tex_layout", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 1, "tex_detail0", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 2, "tex_detail1", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 3, "tex_detail2", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 4, "tex_detail3", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // SplattingRSMShader + +}; // SplattingRSMShader + +// ============================================================================ +class CInstancedRSMShader : public TextureShader +{ +public: + CInstancedRSMShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_rsm.vert", + GL_FRAGMENT_SHADER, "instanced_rsm.frag"); + + assignUniforms("RSMMatrix"); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // CInstancedRSMShader +}; // CInstancedRSMShader + + +// ============================================================================ +class SphereMapShader : public TextureShader +{ +public: + SphereMapShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "utils/getPosFromUVDepth.frag", + GL_FRAGMENT_SHADER, "objectpass_spheremap.frag"); + assignUniforms("ModelMatrix", "InverseModelMatrix"); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // SphereMapShader +}; // SphereMapShader + +// ============================================================================ +class InstancedSphereMapShader : public TextureShader +{ +public: + InstancedSphereMapShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "utils/getPosFromUVDepth.frag", + GL_FRAGMENT_SHADER, "instanced_objectpass_spheremap.frag"); + assignUniforms(); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedSphereMapShader +}; // InstancedSphereMapShader + +// ============================================================================ +class SplattingShader : public TextureShader +{ +public: + SplattingShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "splatting.frag"); + assignUniforms("ModelMatrix"); + + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "tex_layout", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 4, "tex_detail0", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 5, "tex_detail1", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 6, "tex_detail2", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 7, "tex_detail3", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // SplattingShader +}; // SplattingShader + +// ============================================================================ +class ObjectRefPass1Shader : public TextureShader +{ +public: + ObjectRefPass1Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", + GL_FRAGMENT_SHADER, "utils/encode_normal.frag", + GL_FRAGMENT_SHADER, "objectref_pass1.frag"); + assignUniforms("ModelMatrix", "InverseModelMatrix", "TextureMatrix"); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // ObjectRefPass1Shader +}; // ObjectRefPass1Shader + + +// ============================================================================ +class NormalMapShader : public TextureShader +{ +public: + NormalMapShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", + GL_FRAGMENT_SHADER, "utils/encode_normal.frag", + GL_FRAGMENT_SHADER, "normalmap.frag"); + assignUniforms("ModelMatrix", "InverseModelMatrix"); + assignSamplerNames(1, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 0, "DiffuseForAlpha", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // NormalMapShader + +}; // NormalMapShader + +// ============================================================================ +class InstancedNormalMapShader : public TextureShader +{ +public: + InstancedNormalMapShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_FRAGMENT_SHADER, "utils/encode_normal.frag", + GL_FRAGMENT_SHADER, "instanced_normalmap.frag"); + assignUniforms(); + assignSamplerNames(0, "normalMap", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 1, "glossMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedNormalMapShader +}; // InstancedNormalMapShader + +// ============================================================================ +class ObjectUnlitShader : public TextureShader +{ +public: + ObjectUnlitShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", + GL_FRAGMENT_SHADER, "object_unlit.frag"); + assignUniforms("ModelMatrix", "TextureMatrix"); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // ObjectUnlitShader +}; // ObjectUnlitShader + +// ============================================================================ +class InstancedObjectUnlitShader : public TextureShader +{ +public: + InstancedObjectUnlitShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_FRAGMENT_SHADER, "instanced_object_unlit.frag"); + assignUniforms(); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedObjectUnlitShader +}; // InstancedObjectUnlitShader + +// ============================================================================ +class RefShadowShader : public TextureShader +{ +public: + RefShadowShader() + { + // Geometry shader needed + if (CVS->getGLSLVersion() < 150) + return; + if (CVS->isAMDVertexShaderLayerUsable()) + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow.vert", + GL_FRAGMENT_SHADER, "shadowref.frag"); + } + else + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow.vert", + GL_GEOMETRY_SHADER, "shadow.geom", + GL_FRAGMENT_SHADER, "shadowref.frag"); + } + assignUniforms("ModelMatrix", "layer"); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // RefShadowShader +}; // RefShadowShader + +// ============================================================================ +class InstancedRefShadowShader : public TextureShader +{ +public: + InstancedRefShadowShader() + { + // Geometry shader needed + if (CVS->getGLSLVersion() < 150) + return; + if (CVS->isAMDVertexShaderLayerUsable()) + { + loadProgram(OBJECT,GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanciedshadow.vert", + GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); + } + else + { + loadProgram(OBJECT,GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanciedshadow.vert", + GL_GEOMETRY_SHADER, "instanced_shadow.geom", + GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); + } + assignUniforms("layer"); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedRefShadowShader +}; // InstancedRefShadowShader + +// ============================================================================ +class DisplaceMaskShader : public Shader +{ +public: + DisplaceMaskShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "displace.vert", + GL_FRAGMENT_SHADER, "white.frag"); + assignUniforms("ModelMatrix"); + } // DisplaceMaskShader +}; // DisplaceMaskShader + +// ============================================================================ +class DisplaceShader : public TextureShader +{ +public: + DisplaceShader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "displace.vert", + GL_FRAGMENT_SHADER, "displace.frag"); + assignUniforms("ModelMatrix", "dir", "dir2"); + + assignSamplerNames(0, "displacement_tex", ST_BILINEAR_FILTERED, + 1, "color_tex", ST_BILINEAR_FILTERED, + 2, "mask_tex", ST_BILINEAR_FILTERED, + 3, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // DisplaceShader +}; // DisplaceShader + +// ============================================================================ +class NormalVisualizer : public Shader +{ +public: + NormalVisualizer() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_GEOMETRY_SHADER, "normal_visualizer.geom", + GL_FRAGMENT_SHADER, "coloredquad.frag"); + assignUniforms("color"); + } // NormalVisualizer +}; // NormalVisualizer + +// ============================================================================ +class GrassPass1Shader : public TextureShader +{ +public: + GrassPass1Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "grass_pass.vert", + GL_FRAGMENT_SHADER, "utils/encode_normal.frag", + GL_FRAGMENT_SHADER, "objectref_pass1.frag"); + assignUniforms("ModelMatrix", "InverseModelMatrix", "windDir"); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // GrassPass1Shader + +}; // class GrassPass1Shader + +// ============================================================================ +class InstancedGrassPass1Shader : public TextureShader +{ +public: + InstancedGrassPass1Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_grass.vert", + GL_FRAGMENT_SHADER, "utils/encode_normal.frag", + GL_FRAGMENT_SHADER, "instanced_objectref_pass1.frag"); + assignUniforms("windDir"); + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 1, "glosstex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedGrassPass1Shader +}; // InstancedGrassPass1Shader + +// ============================================================================ +class GrassShadowShader : public TextureShader +{ +public: + GrassShadowShader() + { + // Geometry shader needed + if (CVS->getGLSLVersion() < 150) + return; + if (CVS->isAMDVertexShaderLayerUsable()) + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow_grass.vert", + GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); + } + else + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "shadow_grass.vert", + GL_GEOMETRY_SHADER, "shadow.geom", + GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); + } + assignUniforms("ModelMatrix", "windDir", "layer"); //TODO: check if order is correct + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // GrassShadowShader +}; // GrassShadowShader + +// ============================================================================ +class InstancedGrassShadowShader : public TextureShader +{ +public: + InstancedGrassShadowShader() + { + // Geometry shader needed + if (CVS->getGLSLVersion() < 150) + return; + if (CVS->isAMDVertexShaderLayerUsable()) + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanciedgrassshadow.vert", + GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); + } + else + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanciedgrassshadow.vert", + GL_GEOMETRY_SHADER, "instanced_shadow.geom", + GL_FRAGMENT_SHADER, "instanced_shadowref.frag"); + } + + assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED); + assignUniforms("windDir", "layer"); + } // InstancedGrassShadowShader +}; // InstancedGrassShadowShader + + +// ============================================================================ +class GrassPass2Shader : public TextureShader +{ +public: + GrassPass2Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "grass_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "grass_pass2.frag"); + assignUniforms("ModelMatrix", "windDir"); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 4, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // GrassPass2Shader +}; // GrassPass2Shader + +// ============================================================================ +class InstancedGrassPass2Shader : public TextureShader +{ +public: + InstancedGrassPass2Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_grass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "instanced_grass_pass2.frag"); + assignUniforms("windDir", "SunDir"); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "dtex", ST_NEAREST_FILTERED, + 4, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 5, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedGrassPass2Shader +}; // InstancedGrassPass2Shader + +// ============================================================================ +class DetailedObjectPass2Shader : public TextureShader +{ +public: + DetailedObjectPass2Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "object_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "detailed_object_pass2.frag"); + assignUniforms("ModelMatrix"); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 4, "Detail", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 5, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // DetailedObjectPass2Shader +}; // DetailedObjectPass2Shader + +// ============================================================================ +class InstancedDetailedObjectPass2Shader : public TextureShader +{ +public: + InstancedDetailedObjectPass2Shader() + { + loadProgram(OBJECT, GL_VERTEX_SHADER, "utils/getworldmatrix.vert", + GL_VERTEX_SHADER, "instanced_object_pass.vert", + GL_FRAGMENT_SHADER, "utils/getLightFactor.frag", + GL_FRAGMENT_SHADER, "instanced_detailed_object_pass2.frag"); + assignUniforms(); + assignSamplerNames(0, "DiffuseMap", ST_NEAREST_FILTERED, + 1, "SpecularMap", ST_NEAREST_FILTERED, + 2, "SSAO", ST_BILINEAR_FILTERED, + 3, "Albedo", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 4, "Detail", ST_TRILINEAR_ANISOTROPIC_FILTERED, + 5, "SpecMap", ST_TRILINEAR_ANISOTROPIC_FILTERED); + } // InstancedDetailedObjectPass2Shader +}; // InstancedDetailedObjectPass2Shader + + + // ============================================================================ diff --git a/src/graphics/shader_based_renderer.cpp b/src/graphics/shader_based_renderer.cpp index 8913b469b..6a85b8ff6 100644 --- a/src/graphics/shader_based_renderer.cpp +++ b/src/graphics/shader_based_renderer.cpp @@ -216,7 +216,6 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode, glClearColor(0., 0., 0., 0.); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); m_geometry_passes.renderSolidFirstPass(m_draw_calls); - //m_solid_first_pass->render(m_wind_dir); } else { @@ -491,17 +490,10 @@ void ShaderBasedRenderer::renderPostProcessing(Camera * const camera) ShaderBasedRenderer::ShaderBasedRenderer() { - if (CVS->isAZDOEnabled()) - m_solid_first_pass = new AZDOSolidFirstPass(); - else if (CVS->supportsIndirectInstancingRendering()) - m_solid_first_pass = new IndirectInstancedSolidFirstPass(); - else - m_solid_first_pass = new GL3SolidFirstPass(); } ShaderBasedRenderer::~ShaderBasedRenderer() { - delete m_solid_first_pass; } void ShaderBasedRenderer::addSunLight(const core::vector3df &pos) { diff --git a/src/graphics/shader_based_renderer.hpp b/src/graphics/shader_based_renderer.hpp index 0624e05e2..e6a99d46c 100644 --- a/src/graphics/shader_based_renderer.hpp +++ b/src/graphics/shader_based_renderer.hpp @@ -23,7 +23,6 @@ #include "graphics/geometry_passes.hpp" #include "graphics/lighting_passes.hpp" #include "graphics/shadow_matrices.hpp" -#include "graphics/solid_first_pass.hpp" class ShaderBasedRenderer: public AbstractRenderer @@ -37,7 +36,6 @@ private: ShadowMatrices m_shadow_matrices; irr::core::vector3df m_wind_dir; - SolidFirstPass *m_solid_first_pass; void compressPowerUpTextures(); void setOverrideMaterial(); diff --git a/src/graphics/solid_first_pass.cpp b/src/graphics/solid_first_pass.cpp deleted file mode 100644 index 0c8e70b3f..000000000 --- a/src/graphics/solid_first_pass.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// SuperTuxKart - a fun racing game with go-kart -// Copyright (C) 2015 SuperTuxKart-Team -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 3 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - -/* -#include "graphics/solid_first_pass.hpp" -#include "graphics/glwrap.hpp" -#include "graphics/irr_driver.hpp" -#include "graphics/stk_scene_manager.hpp" -#include "utils/profiler.hpp" - - -void GL3SolidFirstPass::render(const DrawCalls& draw_calls, irr::core::vector3df wind_dir) -{ - ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_SOLID_PASS1)); - irr_driver->setPhase(SOLID_NORMAL_AND_DEPTH_PASS); - - draw_calls.renderImmediateDrawList(); - - -} - -void IndirectInstancedSolidFirstPass::render(const DrawCalls& draw_calls, irr::core::vector3df wind_dir) -{ - glBindBuffer(GL_DRAW_INDIRECT_BUFFER, SolidPassCmd::getInstance()->drawindirectcmd); - - ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_SOLID_PASS1)); - irr_driver->setPhase(SOLID_NORMAL_AND_DEPTH_PASS); - - draw_calls.renderImmediateDrawList(); - - - - -} - -void AZDOSolidFirstPass::render(const DrawCalls& draw_calls, irr::core::vector3df wind_dir) -{ - glBindBuffer(GL_DRAW_INDIRECT_BUFFER, SolidPassCmd::getInstance()->drawindirectcmd); - - ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_SOLID_PASS1)); - irr_driver->setPhase(SOLID_NORMAL_AND_DEPTH_PASS); - - draw_calls.renderImmediateDrawList(); - - - -} -*/ diff --git a/src/graphics/solid_first_pass.hpp b/src/graphics/solid_first_pass.hpp deleted file mode 100644 index 492734590..000000000 --- a/src/graphics/solid_first_pass.hpp +++ /dev/null @@ -1,52 +0,0 @@ -// SuperTuxKart - a fun racing game with go-kart -// Copyright (C) 2015 SuperTuxKart-Team -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 3 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#ifndef HEADER_SOLID_FIRST_PASS_HPP -#define HEADER_SOLID_FIRST_PASS_HPP - -#include "graphics/draw_calls.hpp" -#include - -class SolidFirstPass -{ -public: - virtual ~SolidFirstPass(){} - virtual void render(const DrawCalls& draw_calls, irr::core::vector3df wind_dir) = 0; -}; - -/** This class only uses OpenGL3.x functions */ -/*class GL3SolidFirstPass: public SolidFirstPass -{ - void render(const DrawCalls& draw_calls, irr::core::vector3df wind_dir); -};*/ - -/** Require GL_ARB_base_instance and GL_ARB_draw_indirect extensions */ -/*class IndirectInstancedSolidFirstPass: public SolidFirstPass -{ - void render(const DrawCalls& draw_calls, irr::core::vector3df wind_dir); -};*/ - -/** AZDO: Approaching Zero Driver Overhead - * Require GL_ARB_base_instance, GL_ARB_draw_indirect, - * GL_ARB_bindless_texture and GL_ARB_multi_draw_indirect extensions */ -/*class AZDOSolidFirstPass: public SolidFirstPass -{ - void render(const DrawCalls& draw_calls, irr::core::vector3df wind_dir); -};*/ - - -#endif //HEADER_SOLID_FIRST_PASS_HPP diff --git a/src/graphics/stk_scene_manager.hpp b/src/graphics/stk_scene_manager.hpp index 235372120..d39bebcbe 100644 --- a/src/graphics/stk_scene_manager.hpp +++ b/src/graphics/stk_scene_manager.hpp @@ -61,12 +61,6 @@ public: }; -class SolidPassCmd : public CommandBufferOld(Material::SHADERTYPE_COUNT)> -{ -public: - size_t Offset[Material::SHADERTYPE_COUNT], Size[Material::SHADERTYPE_COUNT]; -}; - class ShadowPassCmd : public CommandBufferOld(Material::SHADERTYPE_COUNT)> { public: