Started to remove global DrawFullScreenEffect template.

This commit is contained in:
hiker 2015-05-20 08:41:03 +10:00
parent d64428db34
commit e241f167a7
5 changed files with 83 additions and 68 deletions

View File

@ -298,6 +298,13 @@ public:
assignUniforms("vignette_weight");
assignSamplerNames(0, "text", ST_NEAREST_FILTERED);
} // ToneMapShader
// ----------------------------------------------------------------------------
void render(FrameBuffer &fbo, GLuint rtt, float vignette_weight)
{
fbo.Bind();
setTextureUnits(rtt);
drawFullScreenEffect(vignette_weight);
} // render
}; // ToneMapShader
// ============================================================================
@ -361,7 +368,7 @@ public:
{
loadProgram(OBJECT, GL_VERTEX_SHADER, "rhdebug.vert",
GL_FRAGMENT_SHADER, "rhdebug.frag");
assignUniforms("RHMatrix", "extents");
assignUniforms("rh_matrix", "extents");
m_tu_shr = 0;
m_tu_shg = 1;
m_tu_shb = 2;
@ -383,13 +390,26 @@ public:
GL_FRAGMENT_SHADER, "utils/getPosFromUVDepth.frag",
GL_FRAGMENT_SHADER, "gi.frag");
assignUniforms("RHMatrix", "InvRHMatrix", "extents");
assignUniforms("rh_matrix", "inv_rh_matrix", "extents");
assignSamplerNames(0, "ntex", ST_NEAREST_FILTERED,
1, "dtex", ST_NEAREST_FILTERED,
2, "SHR", ST_VOLUME_LINEAR_FILTERED,
3, "SHG", ST_VOLUME_LINEAR_FILTERED,
4, "SHB", ST_VOLUME_LINEAR_FILTERED);
} // GlobalIlluminationReconstructionShader
// ------------------------------------------------------------------------
void render(const core::matrix4 &rh_matrix,
const core::vector3df &rh_extend, const FrameBuffer &fb)
{
core::matrix4 inv_rh_matrix;
rh_matrix.getInverse(inv_rh_matrix);
glDisable(GL_DEPTH_TEST);
setTextureUnits(irr_driver->getRenderTargetTexture(RTT_NORMAL_AND_DEPTH),
irr_driver->getDepthStencilTexture(),
fb.getRTT()[0], fb.getRTT()[1], fb.getRTT()[2]);
drawFullScreenEffect(rh_matrix, inv_rh_matrix, rh_extend);
} // render
}; // GlobalIlluminationReconstructionShader
// ============================================================================
@ -403,6 +423,13 @@ public:
assignUniforms("width", "height");
assignSamplerNames(0, "tex", ST_BILINEAR_FILTERED);
} // PassThroughShader
// ------------------------------------------------------------------------
void render(GLuint tex, unsigned width, unsigned height)
{
PassThroughShader::getInstance()->setTextureUnits(tex);
drawFullScreenEffect(width, height);
} // render
}; // PassThroughShader
// ============================================================================
@ -451,18 +478,27 @@ public:
// ============================================================================
class GlowShader : public TextureShader < GlowShader, 1 >
{
private:
GLuint m_vao;
public:
GLuint vao;
GlowShader()
{
loadProgram(OBJECT, GL_VERTEX_SHADER, "screenquad.vert",
GL_FRAGMENT_SHADER, "glow.frag");
GL_FRAGMENT_SHADER, "glow.frag");
assignUniforms();
assignSamplerNames(0, "tex", ST_BILINEAR_FILTERED);
vao = createVAO();
m_vao = createVAO();
} // GlowShader
// ------------------------------------------------------------------------
void render(unsigned tex)
{
use();
glBindVertexArray(m_vao);
setTextureUnits(tex);
setUniforms();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
} // render
}; // GlowShader
// ============================================================================
@ -510,7 +546,13 @@ public:
assignUniforms("col");
assignSamplerNames(0, "tex", ST_BILINEAR_FILTERED);
} // GodFadeShader
};
// ----------------------------------------------------------------------------
void render(GLuint tex, const SColor &col)
{
setTextureUnits(tex);
drawFullScreenEffect(col);
} // render
}; // GodFadeShader
// ============================================================================
class GodRayShader : public TextureShader<GodRayShader, 1, core::vector2df>
@ -524,6 +566,12 @@ public:
assignUniforms("sunpos");
assignSamplerNames(0, "tex", ST_BILINEAR_FILTERED);
} // GodRayShader
// ----------------------------------------------------------------------------
void render(GLuint tex, const core::vector2df &sunpos)
{
setTextureUnits(tex);
DrawFullScreenEffect<GodRayShader>(sunpos);
} // render
}; // GodRayShader
// ============================================================================
@ -825,18 +873,13 @@ void PostProcessing::renderRHDebug(unsigned SHR, unsigned SHG, unsigned SHB,
} // renderRHDebug
// ----------------------------------------------------------------------------
void PostProcessing::renderGI(const core::matrix4 &RHMatrix,
const core::vector3df &rh_extend, GLuint shr,
GLuint shg, GLuint shb)
void PostProcessing::renderGI(const core::matrix4 &rh_matrix,
const core::vector3df &rh_extend,
const FrameBuffer &fb)
{
core::matrix4 InvRHMatrix;
RHMatrix.getInverse(InvRHMatrix);
glDisable(GL_DEPTH_TEST);
GlobalIlluminationReconstructionShader::getInstance()
->setTextureUnits(irr_driver->getRenderTargetTexture(RTT_NORMAL_AND_DEPTH),
irr_driver->getDepthStencilTexture(), shr, shg, shb);
DrawFullScreenEffect<GlobalIlluminationReconstructionShader>
(RHMatrix, InvRHMatrix, rh_extend);
GlobalIlluminationReconstructionShader::getInstance()->render(rh_matrix,
rh_extend,
fb);
} // renderGI
// ----------------------------------------------------------------------------
@ -1126,8 +1169,7 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo,
void PostProcessing::renderPassThrough(GLuint tex, unsigned width,
unsigned height)
{
PassThroughShader::getInstance()->setTextureUnits(tex);
DrawFullScreenEffect<PassThroughShader>(width, height);
PassThroughShader::getInstance()->render(tex, width, height);
} // renderPassThrough
// ----------------------------------------------------------------------------
@ -1147,13 +1189,7 @@ void PostProcessing::renderTextureLayer(unsigned tex, unsigned layer)
// ----------------------------------------------------------------------------
void PostProcessing::renderGlow(unsigned tex)
{
GlowShader::getInstance()->use();
glBindVertexArray(GlowShader::getInstance()->vao);
GlowShader::getInstance()->setTextureUnits(tex);
GlowShader::getInstance()->setUniforms();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
GlowShader::getInstance()->render(tex);
} // renderGlow
// ----------------------------------------------------------------------------
@ -1219,27 +1255,6 @@ void PostProcessing::renderMotionBlur(unsigned , FrameBuffer &in_fbo,
0.15f);
} // renderMotionBlur
// ----------------------------------------------------------------------------
static void renderGodFade(GLuint tex, const SColor &col)
{
GodFadeShader::getInstance()->setTextureUnits(tex);
DrawFullScreenEffect<GodFadeShader>(col);
} // renderGodFade
// ----------------------------------------------------------------------------
static void renderGodRay(GLuint tex, const core::vector2df &sunpos)
{
GodRayShader::getInstance()->setTextureUnits(tex);
DrawFullScreenEffect<GodRayShader>(sunpos);
} // renderGodRay
// ----------------------------------------------------------------------------
static void toneMap(FrameBuffer &fbo, GLuint rtt, float vignette_weight)
{
fbo.Bind();
ToneMapShader::getInstance()->setTextureUnits(rtt);
DrawFullScreenEffect<ToneMapShader>(vignette_weight);
} // toneMap
// ----------------------------------------------------------------------------
static void renderDoF(FrameBuffer &fbo, GLuint rtt)
@ -1357,7 +1372,7 @@ FrameBuffer *PostProcessing::render(scene::ICameraSceneNode * const camnode,
irr_driver->getFBO(FBO_QUARTER1).Bind();
glViewport(0, 0, irr_driver->getActualScreenSize().Width / 4,
irr_driver->getActualScreenSize().Height / 4);
renderGodFade(out_fbo->getRTT()[0], col);
GodFadeShader::getInstance()->render(out_fbo->getRTT()[0], col);
// Blur
renderGaussian3Blur(irr_driver->getFBO(FBO_QUARTER1),
@ -1381,8 +1396,9 @@ FrameBuffer *PostProcessing::render(scene::ICameraSceneNode * const camnode,
// Rays please
irr_driver->getFBO(FBO_QUARTER2).Bind();
renderGodRay(irr_driver->getRenderTargetTexture(RTT_QUARTER1),
core::vector2df(sunx, suny));
GodRayShader::getInstance()
->render(irr_driver->getRenderTargetTexture(RTT_QUARTER1),
core::vector2df(sunx, suny) );
// Blur
renderGaussian3Blur(irr_driver->getFBO(FBO_QUARTER2),
@ -1484,14 +1500,8 @@ FrameBuffer *PostProcessing::render(scene::ICameraSceneNode * const camnode,
PROFILER_PUSH_CPU_MARKER("- Tonemap", 0xFF, 0x00, 0x00);
ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_TONEMAP));
// only enable vignette during race
if(isRace)
{
toneMap(*out_fbo, in_fbo->getRTT()[0], 1.0);
}
else
{
toneMap(*out_fbo, in_fbo->getRTT()[0], 0.0);
}
ToneMapShader::getInstance()->render(*out_fbo, in_fbo->getRTT()[0],
isRace ? 1.0f : 0.0f);
std::swap(in_fbo, out_fbo);
PROFILER_POP_CPU_MARKER();
}

View File

@ -84,10 +84,9 @@ public:
void renderRHDebug(unsigned SHR, unsigned SHG, unsigned SHB,
const core::matrix4 &rh_matrix,
const core::vector3df &rh_extend);
void renderGI(const core::matrix4 &RHMatrix,
const core::vector3df &rh_extend, unsigned shr,
unsigned shg, unsigned shb);
void renderGI(const core::matrix4 &rh_matrix,
const core::vector3df &rh_extend,
const FrameBuffer &fb);
/** Blur the in texture */
void renderGaussian3Blur(FrameBuffer &in_fbo, FrameBuffer &auxiliary);

View File

@ -532,7 +532,7 @@ void IrrDriver::renderScene(scene::ICameraSceneNode * const camnode, unsigned po
{
glDisable(GL_BLEND);
m_rtts->getFBO(FBO_COLORS).Bind();
m_post_processing->renderGI(rh_matrix, rh_extend, m_rtts->getRH().getRTT()[0], m_rtts->getRH().getRTT()[1], m_rtts->getRH().getRTT()[2]);
m_post_processing->renderGI(rh_matrix, rh_extend, m_rtts->getRH());
}
PROFILER_PUSH_CPU_MARKER("- Glow", 0xFF, 0xFF, 0x00);

View File

@ -449,10 +449,7 @@ void IrrDriver::renderLights(unsigned pointlightcount, bool hasShadow)
if (CVS->isGlobalIlluminationEnabled() && hasShadow)
{
ScopedGPUTimer timer(irr_driver->getGPUTimer(Q_GI));
m_post_processing->renderGI(rh_matrix, rh_extend,
m_rtts->getRH().getRTT()[0],
m_rtts->getRH().getRTT()[1],
m_rtts->getRH().getRTT()[2]);
m_post_processing->renderGI(rh_matrix, rh_extend, m_rtts->getRH());
}
m_rtts->getFBO(FBO_COMBINED_DIFFUSE_SPECULAR).Bind();

View File

@ -356,6 +356,15 @@ public:
}
} // loadProgram
// ------------------------------------------------------------------------
template<typename... Args>
void drawFullScreenEffect(Args...args)
{
use();
glBindVertexArray(SharedGPUObjects::getFullScreenQuadVAO());
setUniforms(args...);
glDrawArrays(GL_TRIANGLES, 0, 3);
} // drawFullScreenEffect
}; // Shader