Make use of UniformCache in many Renderables and switch from setUniform(const std::string&, ...) to setUniform(GLint, ...) in those cases

This commit is contained in:
Alexander Bock
2017-12-31 17:31:10 -05:00
parent 8ea5837f00
commit 47233b8e6f
41 changed files with 1329 additions and 855 deletions

View File

@@ -188,6 +188,25 @@ void RenderableModelProjection::initializeGL() {
absPath("${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModel_fs.glsl")
);
_mainUniformCache.performShading = _programObject->uniformLocation("_performShading");
_mainUniformCache.directionToSunViewSpace = _programObject->uniformLocation(
"directionToSunViewSpace"
);
_mainUniformCache.modelViewTransform = _programObject->uniformLocation(
"modelViewTransform"
);
_mainUniformCache.projectionTransform = _programObject->uniformLocation(
"projectionTransform"
);
_mainUniformCache.projectionFading = _programObject->uniformLocation(
"_projectionFading"
);
_mainUniformCache.baseTexture = _programObject->uniformLocation(
"baseTexture"
);
_mainUniformCache.projectionTexture = _programObject->uniformLocation(
"projectionTexture"
);
_fboProgramObject = ghoul::opengl::ProgramObject::Build(
"ProjectionPass",
@@ -198,9 +217,17 @@ void RenderableModelProjection::initializeGL() {
"${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModelProjection_fs.glsl"
)
);
_fboProgramObject->setIgnoreUniformLocationError(
ghoul::opengl::ProgramObject::IgnoreError::Yes
_fboUniformCache.projectionTexture = _fboProgramObject->uniformLocation(
"projectionTexture"
);
_fboUniformCache.needShadowMap = _fboProgramObject->uniformLocation("needShadowMap");
_fboUniformCache.ProjectorMatrix = _fboProgramObject->uniformLocation(
"ProjectorMatrix"
);
_fboUniformCache.ModelTransform = _fboProgramObject->uniformLocation("ModelTransform");
_fboUniformCache.boresight = _fboProgramObject->uniformLocation("boresight");
_depthFboProgramObject = ghoul::opengl::ProgramObject::Build(
"DepthPass",
@@ -208,6 +235,13 @@ void RenderableModelProjection::initializeGL() {
absPath("${MODULE_SPACECRAFTINSTRUMENTS}/shaders/renderableModelDepth_fs.glsl")
);
_depthFboUniformCache.ProjectorMatrix = _depthFboProgramObject->uniformLocation(
"ProjectorMatrix"
);
_depthFboUniformCache.ModelTransform = _depthFboProgramObject->uniformLocation(
"ModelTransform"
);
loadTextures();
_projectionComponent.initializeGL();
@@ -267,26 +301,34 @@ void RenderableModelProjection::render(const RenderData& data, RendererTasks&) {
data.camera.combinedViewMatrix()
) * directionToSun;
_programObject->setUniform("_performShading", _performShading);
_programObject->setUniform("directionToSunViewSpace", directionToSunViewSpace);
_programObject->setUniform("modelViewTransform", glm::mat4(modelViewTransform));
_programObject->setUniform("projectionTransform", data.camera.projectionMatrix());
_programObject->setUniform(_mainUniformCache.performShading, _performShading);
_programObject->setUniform(
"_projectionFading",
_mainUniformCache.directionToSunViewSpace,
directionToSunViewSpace
);
_programObject->setUniform(
_mainUniformCache.modelViewTransform,
glm::mat4(modelViewTransform)
);
_programObject->setUniform(
_mainUniformCache.projectionTransform,
data.camera.projectionMatrix()
);
_programObject->setUniform(
_mainUniformCache.projectionFading,
_projectionComponent.projectionFading()
);
_geometry->setUniforms(*_programObject);
ghoul::opengl::TextureUnit unit[2];
unit[0].activate();
_baseTexture->bind();
_programObject->setUniform("baseTexture", unit[0]);
_programObject->setUniform(_mainUniformCache.baseTexture, unit[0]);
unit[1].activate();
_projectionComponent.projectionTexture().bind();
_programObject->setUniform("projectionTexture", unit[1]);
_programObject->setUniform(_mainUniformCache.projectionTexture, unit[1]);
_geometry->render();
@@ -296,16 +338,59 @@ void RenderableModelProjection::render(const RenderData& data, RendererTasks&) {
void RenderableModelProjection::update(const UpdateData& data) {
if (_programObject->isDirty()) {
_programObject->rebuildFromFile();
_mainUniformCache.performShading = _programObject->uniformLocation(
"_performShading"
);
_mainUniformCache.directionToSunViewSpace = _programObject->uniformLocation(
"directionToSunViewSpace"
);
_mainUniformCache.modelViewTransform = _programObject->uniformLocation(
"modelViewTransform"
);
_mainUniformCache.projectionTransform = _programObject->uniformLocation(
"projectionTransform"
);
_mainUniformCache.projectionFading = _programObject->uniformLocation(
"_projectionFading"
);
_mainUniformCache.baseTexture = _programObject->uniformLocation(
"baseTexture"
);
_mainUniformCache.projectionTexture = _programObject->uniformLocation(
"projectionTexture"
);
}
if (_fboProgramObject->isDirty()) {
_fboProgramObject->rebuildFromFile();
_fboUniformCache.projectionTexture = _fboProgramObject->uniformLocation(
"projectionTexture"
);
_fboUniformCache.needShadowMap = _fboProgramObject->uniformLocation(
"needShadowMap"
);
_fboUniformCache.ProjectorMatrix = _fboProgramObject->uniformLocation(
"ProjectorMatrix"
);
_fboUniformCache.ModelTransform = _fboProgramObject->uniformLocation(
"ModelTransform"
);
_fboUniformCache.boresight = _fboProgramObject->uniformLocation("boresight");
}
_projectionComponent.update();
if (_depthFboProgramObject->isDirty()) {
_depthFboProgramObject->rebuildFromFile();
_depthFboUniformCache.ProjectorMatrix = _depthFboProgramObject->uniformLocation(
"ProjectorMatrix"
);
_depthFboUniformCache.ModelTransform = _depthFboProgramObject->uniformLocation(
"ModelTransform"
);
}
_time = data.time.j2000Seconds();
@@ -336,8 +421,14 @@ void RenderableModelProjection::imageProjectGPU(
if (_projectionComponent.needsShadowMap()) {
_projectionComponent.depthMapRenderBegin();
_depthFboProgramObject->activate();
_depthFboProgramObject->setUniform("ProjectorMatrix", _projectorMatrix);
_depthFboProgramObject->setUniform("ModelTransform", _transform);
_depthFboProgramObject->setUniform(
_depthFboUniformCache.ProjectorMatrix,
_projectorMatrix
);
_depthFboProgramObject->setUniform(
_depthFboUniformCache.ModelTransform,
_transform
);
_geometry->setUniforms(*_fboProgramObject);
_geometry->render();
@@ -352,9 +443,12 @@ void RenderableModelProjection::imageProjectGPU(
ghoul::opengl::TextureUnit unitFbo;
unitFbo.activate();
projectionTexture->bind();
_fboProgramObject->setUniform("projectionTexture", unitFbo);
_fboProgramObject->setUniform(_fboUniformCache.projectionTexture, unitFbo);
_fboProgramObject->setUniform("needShadowMap", _projectionComponent.needsShadowMap());
_fboProgramObject->setUniform(
_fboUniformCache.needShadowMap,
_projectionComponent.needsShadowMap()
);
ghoul::opengl::TextureUnit unitDepthFbo;
if (_projectionComponent.needsShadowMap()) {
@@ -363,9 +457,9 @@ void RenderableModelProjection::imageProjectGPU(
_fboProgramObject->setUniform("depthTexture", unitDepthFbo);
}
_fboProgramObject->setUniform("ProjectorMatrix", _projectorMatrix);
_fboProgramObject->setUniform("ModelTransform", _transform);
_fboProgramObject->setUniform("boresight", _boresight);
_fboProgramObject->setUniform(_fboUniformCache.ProjectorMatrix, _projectorMatrix);
_fboProgramObject->setUniform(_fboUniformCache.ModelTransform, _transform);
_fboProgramObject->setUniform(_fboUniformCache.boresight, _boresight);
_geometry->setUniforms(*_fboProgramObject);
_geometry->render();