Port instanced shadow shaders to singleton.
This commit is contained in:
@@ -351,9 +351,9 @@ void Shaders::loadShaders()
|
||||
MeshShader::DisplaceMaskShaderInstance = new MeshShader::DisplaceMaskShader();
|
||||
MeshShader::ShadowShaderInstance = new MeshShader::ShadowShader();
|
||||
MeshShader::RSMShader::init();
|
||||
MeshShader::InstancedShadowShader::init();
|
||||
MeshShader::InstancedShadowShaderInstance = new MeshShader::InstancedShadowShader();
|
||||
MeshShader::RefShadowShaderInstance = new MeshShader::RefShadowShader();
|
||||
MeshShader::InstancedRefShadowShader::init();
|
||||
MeshShader::InstancedRefShadowShaderInstance = new MeshShader::InstancedRefShadowShader();
|
||||
MeshShader::GrassShadowShaderInstance = new MeshShader::GrassShadowShader();
|
||||
MeshShader::SkyboxShader::init();
|
||||
MeshShader::ViewFrustrumShader::init();
|
||||
@@ -962,9 +962,7 @@ namespace MeshShader
|
||||
glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer());
|
||||
}
|
||||
|
||||
GLuint InstancedShadowShader::Program;
|
||||
|
||||
void InstancedShadowShader::init()
|
||||
InstancedShadowShader::InstancedShadowShader()
|
||||
{
|
||||
// Geometry shader needed
|
||||
if (irr_driver->getGLSLVersion() < 150)
|
||||
@@ -988,9 +986,7 @@ namespace MeshShader
|
||||
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
|
||||
}
|
||||
|
||||
void InstancedShadowShader::setUniforms()
|
||||
{
|
||||
}
|
||||
InstancedShadowShader *InstancedShadowShaderInstance;
|
||||
|
||||
RefShadowShader::RefShadowShader()
|
||||
{
|
||||
@@ -1020,10 +1016,7 @@ namespace MeshShader
|
||||
|
||||
RefShadowShader *RefShadowShaderInstance;
|
||||
|
||||
GLuint InstancedRefShadowShader::Program;
|
||||
GLuint InstancedRefShadowShader::uniform_tex;
|
||||
|
||||
void InstancedRefShadowShader::init()
|
||||
InstancedRefShadowShader::InstancedRefShadowShader()
|
||||
{
|
||||
// Geometry shader needed
|
||||
if (irr_driver->getGLSLVersion() < 150)
|
||||
@@ -1043,15 +1036,13 @@ 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_tex = glGetUniformLocation(Program, "tex");
|
||||
TU_tex = 0;
|
||||
AssignTextureUnit(Program, { { TU_tex, "tex" } });
|
||||
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
|
||||
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
|
||||
}
|
||||
|
||||
void InstancedRefShadowShader::setUniforms(unsigned TU_tex)
|
||||
{
|
||||
glUniform1i(uniform_tex, TU_tex);
|
||||
}
|
||||
InstancedRefShadowShader *InstancedRefShadowShaderInstance;
|
||||
|
||||
GrassShadowShader::GrassShadowShader()
|
||||
{
|
||||
|
||||
@@ -360,15 +360,14 @@ public:
|
||||
static void setUniforms(const core::matrix4 &RSMMatrix, const core::matrix4 &ModelMatrix);
|
||||
};
|
||||
|
||||
class InstancedShadowShader
|
||||
class InstancedShadowShader : public ShaderHelper<>
|
||||
{
|
||||
public:
|
||||
static GLuint Program;
|
||||
|
||||
static void init();
|
||||
static void setUniforms();
|
||||
InstancedShadowShader();
|
||||
};
|
||||
|
||||
extern InstancedShadowShader *InstancedShadowShaderInstance;
|
||||
|
||||
class RefShadowShader : public ShaderHelper<core::matrix4>
|
||||
{
|
||||
public:
|
||||
@@ -379,16 +378,16 @@ public:
|
||||
|
||||
extern RefShadowShader *RefShadowShaderInstance;
|
||||
|
||||
class InstancedRefShadowShader
|
||||
class InstancedRefShadowShader : public ShaderHelper<>
|
||||
{
|
||||
public:
|
||||
static GLuint Program;
|
||||
static GLuint uniform_tex;
|
||||
GLuint TU_tex;
|
||||
|
||||
static void init();
|
||||
static void setUniforms(unsigned TU_tex);
|
||||
InstancedRefShadowShader();
|
||||
};
|
||||
|
||||
extern InstancedRefShadowShader *InstancedRefShadowShaderInstance;
|
||||
|
||||
class GrassShadowShader : public ShaderHelper<core::matrix4, core::vector3df>
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -158,7 +158,7 @@ static void drawShadowDefault(GLMesh &mesh, size_t instance_count)
|
||||
GLenum itype = mesh.IndexType;
|
||||
size_t count = mesh.IndexCount;
|
||||
|
||||
MeshShader::InstancedShadowShader::setUniforms();
|
||||
MeshShader::InstancedShadowShaderInstance->setUniforms();
|
||||
|
||||
glBindVertexArray(mesh.vao_shadow_pass);
|
||||
glDrawElementsInstanced(ptype, count, itype, 0, 4 * instance_count);
|
||||
@@ -187,8 +187,8 @@ static void drawShadowAlphaRefTexture(GLMesh &mesh, size_t instance_count)
|
||||
size_t count = mesh.IndexCount;
|
||||
|
||||
compressTexture(mesh.textures[0], true);
|
||||
setTexture(0, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
MeshShader::InstancedRefShadowShader::setUniforms(0);
|
||||
setTexture(MeshShader::InstancedRefShadowShaderInstance->TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
|
||||
MeshShader::InstancedRefShadowShaderInstance->setUniforms();
|
||||
|
||||
glBindVertexArray(mesh.vao_shadow_pass);
|
||||
glDrawElementsInstanced(ptype, count, itype, 0, 4 * instance_count);
|
||||
@@ -343,12 +343,12 @@ void STKInstancedSceneNode::render()
|
||||
if (irr_driver->getPhase() == SHADOW_PASS)
|
||||
{
|
||||
if (!GeometricMesh[FPSM_DEFAULT_STANDARD].empty())
|
||||
glUseProgram(MeshShader::InstancedShadowShader::Program);
|
||||
glUseProgram(MeshShader::InstancedShadowShaderInstance->Program);
|
||||
for (unsigned i = 0; i < GeometricMesh[FPSM_DEFAULT_STANDARD].size(); i++)
|
||||
drawShadowDefault(*GeometricMesh[FPSM_DEFAULT_STANDARD][i], instance_pos.size() / 9);
|
||||
|
||||
if (!GeometricMesh[FPSM_ALPHA_REF_TEXTURE].empty())
|
||||
glUseProgram(MeshShader::InstancedRefShadowShader::Program);
|
||||
glUseProgram(MeshShader::InstancedRefShadowShaderInstance->Program);
|
||||
for (unsigned i = 0; i < GeometricMesh[FPSM_ALPHA_REF_TEXTURE].size(); i++)
|
||||
drawShadowAlphaRefTexture(*GeometricMesh[FPSM_ALPHA_REF_TEXTURE][i], instance_pos.size() / 9);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user