Removed singleton class SolidPassCmd
This commit is contained in:
parent
c1eb0bbe73
commit
84592ef631
@ -18,6 +18,7 @@
|
|||||||
#include "graphics/command_buffer.hpp"
|
#include "graphics/command_buffer.hpp"
|
||||||
#include "graphics/central_settings.hpp"
|
#include "graphics/central_settings.hpp"
|
||||||
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
void InstanceFiller<InstanceDataSingleTex>::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataSingleTex &instance)
|
void InstanceFiller<InstanceDataSingleTex>::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataSingleTex &instance)
|
||||||
{
|
{
|
||||||
@ -50,6 +51,35 @@
|
|||||||
instance.Color = nd->getGlowColor().color;
|
instance.Color = nd->getGlowColor().color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void expandTexSecondPass<GrassMat>(const GLMesh &mesh,
|
||||||
|
const std::vector<GLuint> &prefilled_tex)
|
||||||
|
{
|
||||||
|
TexExpander<typename GrassMat::InstancedSecondPassShader>::template
|
||||||
|
expandTex(mesh, GrassMat::SecondPassTextures, prefilled_tex[0],
|
||||||
|
prefilled_tex[1], prefilled_tex[2], prefilled_tex[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void CommandBuffer::fillMaterial(int material_id,
|
||||||
|
MeshMap *mesh_map,
|
||||||
|
T *instance_buffer)
|
||||||
|
{
|
||||||
|
m_offset[material_id] = m_command_buffer_offset;
|
||||||
|
FillInstances<T>(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():
|
CommandBuffer::CommandBuffer():
|
||||||
m_offset(NULL), m_size(NULL), m_poly_count(0)
|
m_offset(NULL), m_size(NULL), m_poly_count(0)
|
||||||
@ -83,23 +113,6 @@ CommandBuffer::~CommandBuffer()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void CommandBuffer::fillMaterial(int material_id,
|
|
||||||
MeshMap *mesh_map,
|
|
||||||
T *instance_buffer)
|
|
||||||
{
|
|
||||||
m_offset[material_id] = m_command_buffer_offset;
|
|
||||||
FillInstances<T>(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()
|
SolidCommandBuffer::SolidCommandBuffer(): CommandBuffer()
|
||||||
{
|
{
|
||||||
m_meshes = new std::vector<GLMesh *>[static_cast<int>(Material::SHADERTYPE_COUNT)];
|
m_meshes = new std::vector<GLMesh *>[static_cast<int>(Material::SHADERTYPE_COUNT)];
|
||||||
|
@ -18,8 +18,11 @@
|
|||||||
#ifndef HEADER_COMMAND_BUFFER_HPP
|
#ifndef HEADER_COMMAND_BUFFER_HPP
|
||||||
#define HEADER_COMMAND_BUFFER_HPP
|
#define HEADER_COMMAND_BUFFER_HPP
|
||||||
|
|
||||||
|
#include "graphics/draw_tools.hpp"
|
||||||
#include "graphics/gl_headers.hpp"
|
#include "graphics/gl_headers.hpp"
|
||||||
#include "graphics/material.hpp"
|
#include "graphics/material.hpp"
|
||||||
|
#include "graphics/materials.hpp"
|
||||||
|
|
||||||
|
|
||||||
#include "graphics/stk_mesh_scene_node.hpp"
|
#include "graphics/stk_mesh_scene_node.hpp"
|
||||||
#include "graphics/vao_manager.hpp"
|
#include "graphics/vao_manager.hpp"
|
||||||
@ -103,6 +106,19 @@ void FillInstances( const MeshMap &gathered_GL_mesh,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void expandTexSecondPass(const GLMesh &mesh,
|
||||||
|
const std::vector<GLuint> &prefilled_tex)
|
||||||
|
{
|
||||||
|
TexExpander<typename T::InstancedSecondPassShader>::template
|
||||||
|
expandTex(mesh, T::SecondPassTextures, prefilled_tex[0],
|
||||||
|
prefilled_tex[1], prefilled_tex[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void expandTexSecondPass<GrassMat>(const GLMesh &mesh,
|
||||||
|
const std::vector<GLuint> &prefilled_tex);
|
||||||
|
|
||||||
|
|
||||||
class CommandBuffer
|
class CommandBuffer
|
||||||
{
|
{
|
||||||
@ -121,6 +137,7 @@ protected:
|
|||||||
MeshMap *mesh_map,
|
MeshMap *mesh_map,
|
||||||
T *instance_buffer);
|
T *instance_buffer);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CommandBuffer();
|
CommandBuffer();
|
||||||
virtual ~CommandBuffer();
|
virtual ~CommandBuffer();
|
||||||
@ -135,6 +152,60 @@ public:
|
|||||||
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_draw_indirect_cmd_id);
|
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_draw_indirect_cmd_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T, typename...Uniforms>
|
||||||
|
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<typename T::InstancedFirstPassShader>::template expandTex(*mesh, T::FirstPassTextures);
|
||||||
|
|
||||||
|
glDrawElementsIndirect(GL_TRIANGLES,
|
||||||
|
GL_UNSIGNED_SHORT,
|
||||||
|
(const void*)((m_offset[T::MaterialType] + i) * sizeof(DrawElementsIndirectCommand)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
template<typename T, typename...Uniforms>
|
||||||
|
void drawIndirect2ndPass(const std::vector<GLuint> &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<T>(*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
|
/** Draw the i-th mesh with the specified material
|
||||||
* (require at least OpenGL 4.0
|
* (require at least OpenGL 4.0
|
||||||
* or GL_ARB_base_instance and GL_ARB_draw_indirect extensions)
|
* or GL_ARB_base_instance and GL_ARB_draw_indirect extensions)
|
||||||
@ -159,6 +230,8 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SolidCommandBuffer: public CommandBuffer
|
class SolidCommandBuffer: public CommandBuffer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "graphics/draw_calls.hpp"
|
#include "graphics/draw_calls.hpp"
|
||||||
#include "graphics/lod_node.hpp"
|
#include "graphics/lod_node.hpp"
|
||||||
|
#include "graphics/materials.hpp"
|
||||||
#include "graphics/stk_mesh_scene_node.hpp"
|
#include "graphics/stk_mesh_scene_node.hpp"
|
||||||
#include "graphics/stk_scene_manager.hpp"
|
#include "graphics/stk_scene_manager.hpp"
|
||||||
#include "graphics/vao_manager.hpp"
|
#include "graphics/vao_manager.hpp"
|
||||||
@ -500,12 +501,9 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer
|
|||||||
if (!CVS->supportsIndirectInstancingRendering())
|
if (!CVS->supportsIndirectInstancingRendering())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
InstanceDataDualTex *InstanceBufferDualTex;
|
|
||||||
InstanceDataThreeTex *InstanceBufferThreeTex;
|
|
||||||
InstanceDataSingleTex *ShadowInstanceBuffer;
|
InstanceDataSingleTex *ShadowInstanceBuffer;
|
||||||
InstanceDataSingleTex *RSMInstanceBuffer;
|
InstanceDataSingleTex *RSMInstanceBuffer;
|
||||||
GlowInstanceData *GlowInstanceBuffer;
|
GlowInstanceData *GlowInstanceBuffer;
|
||||||
DrawElementsIndirectCommand *CmdBuffer;
|
|
||||||
DrawElementsIndirectCommand *ShadowCmdBuffer;
|
DrawElementsIndirectCommand *ShadowCmdBuffer;
|
||||||
DrawElementsIndirectCommand *RSMCmdBuffer;
|
DrawElementsIndirectCommand *RSMCmdBuffer;
|
||||||
DrawElementsIndirectCommand *GlowCmdBuffer;
|
DrawElementsIndirectCommand *GlowCmdBuffer;
|
||||||
@ -514,12 +512,9 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer
|
|||||||
|
|
||||||
if (CVS->supportsAsyncInstanceUpload())
|
if (CVS->supportsAsyncInstanceUpload())
|
||||||
{
|
{
|
||||||
InstanceBufferDualTex = (InstanceDataDualTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeDualTex);
|
|
||||||
InstanceBufferThreeTex = (InstanceDataThreeTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeThreeTex);
|
|
||||||
ShadowInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeShadow);
|
ShadowInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeShadow);
|
||||||
RSMInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeRSM);
|
RSMInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeRSM);
|
||||||
GlowInstanceBuffer = (GlowInstanceData*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeGlow);
|
GlowInstanceBuffer = (GlowInstanceData*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeGlow);
|
||||||
CmdBuffer = SolidPassCmd::getInstance()->Ptr;
|
|
||||||
ShadowCmdBuffer = ShadowPassCmd::getInstance()->Ptr;
|
ShadowCmdBuffer = ShadowPassCmd::getInstance()->Ptr;
|
||||||
GlowCmdBuffer = GlowPassCmd::getInstance()->Ptr;
|
GlowCmdBuffer = GlowPassCmd::getInstance()->Ptr;
|
||||||
RSMCmdBuffer = RSMPassCmd::getInstance()->Ptr;
|
RSMCmdBuffer = RSMPassCmd::getInstance()->Ptr;
|
||||||
@ -545,81 +540,7 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer
|
|||||||
{
|
{
|
||||||
#pragma omp section
|
#pragma omp section
|
||||||
{
|
{
|
||||||
|
|
||||||
//TODO
|
|
||||||
/*std::vector<GLMesh *> instanced_lists[Material::SHADERTYPE_COUNT];
|
|
||||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_SOLID)] = ListInstancedMatDefault::getInstance()->SolidPass;
|
|
||||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_ALPHA_TEST)] = ListInstancedMatAlphaRef::getInstance()->SolidPass;
|
|
||||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_SOLID_UNLIT)] = ListInstancedMatUnlit::getInstance()->SolidPass;
|
|
||||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_SPHERE_MAP)] = ListInstancedMatSphereMap::getInstance()->SolidPass;
|
|
||||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_VEGETATION)] = ListInstancedMatGrass::getInstance()->SolidPass;
|
|
||||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_DETAIL_MAP)] = ListInstancedMatDetails::getInstance()->SolidPass;
|
|
||||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_NORMAL_MAP)] = ListInstancedMatNormalMap::getInstance()->SolidPass;*/
|
|
||||||
|
|
||||||
m_solid_cmd_buffer.fill(m_solid_pass_mesh);
|
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
|
#pragma omp section
|
||||||
{
|
{
|
||||||
@ -776,3 +697,29 @@ void DrawCalls::multidrawIndirectSolidCmd(Material::ShaderType shader_type) cons
|
|||||||
{
|
{
|
||||||
m_solid_cmd_buffer.multidrawIndirect(static_cast<int>(shader_type));
|
m_solid_cmd_buffer.multidrawIndirect(static_cast<int>(shader_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DrawCalls::drawIndirectSolidFirstPass() const
|
||||||
|
{
|
||||||
|
m_solid_cmd_buffer.drawIndirect<DefaultMaterial>();
|
||||||
|
m_solid_cmd_buffer.drawIndirect<AlphaRef>();
|
||||||
|
m_solid_cmd_buffer.drawIndirect<UnlitMat>();
|
||||||
|
m_solid_cmd_buffer.drawIndirect<SphereMap>();
|
||||||
|
m_solid_cmd_buffer.drawIndirect<GrassMat>(windDir);
|
||||||
|
m_solid_cmd_buffer.drawIndirect<DetailMat>();
|
||||||
|
m_solid_cmd_buffer.drawIndirect<NormalMat>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DrawCalls::drawIndirectSolidSecondPass(const std::vector<GLuint> &prefilled_tex) const
|
||||||
|
{
|
||||||
|
|
||||||
|
m_solid_cmd_buffer.drawIndirect2ndPass<DefaultMaterial>(prefilled_tex);
|
||||||
|
m_solid_cmd_buffer.drawIndirect2ndPass<AlphaRef>(prefilled_tex);
|
||||||
|
m_solid_cmd_buffer.drawIndirect2ndPass<UnlitMat>(prefilled_tex);
|
||||||
|
m_solid_cmd_buffer.drawIndirect2ndPass<SphereMap>(prefilled_tex);
|
||||||
|
m_solid_cmd_buffer.drawIndirect2ndPass<GrassMat>(prefilled_tex, windDir, irr_driver->getSunDirection());
|
||||||
|
m_solid_cmd_buffer.drawIndirect2ndPass<DetailMat>(prefilled_tex);
|
||||||
|
m_solid_cmd_buffer.drawIndirect2ndPass<NormalMat>(prefilled_tex);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -102,6 +102,10 @@ public:
|
|||||||
{ return m_solid_cmd_buffer.isEmpty(shader_type); }
|
{ return m_solid_cmd_buffer.isEmpty(shader_type); }
|
||||||
void drawIndirectSolidCmd(Material::ShaderType shader_type, int i) const;
|
void drawIndirectSolidCmd(Material::ShaderType shader_type, int i) const;
|
||||||
void multidrawIndirectSolidCmd(Material::ShaderType shader_type) const;
|
void multidrawIndirectSolidCmd(Material::ShaderType shader_type) const;
|
||||||
|
|
||||||
|
void drawIndirectSolidFirstPass() const;
|
||||||
|
//void multidrawIndirectSolidCmd() const; //TODO
|
||||||
|
void drawIndirectSolidSecondPass(const std::vector<GLuint> &prefilled_tex) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //HEADER_DRAW_CALLS_HPP
|
#endif //HEADER_DRAW_CALLS_HPP
|
||||||
|
@ -77,612 +77,6 @@ layout(location = 6) in vec3 Bitangent;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
|
||||||
class InstancedObjectPass1Shader : public TextureShader<InstancedObjectPass1Shader, 1>
|
|
||||||
{
|
|
||||||
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<InstancedObjectRefPass1Shader, 2>
|
|
||||||
{
|
|
||||||
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<ObjectRefPass2Shader, 5,
|
|
||||||
core::matrix4, core::matrix4>
|
|
||||||
{
|
|
||||||
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<InstancedObjectPass2Shader, 5>
|
|
||||||
{
|
|
||||||
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<InstancedObjectRefPass2Shader, 5>
|
|
||||||
{
|
|
||||||
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<ShadowShader, 0, core::matrix4, int>
|
|
||||||
{
|
|
||||||
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<InstancedShadowShader, 0, int>
|
|
||||||
{
|
|
||||||
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<CRSMShader, 1, core::matrix4, core::matrix4,
|
|
||||||
core::matrix4>
|
|
||||||
{
|
|
||||||
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<SplattingRSMShader, 5, core::matrix4,
|
|
||||||
core::matrix4>
|
|
||||||
{
|
|
||||||
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<CInstancedRSMShader, 1, core::matrix4>
|
|
||||||
{
|
|
||||||
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<SphereMapShader, 4, core::matrix4,
|
|
||||||
core::matrix4>
|
|
||||||
{
|
|
||||||
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<InstancedSphereMapShader, 4>
|
|
||||||
{
|
|
||||||
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<SplattingShader, 8, core::matrix4>
|
|
||||||
{
|
|
||||||
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<ObjectRefPass1Shader, 2, core::matrix4,
|
|
||||||
core::matrix4, core::matrix4>
|
|
||||||
{
|
|
||||||
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<NormalMapShader, 2, core::matrix4,
|
|
||||||
core::matrix4>
|
|
||||||
{
|
|
||||||
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<InstancedNormalMapShader, 2>
|
|
||||||
{
|
|
||||||
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<ObjectUnlitShader, 4, core::matrix4,
|
|
||||||
core::matrix4>
|
|
||||||
{
|
|
||||||
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<InstancedObjectUnlitShader, 4>
|
|
||||||
{
|
|
||||||
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<RefShadowShader, 1,
|
|
||||||
core::matrix4, int>
|
|
||||||
{
|
|
||||||
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<InstancedRefShadowShader,
|
|
||||||
1, int>
|
|
||||||
{
|
|
||||||
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<DisplaceMaskShader, core::matrix4>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DisplaceMaskShader()
|
|
||||||
{
|
|
||||||
loadProgram(OBJECT, GL_VERTEX_SHADER, "displace.vert",
|
|
||||||
GL_FRAGMENT_SHADER, "white.frag");
|
|
||||||
assignUniforms("ModelMatrix");
|
|
||||||
} // DisplaceMaskShader
|
|
||||||
}; // DisplaceMaskShader
|
|
||||||
|
|
||||||
// ============================================================================
|
|
||||||
class DisplaceShader : public TextureShader<DisplaceShader, 4, core::matrix4,
|
|
||||||
core::vector2df, core::vector2df>
|
|
||||||
{
|
|
||||||
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<NormalVisualizer, video::SColor>
|
|
||||||
{
|
|
||||||
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<GrassPass1Shader, 2, core::matrix4,
|
|
||||||
core::matrix4, core::vector3df>
|
|
||||||
{
|
|
||||||
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<InstancedGrassPass1Shader, 2,
|
|
||||||
core::vector3df>
|
|
||||||
{
|
|
||||||
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<GrassShadowShader, 1, core::matrix4,
|
|
||||||
core::vector3df, int>
|
|
||||||
{
|
|
||||||
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<InstancedGrassShadowShader, 1,
|
|
||||||
core::vector3df, int>
|
|
||||||
{
|
|
||||||
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<GrassPass2Shader, 5, core::matrix4,
|
|
||||||
core::vector3df>
|
|
||||||
{
|
|
||||||
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<InstancedGrassPass2Shader, 6,
|
|
||||||
core::vector3df, core::vector3df>
|
|
||||||
{
|
|
||||||
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<DetailedObjectPass2Shader, 6,
|
|
||||||
core::matrix4>
|
|
||||||
{
|
|
||||||
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<InstancedDetailedObjectPass2Shader, 6>
|
|
||||||
{
|
|
||||||
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())
|
else if (CVS->supportsIndirectInstancingRendering())
|
||||||
{
|
{
|
||||||
renderInstancedMeshes1stPass<DefaultMaterial>(draw_calls);
|
draw_calls.drawIndirectSolidFirstPass();
|
||||||
renderInstancedMeshes1stPass<AlphaRef>(draw_calls);
|
|
||||||
renderInstancedMeshes1stPass<UnlitMat>(draw_calls);
|
|
||||||
renderInstancedMeshes1stPass<SphereMap>(draw_calls);
|
|
||||||
renderInstancedMeshes1stPass<GrassMat>(draw_calls, m_wind_dir);
|
|
||||||
renderInstancedMeshes1stPass<DetailMat>(draw_calls);
|
|
||||||
renderInstancedMeshes1stPass<NormalMat>(draw_calls);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // renderSolidFirstPass
|
} // renderSolidFirstPass
|
||||||
@ -1029,31 +417,12 @@ void GeometryPasses::renderSolidSecondPass( const DrawCalls& draw_calls,
|
|||||||
}
|
}
|
||||||
else if (CVS->supportsIndirectInstancingRendering())
|
else if (CVS->supportsIndirectInstancingRendering())
|
||||||
{
|
{
|
||||||
renderInstancedMeshes2ndPass<DefaultMaterial>(draw_calls, DiffSpecSSAOTex);
|
std::vector<GLuint> prefilled_tex =
|
||||||
renderInstancedMeshes2ndPass<AlphaRef>(draw_calls, DiffSpecSSAOTex);
|
createVector<GLuint>(render_target_diffuse,
|
||||||
renderInstancedMeshes2ndPass<UnlitMat>(draw_calls, DiffSpecSSAOTex);
|
render_target_specular,
|
||||||
renderInstancedMeshes2ndPass<SphereMap>(draw_calls, DiffSpecSSAOTex);
|
render_target_half_red,
|
||||||
renderInstancedMeshes2ndPass<DetailMat>(draw_calls, DiffSpecSSAOTex);
|
|
||||||
renderInstancedMeshes2ndPass<NormalMat>(draw_calls, DiffSpecSSAOTex);
|
|
||||||
|
|
||||||
// template does not work with template due to extra depth texture
|
|
||||||
{
|
|
||||||
std::vector<GLMesh *> &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<GrassMat::InstancedSecondPassShader>
|
|
||||||
::expandTex(*mesh, GrassMat::SecondPassTextures, DiffSpecSSAOTex[0],
|
|
||||||
DiffSpecSSAOTex[1], DiffSpecSSAOTex[2],
|
|
||||||
irr_driver->getDepthStencilTexture());
|
irr_driver->getDepthStencilTexture());
|
||||||
GrassMat::InstancedSecondPassShader::getInstance()
|
draw_calls.drawIndirectSolidSecondPass(prefilled_tex);
|
||||||
->setUniforms(m_wind_dir, irr_driver->getSunDirection());
|
|
||||||
draw_calls.drawIndirectSolidCmd(GrassMat::MaterialType, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // renderSolidSecondPass
|
} // renderSolidSecondPass
|
||||||
|
@ -814,7 +814,6 @@ void IrrDriver::applyResolutionSettings()
|
|||||||
// (we're sure to update main.cpp at some point and forget this one...)
|
// (we're sure to update main.cpp at some point and forget this one...)
|
||||||
ShaderBase::updateShaders();
|
ShaderBase::updateShaders();
|
||||||
VAOManager::getInstance()->kill();
|
VAOManager::getInstance()->kill();
|
||||||
SolidPassCmd::getInstance()->kill();
|
|
||||||
ShadowPassCmd::getInstance()->kill();
|
ShadowPassCmd::getInstance()->kill();
|
||||||
RSMPassCmd::getInstance()->kill();
|
RSMPassCmd::getInstance()->kill();
|
||||||
GlowPassCmd::getInstance()->kill();
|
GlowPassCmd::getInstance()->kill();
|
||||||
|
@ -23,11 +23,10 @@
|
|||||||
#include "graphics/stk_mesh.hpp"
|
#include "graphics/stk_mesh.hpp"
|
||||||
#include "graphics/vao_manager.hpp"
|
#include "graphics/vao_manager.hpp"
|
||||||
|
|
||||||
class InstancedObjectPass1Shader;
|
/*class InstancedObjectPass1Shader;
|
||||||
class InstancedObjectPass2Shader;
|
class InstancedObjectPass2Shader;
|
||||||
class InstancedShadowShader;
|
class InstancedShadowShader;
|
||||||
class CInstancedRSMShader;
|
class CInstancedRSMShader;
|
||||||
class ListInstancedMatDefault;
|
|
||||||
class ShadowShader;
|
class ShadowShader;
|
||||||
class CRSMShader;
|
class CRSMShader;
|
||||||
class InstancedObjectRefPass1Shader;
|
class InstancedObjectRefPass1Shader;
|
||||||
@ -51,7 +50,617 @@ class NormalMapShader;
|
|||||||
class InstancedDetailedObjectPass2Shader;
|
class InstancedDetailedObjectPass2Shader;
|
||||||
class DetailedObjectPass2Shader;
|
class DetailedObjectPass2Shader;
|
||||||
class SplattingShader;
|
class SplattingShader;
|
||||||
class SplattingRSMShader;
|
class SplattingRSMShader;*/
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
class InstancedObjectPass1Shader : public TextureShader<InstancedObjectPass1Shader, 1>
|
||||||
|
{
|
||||||
|
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<InstancedObjectRefPass1Shader, 2>
|
||||||
|
{
|
||||||
|
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<ObjectRefPass2Shader, 5,
|
||||||
|
core::matrix4, core::matrix4>
|
||||||
|
{
|
||||||
|
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<InstancedObjectPass2Shader, 5>
|
||||||
|
{
|
||||||
|
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<InstancedObjectRefPass2Shader, 5>
|
||||||
|
{
|
||||||
|
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<ShadowShader, 0, core::matrix4, int>
|
||||||
|
{
|
||||||
|
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<InstancedShadowShader, 0, int>
|
||||||
|
{
|
||||||
|
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<CRSMShader, 1, core::matrix4, core::matrix4,
|
||||||
|
core::matrix4>
|
||||||
|
{
|
||||||
|
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<SplattingRSMShader, 5, core::matrix4,
|
||||||
|
core::matrix4>
|
||||||
|
{
|
||||||
|
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<CInstancedRSMShader, 1, core::matrix4>
|
||||||
|
{
|
||||||
|
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<SphereMapShader, 4, core::matrix4,
|
||||||
|
core::matrix4>
|
||||||
|
{
|
||||||
|
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<InstancedSphereMapShader, 4>
|
||||||
|
{
|
||||||
|
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<SplattingShader, 8, core::matrix4>
|
||||||
|
{
|
||||||
|
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<ObjectRefPass1Shader, 2, core::matrix4,
|
||||||
|
core::matrix4, core::matrix4>
|
||||||
|
{
|
||||||
|
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<NormalMapShader, 2, core::matrix4,
|
||||||
|
core::matrix4>
|
||||||
|
{
|
||||||
|
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<InstancedNormalMapShader, 2>
|
||||||
|
{
|
||||||
|
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<ObjectUnlitShader, 4, core::matrix4,
|
||||||
|
core::matrix4>
|
||||||
|
{
|
||||||
|
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<InstancedObjectUnlitShader, 4>
|
||||||
|
{
|
||||||
|
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<RefShadowShader, 1,
|
||||||
|
core::matrix4, int>
|
||||||
|
{
|
||||||
|
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<InstancedRefShadowShader,
|
||||||
|
1, int>
|
||||||
|
{
|
||||||
|
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<DisplaceMaskShader, core::matrix4>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DisplaceMaskShader()
|
||||||
|
{
|
||||||
|
loadProgram(OBJECT, GL_VERTEX_SHADER, "displace.vert",
|
||||||
|
GL_FRAGMENT_SHADER, "white.frag");
|
||||||
|
assignUniforms("ModelMatrix");
|
||||||
|
} // DisplaceMaskShader
|
||||||
|
}; // DisplaceMaskShader
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
class DisplaceShader : public TextureShader<DisplaceShader, 4, core::matrix4,
|
||||||
|
core::vector2df, core::vector2df>
|
||||||
|
{
|
||||||
|
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<NormalVisualizer, video::SColor>
|
||||||
|
{
|
||||||
|
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<GrassPass1Shader, 2, core::matrix4,
|
||||||
|
core::matrix4, core::vector3df>
|
||||||
|
{
|
||||||
|
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<InstancedGrassPass1Shader, 2,
|
||||||
|
core::vector3df>
|
||||||
|
{
|
||||||
|
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<GrassShadowShader, 1, core::matrix4,
|
||||||
|
core::vector3df, int>
|
||||||
|
{
|
||||||
|
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<InstancedGrassShadowShader, 1,
|
||||||
|
core::vector3df, int>
|
||||||
|
{
|
||||||
|
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<GrassPass2Shader, 5, core::matrix4,
|
||||||
|
core::vector3df>
|
||||||
|
{
|
||||||
|
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<InstancedGrassPass2Shader, 6,
|
||||||
|
core::vector3df, core::vector3df>
|
||||||
|
{
|
||||||
|
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<DetailedObjectPass2Shader, 6,
|
||||||
|
core::matrix4>
|
||||||
|
{
|
||||||
|
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<InstancedDetailedObjectPass2Shader, 6>
|
||||||
|
{
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
@ -216,7 +216,6 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
|
|||||||
glClearColor(0., 0., 0., 0.);
|
glClearColor(0., 0., 0., 0.);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||||
m_geometry_passes.renderSolidFirstPass(m_draw_calls);
|
m_geometry_passes.renderSolidFirstPass(m_draw_calls);
|
||||||
//m_solid_first_pass->render(m_wind_dir);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -491,17 +490,10 @@ void ShaderBasedRenderer::renderPostProcessing(Camera * const camera)
|
|||||||
|
|
||||||
ShaderBasedRenderer::ShaderBasedRenderer()
|
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()
|
ShaderBasedRenderer::~ShaderBasedRenderer()
|
||||||
{
|
{
|
||||||
delete m_solid_first_pass;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShaderBasedRenderer::addSunLight(const core::vector3df &pos) {
|
void ShaderBasedRenderer::addSunLight(const core::vector3df &pos) {
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
#include "graphics/geometry_passes.hpp"
|
#include "graphics/geometry_passes.hpp"
|
||||||
#include "graphics/lighting_passes.hpp"
|
#include "graphics/lighting_passes.hpp"
|
||||||
#include "graphics/shadow_matrices.hpp"
|
#include "graphics/shadow_matrices.hpp"
|
||||||
#include "graphics/solid_first_pass.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
class ShaderBasedRenderer: public AbstractRenderer
|
class ShaderBasedRenderer: public AbstractRenderer
|
||||||
@ -37,7 +36,6 @@ private:
|
|||||||
ShadowMatrices m_shadow_matrices;
|
ShadowMatrices m_shadow_matrices;
|
||||||
|
|
||||||
irr::core::vector3df m_wind_dir;
|
irr::core::vector3df m_wind_dir;
|
||||||
SolidFirstPass *m_solid_first_pass;
|
|
||||||
|
|
||||||
void compressPowerUpTextures();
|
void compressPowerUpTextures();
|
||||||
void setOverrideMaterial();
|
void setOverrideMaterial();
|
||||||
|
@ -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();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
@ -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 <irrlicht.h>
|
|
||||||
|
|
||||||
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
|
|
@ -61,12 +61,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class SolidPassCmd : public CommandBufferOld<SolidPassCmd, 1, static_cast<int>(Material::SHADERTYPE_COUNT)>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
size_t Offset[Material::SHADERTYPE_COUNT], Size[Material::SHADERTYPE_COUNT];
|
|
||||||
};
|
|
||||||
|
|
||||||
class ShadowPassCmd : public CommandBufferOld<ShadowPassCmd, 4, static_cast<int>(Material::SHADERTYPE_COUNT)>
|
class ShadowPassCmd : public CommandBufferOld<ShadowPassCmd, 4, static_cast<int>(Material::SHADERTYPE_COUNT)>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user