Turn shadow shaders into singletons.

This commit is contained in:
Vincent Lejeune 2014-07-13 21:08:49 +02:00
parent 7b9fc60f9c
commit b2fc9eb682
3 changed files with 26 additions and 42 deletions

View File

@ -910,10 +910,10 @@ void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, siz
delete []tmp;
}
template<typename Shader, enum E_VERTEX_TYPE VertexType, typename... Args>
void drawShadow(const std::vector<GLuint> TextureUnits, const std::vector<std::tuple<GLMesh *, core::matrix4, Args...> >&t)
template<typename T, enum E_VERTEX_TYPE VertexType, typename... Args>
void drawShadow(const T *Shader, const std::vector<GLuint> TextureUnits, const std::vector<std::tuple<GLMesh *, core::matrix4, Args...> >&t)
{
glUseProgram(Shader::Program);
glUseProgram(Shader->Program);
glBindVertexArray(getVAO(VertexType));
for (unsigned i = 0; i < t.size(); i++)
{
@ -928,7 +928,7 @@ void drawShadow(const std::vector<GLuint> TextureUnits, const std::vector<std::t
setTexture(TextureUnits[j], getTextureGLuint(mesh->textures[j]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
}
Shader::setUniforms(std::get<1>(t[i]));
Shader->setUniforms(std::get<1>(t[i]));
glDrawElementsInstancedBaseVertex(ptype, count, itype, (GLvoid *)mesh->vaoOffset, 4, mesh->vaoBaseVertex);
}
}
@ -964,10 +964,10 @@ void IrrDriver::renderShadows()
m_scene_manager->drawAll(scene::ESNRP_SOLID);
drawShadow<MeshShader::ShadowShader, EVT_STANDARD>({}, ListDefaultStandardG::Arguments);
drawShadow<MeshShader::ShadowShader, EVT_2TCOORDS>({}, ListDefault2TCoordG::Arguments);
drawShadow<MeshShader::ShadowShader, EVT_TANGENTS>({}, ListNormalG::Arguments);
drawShadow<MeshShader::RefShadowShader, EVT_STANDARD>({ MeshShader::RefShadowShader::TU_tex }, ListAlphaRefG::Arguments);
drawShadow<MeshShader::ShadowShader, EVT_STANDARD>(MeshShader::ShadowShaderInstance, {}, ListDefaultStandardG::Arguments);
drawShadow<MeshShader::ShadowShader, EVT_2TCOORDS>(MeshShader::ShadowShaderInstance, {}, ListDefault2TCoordG::Arguments);
drawShadow<MeshShader::ShadowShader, EVT_TANGENTS>(MeshShader::ShadowShaderInstance, {}, ListNormalG::Arguments);
drawShadow<MeshShader::RefShadowShader, EVT_STANDARD>(MeshShader::RefShadowShaderInstance, { MeshShader::RefShadowShaderInstance->TU_tex }, ListAlphaRefG::Arguments);
glDisable(GL_POLYGON_OFFSET_FILL);

View File

@ -349,10 +349,10 @@ void Shaders::loadShaders()
LightShader::PointLightShader::init();
MeshShader::DisplaceShader::init();
MeshShader::DisplaceMaskShader::init();
MeshShader::ShadowShader::init();
MeshShader::ShadowShaderInstance = new MeshShader::ShadowShader();
MeshShader::RSMShader::init();
MeshShader::InstancedShadowShader::init();
MeshShader::RefShadowShader::init();
MeshShader::RefShadowShaderInstance = new MeshShader::RefShadowShader();
MeshShader::InstancedRefShadowShader::init();
MeshShader::GrassShadowShader::init();
MeshShader::SkyboxShader::init();
@ -991,10 +991,7 @@ namespace MeshShader
glUniform3f(uniform_col, r, g, b);
}
GLuint ShadowShader::Program;
GLuint ShadowShader::uniform_MM;
void ShadowShader::init()
ShadowShader::ShadowShader()
{
// Geometry shader needed
if (irr_driver->getGLSLVersion() < 150)
@ -1012,16 +1009,12 @@ namespace MeshShader
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
}
uniform_MM = glGetUniformLocation(Program, "ModelMatrix");
AssignUniforms(Program, uniforms, { "ModelMatrix" });
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
void ShadowShader::setUniforms(const core::matrix4 &ModelMatrix)
{
glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer());
}
ShadowShader *ShadowShaderInstance;
GLuint RSMShader::Program;
GLuint RSMShader::uniform_MM;
@ -1076,11 +1069,7 @@ namespace MeshShader
{
}
GLuint RefShadowShader::Program;
GLuint RefShadowShader::uniform_MM;
GLuint RefShadowShader::TU_tex;
void RefShadowShader::init()
RefShadowShader::RefShadowShader()
{
// Geometry shader needed
if (irr_driver->getGLSLVersion() < 150)
@ -1098,17 +1087,15 @@ namespace MeshShader
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str());
}
uniform_MM = glGetUniformLocation(Program, "ModelMatrix");
AssignUniforms(Program, uniforms, { "ModelMatrix" });
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
TU_tex = 0;
AssignTextureUnit(Program, { { TU_tex, "tex" } });
}
void RefShadowShader::setUniforms(const core::matrix4 &ModelMatrix)
{
glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer());
}
RefShadowShader *RefShadowShaderInstance;
GLuint InstancedRefShadowShader::Program;
GLuint InstancedRefShadowShader::uniform_tex;

View File

@ -335,16 +335,14 @@ public:
static void setUniforms(const core::matrix4 &ModelMatrix, float r, float g, float b);
};
class ShadowShader
class ShadowShader : public ShaderHelper<core::matrix4>
{
public:
static GLuint Program;
static GLuint uniform_MM, uniform_ViewProjectionMatrixesUBO;
static void init();
static void setUniforms(const core::matrix4 &ModelMatrix);
ShadowShader();
};
extern ShadowShader *ShadowShaderInstance;
class RSMShader
{
public:
@ -365,17 +363,16 @@ public:
static void setUniforms();
};
class RefShadowShader
class RefShadowShader : public ShaderHelper<core::matrix4>
{
public:
static GLuint Program;
static GLuint uniform_MM;
static GLuint TU_tex;
GLuint TU_tex;
static void init();
static void setUniforms(const core::matrix4 &ModelMatrix);
RefShadowShader();
};
extern RefShadowShader *RefShadowShaderInstance;
class InstancedRefShadowShader
{
public: