Use UBO instead of copying Shadow VP matrixes.

This commit is contained in:
Vincent Lejeune 2014-04-08 21:44:43 +02:00
parent d67834574b
commit 55489bc188
8 changed files with 58 additions and 67 deletions

View File

@ -1,4 +1,7 @@
uniform mat4 ViewProjectionMatrix[4]; layout (std140) uniform MatrixesData
{
mat4 ViewProjectionMatrix[4];
};
#if __VERSION__ >= 400 #if __VERSION__ >= 400
layout(triangles, invocations=4) in; layout(triangles, invocations=4) in;

View File

@ -64,6 +64,8 @@ PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex;
PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding;
#endif #endif
static bool is_gl_init = false; static bool is_gl_init = false;
@ -207,6 +209,8 @@ void initGL()
glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)IRR_OGL_LOAD_EXTENSION("glCheckFramebufferStatus"); glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)IRR_OGL_LOAD_EXTENSION("glCheckFramebufferStatus");
glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)IRR_OGL_LOAD_EXTENSION("glTexImage2DMultisample"); glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)IRR_OGL_LOAD_EXTENSION("glTexImage2DMultisample");
glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glBlitFramebuffer"); glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glBlitFramebuffer");
glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)IRR_OGL_LOAD_EXTENSION("glGetUniformBlockIndex");
glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)IRR_OGL_LOAD_EXTENSION("glUniformBlockBinding");
#ifdef DEBUG #ifdef DEBUG
glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)IRR_OGL_LOAD_EXTENSION("glDebugMessageCallbackARB"); glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)IRR_OGL_LOAD_EXTENSION("glDebugMessageCallbackARB");
#endif #endif

View File

@ -81,6 +81,8 @@ extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
extern PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex;
extern PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding;
#ifdef DEBUG #ifdef DEBUG
extern PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB; extern PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB;
#endif #endif

View File

@ -565,7 +565,19 @@ void IrrDriver::renderShadows(//ShadowImportanceProvider * const sicb,
glViewport(0, 0, 1024, 1024); glViewport(0, 0, 1024, 1024);
glClear(GL_DEPTH_BUFFER_BIT); glClear(GL_DEPTH_BUFFER_BIT);
glDrawBuffer(GL_NONE); glDrawBuffer(GL_NONE);
size_t size = irr_driver->getShadowViewProj().size();
float *tmp = new float[16 * size];
for (unsigned i = 0; i < size; i++) {
memcpy(&tmp[16 * i], irr_driver->getShadowViewProj()[i].pointer(), 16 * sizeof(float));
}
glBindBuffer(GL_UNIFORM_BUFFER, SharedObject::ViewProjectionMatrixesUBO);
glBufferSubData(GL_UNIFORM_BUFFER, 0, 16 * 4 * sizeof(float), tmp);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, SharedObject::ViewProjectionMatrixesUBO);
delete tmp;
m_scene_manager->drawAll(scene::ESNRP_SOLID); m_scene_manager->drawAll(scene::ESNRP_SOLID);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
glCullFace(GL_BACK); glCullFace(GL_BACK);
camnode->setNearValue(oldnear); camnode->setNearValue(oldnear);

View File

@ -164,6 +164,16 @@ static void initCubeVBO()
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * 6 * sizeof(int), indices, GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * 6 * sizeof(int), indices, GL_STATIC_DRAW);
} }
GLuint SharedObject::ViewProjectionMatrixesUBO;
static void initShadowVPMUBO()
{
glGenBuffers(1, &SharedObject::ViewProjectionMatrixesUBO);
glBindBuffer(GL_UNIFORM_BUFFER, SharedObject::ViewProjectionMatrixesUBO);
glBufferData(GL_UNIFORM_BUFFER, 16 * 4 * sizeof(float), 0, GL_STATIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
void Shaders::loadShaders() void Shaders::loadShaders()
{ {
const std::string &dir = file_manager->getAsset(FileManager::SHADER, ""); const std::string &dir = file_manager->getAsset(FileManager::SHADER, "");
@ -285,6 +295,7 @@ void Shaders::loadShaders()
initQuadBuffer(); initQuadBuffer();
initBillboardVBO(); initBillboardVBO();
initCubeVBO(); initCubeVBO();
initShadowVPMUBO();
FullScreenShader::BloomBlendShader::init(); FullScreenShader::BloomBlendShader::init();
FullScreenShader::BloomShader::init(); FullScreenShader::BloomShader::init();
FullScreenShader::ColorLevelShader::init(); FullScreenShader::ColorLevelShader::init();
@ -1397,7 +1408,6 @@ namespace MeshShader
GLuint ShadowShader::Program; GLuint ShadowShader::Program;
GLuint ShadowShader::attrib_position; GLuint ShadowShader::attrib_position;
GLuint ShadowShader::uniform_VP;
GLuint ShadowShader::uniform_MM; GLuint ShadowShader::uniform_MM;
void ShadowShader::init() void ShadowShader::init()
@ -1413,20 +1423,15 @@ namespace MeshShader
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(), GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/shadow.geom").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str()); GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
attrib_position = glGetAttribLocation(Program, "Position"); attrib_position = glGetAttribLocation(Program, "Position");
uniform_VP = glGetUniformLocation(Program, "ViewProjectionMatrix[0]");
uniform_MM = glGetUniformLocation(Program, "ModelMatrix"); uniform_MM = glGetUniformLocation(Program, "ModelMatrix");
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
} }
void ShadowShader::setUniforms(const core::matrix4 &ModelMatrix, const std::vector<core::matrix4> &ViewProjectionMatrix) void ShadowShader::setUniforms(const core::matrix4 &ModelMatrix)
{ {
size_t size = ViewProjectionMatrix.size();
float *tmp = new float[16 * size];
for (unsigned i = 0; i < size; i++) {
memcpy(&tmp[16 * i], ViewProjectionMatrix[i].pointer(), 16 * sizeof(float));
}
glUniformMatrix4fv(uniform_VP, size, GL_FALSE, tmp);
glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer()); glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer());
delete[] tmp;
} }
GLuint InstancedShadowShader::Program; GLuint InstancedShadowShader::Program;
@ -1434,7 +1439,6 @@ namespace MeshShader
GLuint InstancedShadowShader::attrib_origin; GLuint InstancedShadowShader::attrib_origin;
GLuint InstancedShadowShader::attrib_orientation; GLuint InstancedShadowShader::attrib_orientation;
GLuint InstancedShadowShader::attrib_scale; GLuint InstancedShadowShader::attrib_scale;
GLuint InstancedShadowShader::uniform_VP;
void InstancedShadowShader::init() void InstancedShadowShader::init()
{ {
@ -1453,24 +1457,17 @@ namespace MeshShader
attrib_origin = glGetAttribLocation(Program, "Origin"); attrib_origin = glGetAttribLocation(Program, "Origin");
attrib_orientation = glGetAttribLocation(Program, "Orientation"); attrib_orientation = glGetAttribLocation(Program, "Orientation");
attrib_scale = glGetAttribLocation(Program, "Scale"); attrib_scale = glGetAttribLocation(Program, "Scale");
uniform_VP = glGetUniformLocation(Program, "ViewProjectionMatrix[0]"); GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
} }
void InstancedShadowShader::setUniforms(const std::vector<core::matrix4> &ViewProjectionMatrix) void InstancedShadowShader::setUniforms()
{ {
size_t size = ViewProjectionMatrix.size();
float *tmp = new float[16 * size];
for (unsigned i = 0; i < size; i++) {
memcpy(&tmp[16 * i], ViewProjectionMatrix[i].pointer(), 16 * sizeof(float));
}
glUniformMatrix4fv(uniform_VP, size, GL_FALSE, tmp);
delete[] tmp;
} }
GLuint RefShadowShader::Program; GLuint RefShadowShader::Program;
GLuint RefShadowShader::attrib_position; GLuint RefShadowShader::attrib_position;
GLuint RefShadowShader::attrib_texcoord; GLuint RefShadowShader::attrib_texcoord;
GLuint RefShadowShader::uniform_VP;
GLuint RefShadowShader::uniform_MM; GLuint RefShadowShader::uniform_MM;
GLuint RefShadowShader::uniform_tex; GLuint RefShadowShader::uniform_tex;
@ -1489,22 +1486,16 @@ namespace MeshShader
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str()); GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/object_unlit.frag").c_str());
attrib_position = glGetAttribLocation(Program, "Position"); attrib_position = glGetAttribLocation(Program, "Position");
attrib_texcoord = glGetAttribLocation(Program, "Texcoord"); attrib_texcoord = glGetAttribLocation(Program, "Texcoord");
uniform_VP = glGetUniformLocation(Program, "ViewProjectionMatrix[0]");
uniform_tex = glGetUniformLocation(Program, "tex"); uniform_tex = glGetUniformLocation(Program, "tex");
uniform_MM = glGetUniformLocation(Program, "ModelMatrix"); uniform_MM = glGetUniformLocation(Program, "ModelMatrix");
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
} }
void RefShadowShader::setUniforms(const core::matrix4 &ModelMatrix, const std::vector<core::matrix4> &ViewProjectionMatrix, unsigned TU_tex) void RefShadowShader::setUniforms(const core::matrix4 &ModelMatrix, unsigned TU_tex)
{ {
size_t size = ViewProjectionMatrix.size();
float *tmp = new float[16 * size];
for (unsigned i = 0; i < size; i++) {
memcpy(&tmp[16 * i], ViewProjectionMatrix[i].pointer(), 16 * sizeof(float));
}
glUniformMatrix4fv(uniform_VP, size, GL_FALSE, tmp);
glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer()); glUniformMatrix4fv(uniform_MM, 1, GL_FALSE, ModelMatrix.pointer());
glUniform1i(uniform_tex, TU_tex); glUniform1i(uniform_tex, TU_tex);
delete[] tmp;
} }
GLuint InstancedRefShadowShader::Program; GLuint InstancedRefShadowShader::Program;
@ -1513,7 +1504,6 @@ namespace MeshShader
GLuint InstancedRefShadowShader::attrib_origin; GLuint InstancedRefShadowShader::attrib_origin;
GLuint InstancedRefShadowShader::attrib_orientation; GLuint InstancedRefShadowShader::attrib_orientation;
GLuint InstancedRefShadowShader::attrib_scale; GLuint InstancedRefShadowShader::attrib_scale;
GLuint InstancedRefShadowShader::uniform_VP;
GLuint InstancedRefShadowShader::uniform_tex; GLuint InstancedRefShadowShader::uniform_tex;
void InstancedRefShadowShader::init() void InstancedRefShadowShader::init()
@ -1535,20 +1525,14 @@ namespace MeshShader
attrib_origin = glGetAttribLocation(Program, "Origin"); attrib_origin = glGetAttribLocation(Program, "Origin");
attrib_orientation = glGetAttribLocation(Program, "Orientation"); attrib_orientation = glGetAttribLocation(Program, "Orientation");
attrib_scale = glGetAttribLocation(Program, "Scale"); attrib_scale = glGetAttribLocation(Program, "Scale");
uniform_VP = glGetUniformLocation(Program, "ViewProjectionMatrix[0]");
uniform_tex = glGetUniformLocation(Program, "tex"); uniform_tex = glGetUniformLocation(Program, "tex");
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
} }
void InstancedRefShadowShader::setUniforms(const std::vector<core::matrix4> &ViewProjectionMatrix, unsigned TU_tex) void InstancedRefShadowShader::setUniforms(unsigned TU_tex)
{ {
size_t size = ViewProjectionMatrix.size();
float *tmp = new float[16 * size];
for (unsigned i = 0; i < size; i++) {
memcpy(&tmp[16 * i], ViewProjectionMatrix[i].pointer(), 16 * sizeof(float));
}
glUniformMatrix4fv(uniform_VP, size, GL_FALSE, tmp);
glUniform1i(uniform_tex, TU_tex); glUniform1i(uniform_tex, TU_tex);
delete[] tmp;
} }
GLuint GrassShadowShader::Program; GLuint GrassShadowShader::Program;

View File

@ -30,6 +30,7 @@ class SharedObject
public: public:
static GLuint billboardvbo; static GLuint billboardvbo;
static GLuint cubevbo, cubeindexes; static GLuint cubevbo, cubeindexes;
static GLuint ViewProjectionMatrixesUBO;
}; };
namespace MeshShader namespace MeshShader
{ {
@ -326,10 +327,10 @@ class ShadowShader
public: public:
static GLuint Program; static GLuint Program;
static GLuint attrib_position; static GLuint attrib_position;
static GLuint uniform_VP, uniform_MM; static GLuint uniform_MM, uniform_ViewProjectionMatrixesUBO;
static void init(); static void init();
static void setUniforms(const core::matrix4 &ModelMatrix, const std::vector<core::matrix4> &ViewProjectionMatrix); static void setUniforms(const core::matrix4 &ModelMatrix);
}; };
class InstancedShadowShader class InstancedShadowShader
@ -337,10 +338,9 @@ class InstancedShadowShader
public: public:
static GLuint Program; static GLuint Program;
static GLuint attrib_position, attrib_origin, attrib_orientation, attrib_scale; static GLuint attrib_position, attrib_origin, attrib_orientation, attrib_scale;
static GLuint uniform_VP;
static void init(); static void init();
static void setUniforms(const std::vector<core::matrix4> &ViewProjectionMatrix); static void setUniforms();
}; };
class RefShadowShader class RefShadowShader
@ -348,10 +348,10 @@ class RefShadowShader
public: public:
static GLuint Program; static GLuint Program;
static GLuint attrib_position, attrib_texcoord; static GLuint attrib_position, attrib_texcoord;
static GLuint uniform_VP, uniform_MM, uniform_tex; static GLuint uniform_MM, uniform_tex;
static void init(); static void init();
static void setUniforms(const core::matrix4 &ModelMatrix, const std::vector<core::matrix4> &ModelViewProjectionMatrix, unsigned TU_tex); static void setUniforms(const core::matrix4 &ModelMatrix, unsigned TU_tex);
}; };
class InstancedRefShadowShader class InstancedRefShadowShader
@ -359,10 +359,10 @@ class InstancedRefShadowShader
public: public:
static GLuint Program; static GLuint Program;
static GLuint attrib_position, attrib_texcoord, attrib_origin, attrib_orientation, attrib_scale; static GLuint attrib_position, attrib_texcoord, attrib_origin, attrib_orientation, attrib_scale;
static GLuint uniform_VP, uniform_tex; static GLuint uniform_tex;
static void init(); static void init();
static void setUniforms(const std::vector<core::matrix4> &ModelViewProjectionMatrix, unsigned TU_tex); static void setUniforms(unsigned TU_tex);
}; };
class GrassShadowShader class GrassShadowShader

View File

@ -200,8 +200,7 @@ static void drawShadowDefault(GLMesh &mesh, size_t instance_count)
GLenum itype = mesh.IndexType; GLenum itype = mesh.IndexType;
size_t count = mesh.IndexCount; size_t count = mesh.IndexCount;
std::vector<core::matrix4> ShadowMVP(irr_driver->getShadowViewProj()); MeshShader::InstancedShadowShader::setUniforms();
MeshShader::InstancedShadowShader::setUniforms(ShadowMVP);
assert(mesh.vao_shadow_pass); assert(mesh.vao_shadow_pass);
glBindVertexArray(mesh.vao_shadow_pass); glBindVertexArray(mesh.vao_shadow_pass);
@ -229,10 +228,8 @@ static void drawShadowAlphaRefTexture(GLMesh &mesh, size_t instance_count)
GLenum itype = mesh.IndexType; GLenum itype = mesh.IndexType;
size_t count = mesh.IndexCount; size_t count = mesh.IndexCount;
std::vector<core::matrix4> ShadowMVP(irr_driver->getShadowViewProj());
setTexture(0, mesh.textures[0], GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); setTexture(0, mesh.textures[0], GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
MeshShader::InstancedRefShadowShader::setUniforms(ShadowMVP, 0); MeshShader::InstancedRefShadowShader::setUniforms(0);
assert(mesh.vao_shadow_pass); assert(mesh.vao_shadow_pass);
glBindVertexArray(mesh.vao_shadow_pass); glBindVertexArray(mesh.vao_shadow_pass);

View File

@ -667,10 +667,8 @@ void drawShadowRef(const GLMesh &mesh, const core::matrix4 &ModelMatrix)
GLenum itype = mesh.IndexType; GLenum itype = mesh.IndexType;
size_t count = mesh.IndexCount; size_t count = mesh.IndexCount;
std::vector<core::matrix4> ShadowMVP(irr_driver->getShadowViewProj());
setTexture(0, mesh.textures[0], GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); setTexture(0, mesh.textures[0], GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
MeshShader::RefShadowShader::setUniforms(ModelMatrix, ShadowMVP, 0); MeshShader::RefShadowShader::setUniforms(ModelMatrix, 0);
assert(mesh.vao_shadow_pass); assert(mesh.vao_shadow_pass);
glBindVertexArray(mesh.vao_shadow_pass); glBindVertexArray(mesh.vao_shadow_pass);
@ -684,16 +682,7 @@ void drawShadow(const GLMesh &mesh, const core::matrix4 &ModelMatrix)
GLenum itype = mesh.IndexType; GLenum itype = mesh.IndexType;
size_t count = mesh.IndexCount; size_t count = mesh.IndexCount;
std::vector<core::matrix4> ShadowMVP(irr_driver->getShadowViewProj()); MeshShader::ShadowShader::setUniforms(ModelMatrix);
/* if (type == irr_driver->getShader(ES_GRASS) || type == irr_driver->getShader(ES_GRASS_REF))
{
setTexture(0, mesh.textures[0], GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
glUseProgram(MeshShader::GrassShadowShader::Program);
MeshShader::GrassShadowShader::setUniforms(ShadowMVP, windDir, 0);
}*/
MeshShader::ShadowShader::setUniforms(ModelMatrix, ShadowMVP);
assert(mesh.vao_shadow_pass); assert(mesh.vao_shadow_pass);
glBindVertexArray(mesh.vao_shadow_pass); glBindVertexArray(mesh.vao_shadow_pass);