SL-20611 Brute force fix for water haze -- paid for by cycles saved by not drawing water twice, but needs a better long term solution.
parent
4ca23735d9
commit
1f7f30aea4
|
|
@ -787,10 +787,8 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
|
|||
resY /= res_mod;
|
||||
}
|
||||
|
||||
if (LLPipeline::sRenderTransparentWater)
|
||||
{ //water reflection texture
|
||||
mWaterDis.allocate(resX, resY, GL_RGBA16F, true);
|
||||
}
|
||||
//water reflection texture (always needed as scratch space whether or not transparent water is enabled)
|
||||
mWaterDis.allocate(resX, resY, GL_RGBA16F, true);
|
||||
|
||||
if (RenderUIBuffer)
|
||||
{
|
||||
|
|
@ -8239,7 +8237,6 @@ void LLPipeline::doAtmospherics()
|
|||
|
||||
if (RenderDeferredAtmospheric)
|
||||
{
|
||||
if (!sUnderWaterRender)
|
||||
{
|
||||
// copy depth buffer for use in haze shader (use water displacement map as temp storage)
|
||||
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
|
||||
|
|
@ -8274,7 +8271,7 @@ void LLPipeline::doAtmospherics()
|
|||
LLGLSLShader& haze_shader = gHazeProgram;
|
||||
|
||||
LL_PROFILE_GPU_ZONE("haze");
|
||||
bindDeferredShader(haze_shader, nullptr, sUnderWaterRender ? nullptr : &mWaterDis);
|
||||
bindDeferredShader(haze_shader, nullptr, &mWaterDis);
|
||||
|
||||
LLEnvironment& environment = LLEnvironment::instance();
|
||||
haze_shader.uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);
|
||||
|
|
@ -8300,6 +8297,32 @@ void LLPipeline::doWaterHaze()
|
|||
|
||||
if (RenderDeferredAtmospheric)
|
||||
{
|
||||
// copy depth buffer for use in haze shader (use water displacement map as temp storage)
|
||||
{
|
||||
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
|
||||
|
||||
LLRenderTarget& src = gPipeline.mRT->screen;
|
||||
LLRenderTarget& depth_src = gPipeline.mRT->deferredScreen;
|
||||
LLRenderTarget& dst = gPipeline.mWaterDis;
|
||||
|
||||
mRT->screen.flush();
|
||||
dst.bindTarget();
|
||||
gCopyDepthProgram.bind();
|
||||
|
||||
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
|
||||
S32 depth_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DEFERRED_DEPTH);
|
||||
|
||||
gGL.getTexUnit(diff_map)->bind(&src);
|
||||
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
|
||||
|
||||
gGL.setColorMask(false, false);
|
||||
gPipeline.mScreenTriangleVB->setBuffer();
|
||||
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
|
||||
dst.flush();
|
||||
mRT->screen.bindTarget();
|
||||
}
|
||||
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_SOURCE_ALPHA, LLRender::BF_ZERO, LLRender::BF_SOURCE_ALPHA);
|
||||
|
||||
|
|
@ -8309,7 +8332,7 @@ void LLPipeline::doWaterHaze()
|
|||
LLGLSLShader& haze_shader = gHazeWaterProgram;
|
||||
|
||||
LL_PROFILE_GPU_ZONE("haze");
|
||||
bindDeferredShader(haze_shader);
|
||||
bindDeferredShader(haze_shader, nullptr, &mWaterDis);
|
||||
|
||||
haze_shader.uniform4fv(LLShaderMgr::WATER_WATERPLANE, 1, LLDrawPoolAlpha::sWaterPlane.mV);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue