@@ -787,10 +787,8 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
787
787
resY /= res_mod;
788
788
}
789
789
790
- if (LLPipeline::sRenderTransparentWater )
791
- { // water reflection texture
792
- mWaterDis .allocate (resX, resY, GL_RGBA16F, true );
793
- }
790
+ // water reflection texture (always needed as scratch space whether or not transparent water is enabled)
791
+ mWaterDis .allocate (resX, resY, GL_RGBA16F, true );
794
792
795
793
if (RenderUIBuffer)
796
794
{
@@ -8239,7 +8237,6 @@ void LLPipeline::doAtmospherics()
8239
8237
8240
8238
if (RenderDeferredAtmospheric)
8241
8239
{
8242
- if (!sUnderWaterRender )
8243
8240
{
8244
8241
// copy depth buffer for use in haze shader (use water displacement map as temp storage)
8245
8242
LLGLDepthTest depth (GL_TRUE, GL_TRUE, GL_ALWAYS);
@@ -8274,7 +8271,7 @@ void LLPipeline::doAtmospherics()
8274
8271
LLGLSLShader& haze_shader = gHazeProgram ;
8275
8272
8276
8273
LL_PROFILE_GPU_ZONE (" haze" );
8277
- bindDeferredShader (haze_shader, nullptr , sUnderWaterRender ? nullptr : &mWaterDis );
8274
+ bindDeferredShader (haze_shader, nullptr , &mWaterDis );
8278
8275
8279
8276
LLEnvironment& environment = LLEnvironment::instance ();
8280
8277
haze_shader.uniform1i (LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp () ? 1 : 0 );
@@ -8300,6 +8297,32 @@ void LLPipeline::doWaterHaze()
8300
8297
8301
8298
if (RenderDeferredAtmospheric)
8302
8299
{
8300
+ // copy depth buffer for use in haze shader (use water displacement map as temp storage)
8301
+ {
8302
+ LLGLDepthTest depth (GL_TRUE, GL_TRUE, GL_ALWAYS);
8303
+
8304
+ LLRenderTarget& src = gPipeline .mRT ->screen ;
8305
+ LLRenderTarget& depth_src = gPipeline .mRT ->deferredScreen ;
8306
+ LLRenderTarget& dst = gPipeline .mWaterDis ;
8307
+
8308
+ mRT ->screen .flush ();
8309
+ dst.bindTarget ();
8310
+ gCopyDepthProgram .bind ();
8311
+
8312
+ S32 diff_map = gCopyDepthProgram .getTextureChannel (LLShaderMgr::DIFFUSE_MAP);
8313
+ S32 depth_map = gCopyDepthProgram .getTextureChannel (LLShaderMgr::DEFERRED_DEPTH);
8314
+
8315
+ gGL .getTexUnit (diff_map)->bind (&src);
8316
+ gGL .getTexUnit (depth_map)->bind (&depth_src, true );
8317
+
8318
+ gGL .setColorMask (false , false );
8319
+ gPipeline .mScreenTriangleVB ->setBuffer ();
8320
+ gPipeline .mScreenTriangleVB ->drawArrays (LLRender::TRIANGLES, 0 , 3 );
8321
+
8322
+ dst.flush ();
8323
+ mRT ->screen .bindTarget ();
8324
+ }
8325
+
8303
8326
LLGLEnable blend (GL_BLEND);
8304
8327
gGL .blendFunc (LLRender::BF_ONE, LLRender::BF_SOURCE_ALPHA, LLRender::BF_ZERO, LLRender::BF_SOURCE_ALPHA);
8305
8328
@@ -8309,7 +8332,7 @@ void LLPipeline::doWaterHaze()
8309
8332
LLGLSLShader& haze_shader = gHazeWaterProgram ;
8310
8333
8311
8334
LL_PROFILE_GPU_ZONE (" haze" );
8312
- bindDeferredShader (haze_shader);
8335
+ bindDeferredShader (haze_shader, nullptr , & mWaterDis );
8313
8336
8314
8337
haze_shader.uniform4fv (LLShaderMgr::WATER_WATERPLANE, 1 , LLDrawPoolAlpha::sWaterPlane .mV );
8315
8338
0 commit comments