Split point light scatter so it can be combined together
This commit is contained in:
parent
853084e75a
commit
9e57bfb73f
@ -4,6 +4,7 @@ uniform sampler2D ssao_tex;
|
||||
uniform sampler2D gloss_map;
|
||||
uniform sampler2D diffuse_color;
|
||||
uniform sampler2D depth_stencil;
|
||||
uniform sampler2D light_scatter;
|
||||
|
||||
out vec4 o_final_color;
|
||||
|
||||
@ -39,5 +40,14 @@ void main()
|
||||
vec3 fog = u_fog_color.xyz * factor;
|
||||
|
||||
// Additively blend the color by fog
|
||||
o_final_color = color_1 + vec4(fog, factor);
|
||||
color_1 = color_1 + vec4(fog, factor);
|
||||
|
||||
// Light scatter (alpha blend function: (GL_ONE, GL_ONE_MINUS_SRC_ALPHA))
|
||||
vec4 ls = texture(light_scatter, tc);
|
||||
vec4 color_2;
|
||||
color_2.r = ls.r + color_1.r * (1.0 - ls.a);
|
||||
color_2.g = ls.g + color_1.g * (1.0 - ls.a);
|
||||
color_2.b = ls.b + color_1.b * (1.0 - ls.a);
|
||||
color_2.a = ls.a + color_1.a * (1.0 - ls.a);
|
||||
o_final_color = color_2;
|
||||
}
|
||||
|
@ -106,6 +106,11 @@ public:
|
||||
glVertexAttribDivisorARB(attrib_Color, 1);
|
||||
glVertexAttribDivisorARB(attrib_Radius, 1);
|
||||
} // PointLightShader
|
||||
~PointLightShader()
|
||||
{
|
||||
glDeleteBuffers(1, &vbo);
|
||||
glDeleteVertexArrays(1, &vao);
|
||||
} // PointLightShader
|
||||
}; // PointLightShader
|
||||
|
||||
|
||||
@ -116,7 +121,6 @@ class PointLightScatterShader : public TextureShader<PointLightScatterShader,
|
||||
1, float, core::vector3df>
|
||||
{
|
||||
public:
|
||||
GLuint vbo;
|
||||
GLuint vao;
|
||||
PointLightScatterShader()
|
||||
{
|
||||
@ -157,6 +161,10 @@ public:
|
||||
glVertexAttribDivisorARB(attrib_Color, 1);
|
||||
glVertexAttribDivisorARB(attrib_Radius, 1);
|
||||
} // PointLightScatterShader
|
||||
~PointLightScatterShader()
|
||||
{
|
||||
glDeleteVertexArrays(1, &vao);
|
||||
} // ~PointLightScatterShader
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
@ -465,7 +473,6 @@ void LightingPasses::renderLights( bool has_shadow,
|
||||
void LightingPasses::renderLightsScatter(GLuint depth_stencil_texture,
|
||||
const FrameBuffer& half1_framebuffer,
|
||||
const FrameBuffer& half2_framebuffer,
|
||||
const FrameBuffer& colors_framebuffer,
|
||||
const PostProcessing* post_processing)
|
||||
{
|
||||
half1_framebuffer.bind();
|
||||
@ -505,14 +512,6 @@ void LightingPasses::renderLightsScatter(GLuint depth_stencil_texture,
|
||||
glDisable(GL_BLEND);
|
||||
post_processing->renderGaussian6Blur(half1_framebuffer,
|
||||
half2_framebuffer, 5., 5.);
|
||||
glEnable(GL_BLEND);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
colors_framebuffer.bind();
|
||||
post_processing->renderPassThrough(half1_framebuffer.getRTT()[0],
|
||||
colors_framebuffer.getWidth(),
|
||||
colors_framebuffer.getHeight());
|
||||
} // renderLightsScatter
|
||||
|
||||
#endif
|
||||
|
@ -55,11 +55,7 @@ public:
|
||||
void renderLightsScatter(GLuint depth_stencil_texture,
|
||||
const FrameBuffer& half1_framebuffer,
|
||||
const FrameBuffer& half2_framebuffer,
|
||||
const FrameBuffer& colors_framebuffer,
|
||||
const PostProcessing* post_processing);
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif //HEADER_LIGHTING_PASSES_HPP
|
||||
|
@ -905,11 +905,13 @@ void PostProcessing::renderGaussian6Blur(const FrameBuffer &in_fbo,
|
||||
if (!CVS->supportsComputeShadersFiltering())
|
||||
{
|
||||
auxiliary.bind();
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
Gaussian6VBlurShader::getInstance()
|
||||
->render(in_fbo.getRTT()[0], in_fbo.getWidth(), in_fbo.getHeight(),
|
||||
sigma_v);
|
||||
|
||||
in_fbo.bind();
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
Gaussian6HBlurShader::getInstance()->setTextureUnits(auxiliary.getRTT()[0]);
|
||||
Gaussian6HBlurShader::getInstance()->render(auxiliary, in_fbo.getWidth(),
|
||||
in_fbo.getHeight(), sigma_h);
|
||||
@ -959,9 +961,11 @@ void PostProcessing::renderHorizontalBlur(const FrameBuffer &in_fbo,
|
||||
in_fbo.getHeight() == auxiliary.getHeight());
|
||||
|
||||
auxiliary.bind();
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
Gaussian6HBlurShader::getInstance()->render(in_fbo, in_fbo.getWidth(),
|
||||
in_fbo.getHeight(), 2.0f );
|
||||
in_fbo.bind();
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
Gaussian6HBlurShader::getInstance()->render(auxiliary, in_fbo.getWidth(),
|
||||
in_fbo.getHeight(), 2.0f);
|
||||
} // renderHorizontalBlur
|
||||
|
@ -303,6 +303,9 @@ RTT::RTT(unsigned int width, unsigned int height, float rtt_scale,
|
||||
getFBO(FBO_HALF1_R).bind();
|
||||
glClearColor(1., 1., 1., 1.);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
getFBO(FBO_HALF1).bind();
|
||||
glClearColor(0., 0., 0., 0.);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
}
|
||||
|
@ -195,7 +195,7 @@ void ShaderBasedRenderer::renderShadows()
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
class CombineDiffuseColor : public TextureShader<CombineDiffuseColor, 6>
|
||||
class CombineDiffuseColor : public TextureShader<CombineDiffuseColor, 7>
|
||||
{
|
||||
public:
|
||||
CombineDiffuseColor()
|
||||
@ -208,13 +208,14 @@ public:
|
||||
2, "ssao_tex", ST_NEAREST_FILTERED,
|
||||
3, "gloss_map", ST_NEAREST_FILTERED,
|
||||
4, "diffuse_color", ST_NEAREST_FILTERED,
|
||||
5, "depth_stencil", ST_NEAREST_FILTERED);
|
||||
5, "depth_stencil", ST_NEAREST_FILTERED,
|
||||
6, "light_scatter", ST_NEAREST_FILTERED);
|
||||
} // CombineDiffuseColor
|
||||
// ------------------------------------------------------------------------
|
||||
void render(GLuint dm, GLuint sm, GLuint st, GLuint gm, GLuint dc,
|
||||
GLuint ds)
|
||||
GLuint ds, GLuint lt)
|
||||
{
|
||||
setTextureUnits(dm, sm, st, gm, dc, ds);
|
||||
setTextureUnits(dm, sm, st, gm, dc, ds, lt);
|
||||
drawFullScreenEffect();
|
||||
} // render
|
||||
}; // CombineDiffuseColor
|
||||
@ -311,6 +312,19 @@ void ShaderBasedRenderer::renderSceneDeferred(scene::ICameraSceneNode * const ca
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
}
|
||||
|
||||
const Track * const track = Track::getCurrentTrack();
|
||||
// Render discrete lights scattering
|
||||
if (track && track->isFogEnabled())
|
||||
{
|
||||
PROFILER_PUSH_CPU_MARKER("- PointLight Scatter", 0xFF, 0x00, 0x00);
|
||||
ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_FOG));
|
||||
m_lighting_passes.renderLightsScatter(m_rtts->getDepthStencilTexture(),
|
||||
m_rtts->getFBO(FBO_HALF1),
|
||||
m_rtts->getFBO(FBO_HALF2),
|
||||
m_post_processing);
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
}
|
||||
|
||||
m_rtts->getFBO(FBO_COLORS).bind();
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
@ -326,7 +340,8 @@ void ShaderBasedRenderer::renderSceneDeferred(scene::ICameraSceneNode * const ca
|
||||
m_rtts->getRenderTarget(RTT_HALF1_R),
|
||||
m_rtts->getRenderTarget(RTT_SP_GLOSS),
|
||||
m_rtts->getRenderTarget(RTT_SP_DIFF_COLOR),
|
||||
m_rtts->getDepthStencilTexture());
|
||||
m_rtts->getDepthStencilTexture(),
|
||||
m_rtts->getRenderTarget(RTT_HALF1));
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
}
|
||||
|
||||
@ -346,19 +361,6 @@ void ShaderBasedRenderer::renderSceneDeferred(scene::ICameraSceneNode * const ca
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
}
|
||||
|
||||
const Track * const track = Track::getCurrentTrack();
|
||||
// Render discrete lights scattering
|
||||
if (track && track->isFogEnabled())
|
||||
{
|
||||
PROFILER_PUSH_CPU_MARKER("- PointLight Scatter", 0xFF, 0x00, 0x00);
|
||||
ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_FOG));
|
||||
m_lighting_passes.renderLightsScatter(m_rtts->getDepthStencilTexture(),
|
||||
m_rtts->getFBO(FBO_HALF1),
|
||||
m_rtts->getFBO(FBO_HALF2),
|
||||
m_rtts->getFBO(FBO_COLORS),
|
||||
m_post_processing);
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
}
|
||||
|
||||
PROFILER_PUSH_CPU_MARKER("- Glow", 0xFF, 0xFF, 0x00);
|
||||
// Render anything glowing.
|
||||
|
Loading…
Reference in New Issue
Block a user