Skip to content

Commit

Permalink
#5912: Skip setting the object transform using glMultMatrix, instead …
Browse files Browse the repository at this point in the history
…pass the object transform to the GLSL shader.

Remove unused z-fill program without alphatest.
  • Loading branch information
codereader committed Mar 12, 2022
1 parent e846a12 commit 51ab0ed
Show file tree
Hide file tree
Showing 16 changed files with 90 additions and 29 deletions.
11 changes: 8 additions & 3 deletions install/gl/interaction_vp.glsl
Expand Up @@ -26,8 +26,9 @@ attribute vec3 attr_Bitangent;
attribute vec3 attr_Normal;
attribute vec4 attr_Colour;

uniform vec4 u_colourModulation;
uniform vec4 u_colourAddition;
uniform vec4 u_colourModulation;
uniform vec4 u_colourAddition;
uniform mat4 u_objectTransform;

varying vec3 var_vertex;
varying vec4 var_tex_diffuse_bump;
Expand All @@ -38,6 +39,10 @@ varying vec4 var_Colour; // colour to be multiplied on the final fragment

void main()
{
vec4 untransformedVertex = gl_Vertex;

gl_Vertex = u_objectTransform * gl_Vertex;

// transform vertex position into homogenous clip-space
gl_Position = ftransform();

Expand All @@ -54,7 +59,7 @@ void main()
var_tex_specular = (gl_TextureMatrix[2] * attr_TexCoord0).st;

// calc light xy,z attenuation in light space
var_tex_atten_xy_z = gl_TextureMatrix[3] * gl_Vertex;
var_tex_atten_xy_z = gl_TextureMatrix[3] * untransformedVertex;

// construct object-space-to-tangent-space 3x3 matrix
var_mat_os2ts = mat3(
Expand Down
7 changes: 4 additions & 3 deletions install/gl/zfill_alpha_fp.glsl
@@ -1,13 +1,14 @@
#version 120

uniform sampler2D u_diffuse;
uniform float u_alpha_test;
uniform float u_alphaTest;
uniform mat4 u_objectTransform;

varying vec2 var_tex_diffuse;

void main()
{
if (u_alpha_test < 0)
if (u_alphaTest < 0)
{
gl_FragColor.a = 1.0;
gl_FragColor.rgb = vec3(1.0, 1.0, 0.0);
Expand All @@ -16,7 +17,7 @@ void main()
{
vec4 tex = texture2D(u_diffuse, var_tex_diffuse);

if (tex.a <= u_alpha_test)
if (tex.a <= u_alphaTest)
{
discard;
}
Expand Down
5 changes: 5 additions & 0 deletions install/gl/zfill_vp.glsl
Expand Up @@ -22,10 +22,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

attribute vec4 attr_TexCoord0;

uniform mat4 u_objectTransform;

varying vec2 var_tex_diffuse;

void main()
{
// Apply the supplied object transform to the incoming vertex
gl_Vertex = u_objectTransform * gl_Vertex;

// transform vertex position into homogenous clip-space
gl_Position = ftransform();

Expand Down
1 change: 0 additions & 1 deletion radiantcore/CMakeLists.txt
Expand Up @@ -216,7 +216,6 @@ add_library(radiantcore MODULE
rendersystem/backend/glprogram/GLSLProgramBase.cpp
rendersystem/backend/glprogram/GLSLBumpProgram.cpp
rendersystem/backend/glprogram/GLSLCubeMapProgram.cpp
rendersystem/backend/glprogram/GLSLDepthFillProgram.cpp
rendersystem/backend/glprogram/GLSLDepthFillAlphaProgram.cpp
rendersystem/backend/BuiltInShader.cpp
rendersystem/backend/ColourShader.cpp
Expand Down
6 changes: 6 additions & 0 deletions radiantcore/rendersystem/backend/DepthFillPass.h
@@ -1,6 +1,7 @@
#pragma once

#include "OpenGLShaderPass.h"
#include "glprogram/GLSLDepthFillAlphaProgram.h"

namespace render
{
Expand All @@ -17,6 +18,11 @@ class DepthFillPass :
public:
DepthFillPass(OpenGLShader& owner, OpenGLRenderSystem& renderSystem);

GLSLDepthFillAlphaProgram& getDepthFillProgram()
{
return *static_cast<GLSLDepthFillAlphaProgram*>(_glState.glProgram);
}

protected:
virtual void activateShaderProgram(OpenGLState& current) override;
};
Expand Down
1 change: 0 additions & 1 deletion radiantcore/rendersystem/backend/GLProgramFactory.cpp
Expand Up @@ -24,7 +24,6 @@ using CharBufPtr = std::shared_ptr<std::vector<char>>;
// Constructor, populates map with GLProgram instances
GLProgramFactory::GLProgramFactory()
{
_builtInPrograms[ShaderProgram::DepthFill] = std::make_shared<GLSLDepthFillProgram>();
_builtInPrograms[ShaderProgram::DepthFillAlpha] = std::make_shared<GLSLDepthFillAlphaProgram>();
_builtInPrograms[ShaderProgram::Interaction] = std::make_shared<GLSLBumpProgram>();
_builtInPrograms[ShaderProgram::CubeMap] = std::make_shared<GLSLCubeMapProgram>();
Expand Down
6 changes: 6 additions & 0 deletions radiantcore/rendersystem/backend/InteractionPass.h
@@ -1,6 +1,7 @@
#pragma once

#include "OpenGLShaderPass.h"
#include "glprogram/GLSLBumpProgram.h"

namespace render
{
Expand All @@ -15,6 +16,11 @@ class InteractionPass :
{
public:
InteractionPass(OpenGLShader& owner, OpenGLRenderSystem& renderSystem);

GLSLBumpProgram& getProgram()
{
return *static_cast<GLSLBumpProgram*>(_glState.glProgram);
}
};

}
18 changes: 14 additions & 4 deletions radiantcore/rendersystem/backend/LightInteractions.cpp
Expand Up @@ -66,7 +66,9 @@ void LightInteractions::fillDepthBuffer(OpenGLState& state, RenderStateFlags glo
{
for (const auto& [shader, objects] : objectsByShader)
{
if (!shader->getDepthFillPass()) continue;
auto depthFillPass = shader->getDepthFillPass();

if (!depthFillPass) continue;

// Skip translucent materials
if (shader->getMaterial() && shader->getMaterial()->getCoverage() == Material::MC_TRANSLUCENT)
Expand All @@ -75,7 +77,7 @@ void LightInteractions::fillDepthBuffer(OpenGLState& state, RenderStateFlags glo
}

// Apply our state to the current state object
shader->getDepthFillPass()->applyState(state, globalFlagsMask, view.getViewer(), renderTime, entity);
depthFillPass->applyState(state, globalFlagsMask, view.getViewer(), renderTime, entity);

for (const auto& object : objects)
{
Expand All @@ -86,12 +88,16 @@ void LightInteractions::fillDepthBuffer(OpenGLState& state, RenderStateFlags glo
continue;
}

ObjectRenderer::SubmitObject(object.get(), _store);
depthFillPass->getDepthFillProgram().setObjectTransform(object.get().getObjectTransform());

ObjectRenderer::SubmitGeometry(object.get().getStorageLocation(), GL_TRIANGLES, _store);
++_drawCalls;
}

if (!untransformedObjects.empty())
{
depthFillPass->getDepthFillProgram().setObjectTransform(Matrix4::getIdentity());

ObjectRenderer::SubmitGeometry(untransformedObjects, GL_TRIANGLES, _store);
++_drawCalls;

Expand Down Expand Up @@ -131,7 +137,9 @@ void LightInteractions::render(OpenGLState& state, RenderStateFlags globalFlagsM
OpenGLShaderPass::SetUpLightingCalculation(state, &_light, worldToLight,
view.getViewer(), object.get().getObjectTransform(), renderTime);

ObjectRenderer::SubmitObject(object.get(), _store);
pass->getProgram().setObjectTransform(object.get().getObjectTransform());

ObjectRenderer::SubmitGeometry(object.get().getStorageLocation(), GL_TRIANGLES, _store);
++_drawCalls;
}

Expand All @@ -140,6 +148,8 @@ void LightInteractions::render(OpenGLState& state, RenderStateFlags globalFlagsM
OpenGLShaderPass::SetUpLightingCalculation(state, &_light, worldToLight,
view.getViewer(), Matrix4::getIdentity(), renderTime);

pass->getProgram().setObjectTransform(Matrix4::getIdentity());

ObjectRenderer::SubmitGeometry(untransformedObjects, GL_TRIANGLES, _store);
++_drawCalls;

Expand Down
12 changes: 8 additions & 4 deletions radiantcore/rendersystem/backend/OpenGLShader.cpp
Expand Up @@ -379,13 +379,17 @@ OpenGLState& OpenGLShader::appendDefaultPass()

OpenGLState& OpenGLShader::appendDepthFillPass()
{
_depthFillPass = _shaderPasses.emplace_back(std::make_shared<DepthFillPass>(*this, _renderSystem));
_depthFillPass = std::make_shared<DepthFillPass>(*this, _renderSystem);
_shaderPasses.push_back(_depthFillPass);

return _depthFillPass->state();
}

OpenGLState& OpenGLShader::appendInteractionPass()
{
_interactionPass = _shaderPasses.emplace_back(std::make_shared<InteractionPass>(*this, _renderSystem));
_interactionPass = std::make_shared<InteractionPass>(*this, _renderSystem);
_shaderPasses.push_back(_interactionPass);

return _interactionPass->state();
}

Expand Down Expand Up @@ -847,12 +851,12 @@ void OpenGLShader::foreachNonInteractionPass(const std::function<void(OpenGLShad
}
}

OpenGLShaderPass* OpenGLShader::getDepthFillPass() const
DepthFillPass* OpenGLShader::getDepthFillPass() const
{
return _depthFillPass.get();
}

OpenGLShaderPass* OpenGLShader::getInteractionPass() const
InteractionPass* OpenGLShader::getInteractionPass() const
{
return _interactionPass.get();
}
Expand Down
10 changes: 6 additions & 4 deletions radiantcore/rendersystem/backend/OpenGLShader.h
Expand Up @@ -9,6 +9,8 @@
#include "WindingRenderer.h"
#include "GeometryRenderer.h"
#include "SurfaceRenderer.h"
#include "DepthFillPass.h"
#include "InteractionPass.h"

#include <list>
#include <sigc++/connection.h>
Expand Down Expand Up @@ -36,10 +38,10 @@ class OpenGLShader :

// The depth fill pass of this shader (can be empty).
// Lighting mode needs to have quick access to this pass
OpenGLShaderPassPtr _depthFillPass;
std::shared_ptr<DepthFillPass> _depthFillPass;

// Interaction pass used by lighting mode
OpenGLShaderPassPtr _interactionPass;
std::shared_ptr<InteractionPass> _interactionPass;

// The Material corresponding to this OpenGLShader
MaterialPtr _material;
Expand Down Expand Up @@ -157,10 +159,10 @@ class OpenGLShader :
void foreachNonInteractionPass(const std::function<void(OpenGLShaderPass&)>& functor);

// Returns the depth fill pass of this shader, or null if this shader doesn't have one
OpenGLShaderPass* getDepthFillPass() const;
DepthFillPass* getDepthFillPass() const;

// Returns the interaction pass of this shader, or null if this shader doesn't have one
OpenGLShaderPass* getInteractionPass() const;
InteractionPass* getInteractionPass() const;

protected:
// Start point for constructing shader passes from the shader name
Expand Down
13 changes: 13 additions & 0 deletions radiantcore/rendersystem/backend/glprogram/GLSLBumpProgram.cpp
Expand Up @@ -53,6 +53,7 @@ void GLSLBumpProgram::create()
_locAmbientLight = glGetUniformLocation(_programObj, "uAmbientLight");
_locColourModulation = glGetUniformLocation(_programObj, "u_colourModulation");
_locColourAddition = glGetUniformLocation(_programObj, "u_colourAddition");
_locObjectTransform = glGetUniformLocation(_programObj, "u_objectTransform");

// Set up the texture uniforms. The renderer uses fixed texture units for
// particular textures, so make sure they are correct here.
Expand Down Expand Up @@ -186,6 +187,18 @@ void GLSLBumpProgram::applyRenderParams(const Vector3& viewer,
debug::assertNoGlErrors();
}

void GLSLBumpProgram::setObjectTransform(const Matrix4& transform)
{
float values[16];

for (auto i = 0; i < 16; ++i)
{
values[i] = static_cast<float>(transform[i]);
}

glUniformMatrix4fv(_locObjectTransform, 1, GL_FALSE, values);
}

}


Expand Down
3 changes: 3 additions & 0 deletions radiantcore/rendersystem/backend/glprogram/GLSLBumpProgram.h
Expand Up @@ -21,6 +21,7 @@ class GLSLBumpProgram :
int _locAmbientLight;
int _locColourModulation;
int _locColourAddition;
int _locObjectTransform;

public:

Expand All @@ -29,6 +30,8 @@ class GLSLBumpProgram :
void enable() override;
void disable() override;

void setObjectTransform(const Matrix4& transform);

void applyRenderParams(const Vector3& viewer,
const Matrix4& localToWorld,
const Params&) override;
Expand Down
Expand Up @@ -30,7 +30,8 @@ void GLSLDepthFillAlphaProgram::create()

debug::assertNoGlErrors();

_locAlphaTest = glGetUniformLocation(_programObj, "u_alpha_test");
_locAlphaTest = glGetUniformLocation(_programObj, "u_alphaTest");
_locObjectTransform = glGetUniformLocation(_programObj, "u_objectTransform");

glUseProgram(_programObj);
debug::assertNoGlErrors();
Expand Down Expand Up @@ -72,5 +73,17 @@ void GLSLDepthFillAlphaProgram::applyAlphaTest(float alphaTest)
debug::assertNoGlErrors();
}

void GLSLDepthFillAlphaProgram::setObjectTransform(const Matrix4& transform)
{
float values[16];

for (auto i = 0; i < 16; ++i)
{
values[i] = static_cast<float>(transform[i]);
}

glUniformMatrix4fv(_locObjectTransform, 1, GL_FALSE, values);
}

}

Expand Up @@ -10,12 +10,15 @@ class GLSLDepthFillAlphaProgram :
{
private:
GLint _locAlphaTest;
GLint _locObjectTransform;

public:
void create() override;
void enable() override;
void disable() override;

void setObjectTransform(const Matrix4& transform);

void applyAlphaTest(float alphaTest);
};

Expand Down
2 changes: 0 additions & 2 deletions tools/msvc/DarkRadiantCore.vcxproj
Expand Up @@ -633,7 +633,6 @@
<ClCompile Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLBumpProgram.cpp" />
<ClCompile Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLCubeMapProgram.cpp" />
<ClCompile Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLDepthFillAlphaProgram.cpp" />
<ClCompile Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLDepthFillProgram.cpp" />
<ClCompile Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLProgramBase.cpp" />
<ClCompile Include="..\..\radiantcore\rendersystem\backend\InteractionPass.cpp" />
<ClCompile Include="..\..\radiantcore\rendersystem\backend\LightingModeRenderer.cpp" />
Expand Down Expand Up @@ -1004,7 +1003,6 @@
<ClInclude Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLBumpProgram.h" />
<ClInclude Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLCubeMapProgram.h" />
<ClInclude Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLDepthFillAlphaProgram.h" />
<ClInclude Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLDepthFillProgram.h" />
<ClInclude Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLProgramBase.h" />
<ClInclude Include="..\..\radiantcore\rendersystem\backend\InteractionPass.h" />
<ClInclude Include="..\..\radiantcore\rendersystem\backend\LightingModeRenderer.h" />
Expand Down
6 changes: 0 additions & 6 deletions tools/msvc/DarkRadiantCore.vcxproj.filters
Expand Up @@ -391,9 +391,6 @@
<ClCompile Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLBumpProgram.cpp">
<Filter>src\rendersystem\backend\glprogram</Filter>
</ClCompile>
<ClCompile Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLDepthFillProgram.cpp">
<Filter>src\rendersystem\backend\glprogram</Filter>
</ClCompile>
<ClCompile Include="..\..\radiantcore\rendersystem\debug\SpacePartitionRenderer.cpp">
<Filter>src\rendersystem\debug</Filter>
</ClCompile>
Expand Down Expand Up @@ -1428,9 +1425,6 @@
<ClInclude Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLBumpProgram.h">
<Filter>src\rendersystem\backend\glprogram</Filter>
</ClInclude>
<ClInclude Include="..\..\radiantcore\rendersystem\backend\glprogram\GLSLDepthFillProgram.h">
<Filter>src\rendersystem\backend\glprogram</Filter>
</ClInclude>
<ClInclude Include="..\..\radiantcore\rendersystem\debug\SpacePartitionRenderer.h">
<Filter>src\rendersystem\debug</Filter>
</ClInclude>
Expand Down

0 comments on commit 51ab0ed

Please sign in to comment.