Skip to content

Commit f3b8714

Browse files
committed
SL-20611 Followup -- fix for artifacts on water surface from GPUs that don't like to read from a depth buffer that is bound for writing
1 parent 4024a4d commit f3b8714

File tree

6 files changed

+60
-19
lines changed

6 files changed

+60
-19
lines changed

indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,26 @@ float getDepth(vec2 pos_screen);
3535

3636
vec4 getWaterFogView(vec3 pos);
3737

38+
uniform int above_water;
39+
3840
void main()
3941
{
4042
vec2 tc = vary_fragcoord.xy/vary_fragcoord.w*0.5+0.5;
4143
float depth = getDepth(tc.xy);
44+
45+
if (above_water > 0)
46+
{
47+
// we want to depth test when the camera is above water, but some GPUs have a hard time
48+
// with depth testing against render targets that are bound for sampling in the same shader
49+
// so we do it manually here
50+
51+
float cur_depth = vary_fragcoord.z/vary_fragcoord.w*0.5+0.5;
52+
if (cur_depth > depth)
53+
{
54+
discard;
55+
}
56+
}
57+
4258
vec4 pos = getPositionWithDepth(tc, depth);
4359
vec4 norm = texture(normalMap, tc);
4460

indra/newview/app_settings/shaders/class3/environment/underWaterF.glsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ uniform sampler2D bumpMap;
3030

3131
#ifdef TRANSPARENT_WATER
3232
uniform sampler2D screenTex;
33-
uniform sampler2D screenDepth;
3433
#endif
3534

3635
uniform vec4 fogCol;

indra/newview/app_settings/shaders/class3/environment/waterF.glsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ uniform sampler2D bumpMap2;
7676
uniform float blend_factor;
7777
#ifdef TRANSPARENT_WATER
7878
uniform sampler2D screenTex;
79-
uniform sampler2D screenDepth;
79+
uniform sampler2D depthMap;
8080
#endif
8181

8282
uniform sampler2D refTex;
@@ -210,15 +210,15 @@ void main()
210210

211211
#ifdef TRANSPARENT_WATER
212212
vec4 fb = texture(screenTex, distort2);
213-
float depth = texture(screenDepth, distort2).r;
213+
float depth = texture(depthMap, distort2).r;
214214
vec3 refPos = getPositionWithNDC(vec3(distort2*2.0-vec2(1.0), depth*2.0-1.0));
215215

216216
if (refPos.z > pos.z-0.05)
217217
{
218218
//we sampled an above water sample, don't distort
219219
distort2 = distort;
220220
fb = texture(screenTex, distort2);
221-
depth = texture(screenDepth, distort2).r;
221+
depth = texture(depthMap, distort2).r;
222222
refPos = getPositionWithNDC(vec3(distort2 * 2.0 - vec2(1.0), depth * 2.0 - 1.0));
223223
}
224224

indra/newview/lldrawpoolwater.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
206206
}
207207
}
208208

209-
gPipeline.bindDeferredShader(*shader);
209+
gPipeline.bindDeferredShader(*shader, nullptr, &gPipeline.mWaterDis);
210210

211211
//bind normal map
212212
S32 bumpTex = shader->enableTexture(LLViewerShaderMgr::BUMP_MAP);
@@ -238,7 +238,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
238238

239239
// bind reflection texture from RenderTarget
240240
S32 screentex = shader->enableTexture(LLShaderMgr::WATER_SCREENTEX);
241-
S32 screenDepth = shader->enableTexture(LLShaderMgr::WATER_SCREENDEPTH);
242241

243242
F32 screenRes[] = { 1.f / gGLViewport[2], 1.f / gGLViewport[3] };
244243

@@ -255,11 +254,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
255254
gGL.getTexUnit(screentex)->bind(&gPipeline.mWaterDis);
256255
}
257256

258-
if (screenDepth > -1)
259-
{
260-
gGL.getTexUnit(screenDepth)->bind(&gPipeline.mWaterDis, true);
261-
}
262-
263257
if (mShaderLevel == 1)
264258
{
265259
fog_color.mV[VW] = log(fog_density) / log(2);
@@ -342,7 +336,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
342336
shader->disableTexture(LLShaderMgr::BUMP_MAP);
343337
shader->disableTexture(LLShaderMgr::DIFFUSE_MAP);
344338
shader->disableTexture(LLShaderMgr::WATER_REFTEX);
345-
shader->disableTexture(LLShaderMgr::WATER_SCREENDEPTH);
346339

347340
// clean up
348341
gPipeline.unbindDeferredShader(*shader);

indra/newview/pipeline.cpp

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7476,7 +7476,7 @@ void LLPipeline::bindDeferredShaderFast(LLGLSLShader& shader)
74767476
}
74777477
}
74787478

7479-
void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_target)
7479+
void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_target, LLRenderTarget* depth_target)
74807480
{
74817481
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
74827482
LLRenderTarget* deferred_target = &mRT->deferredScreen;
@@ -7515,7 +7515,14 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
75157515
channel = shader.enableTexture(LLShaderMgr::DEFERRED_DEPTH, deferred_target->getUsage());
75167516
if (channel > -1)
75177517
{
7518-
gGL.getTexUnit(channel)->bind(deferred_target, TRUE);
7518+
if (depth_target)
7519+
{
7520+
gGL.getTexUnit(channel)->bind(depth_target, TRUE);
7521+
}
7522+
else
7523+
{
7524+
gGL.getTexUnit(channel)->bind(deferred_target, TRUE);
7525+
}
75197526
stop_glerror();
75207527
}
75217528

@@ -8232,16 +8239,42 @@ void LLPipeline::doAtmospherics()
82328239

82338240
if (RenderDeferredAtmospheric)
82348241
{
8242+
if (!sUnderWaterRender)
8243+
{
8244+
// copy depth buffer for use in haze shader (use water displacement map as temp storage)
8245+
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
8246+
8247+
LLRenderTarget& src = gPipeline.mRT->screen;
8248+
LLRenderTarget& depth_src = gPipeline.mRT->deferredScreen;
8249+
LLRenderTarget& dst = gPipeline.mWaterDis;
8250+
8251+
mRT->screen.flush();
8252+
dst.bindTarget();
8253+
gCopyDepthProgram.bind();
8254+
8255+
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
8256+
S32 depth_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DEFERRED_DEPTH);
8257+
8258+
gGL.getTexUnit(diff_map)->bind(&src);
8259+
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
8260+
8261+
gGL.setColorMask(false, false);
8262+
gPipeline.mScreenTriangleVB->setBuffer();
8263+
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
8264+
8265+
dst.flush();
8266+
mRT->screen.bindTarget();
8267+
}
8268+
82358269
LLGLEnable blend(GL_BLEND);
82368270
gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_SOURCE_ALPHA, LLRender::BF_ZERO, LLRender::BF_SOURCE_ALPHA);
8237-
82388271
gGL.setColorMask(true, true);
82398272

82408273
// apply haze
82418274
LLGLSLShader& haze_shader = gHazeProgram;
82428275

82438276
LL_PROFILE_GPU_ZONE("haze");
8244-
bindDeferredShader(haze_shader);
8277+
bindDeferredShader(haze_shader, nullptr, sUnderWaterRender ? nullptr : &mWaterDis);
82458278

82468279
LLEnvironment& environment = LLEnvironment::instance();
82478280
haze_shader.uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);
@@ -8294,7 +8327,7 @@ void LLPipeline::doWaterHaze()
82948327
else
82958328
{
82968329
//render water patches like LLDrawPoolWater does
8297-
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_LEQUAL);
8330+
/*LLGLDepthTest depth(GL_FALSE);
82988331
LLGLDisable cull(GL_CULL_FACE);
82998332
83008333
gGLLastMatrix = NULL;
@@ -8303,7 +8336,7 @@ void LLPipeline::doWaterHaze()
83038336
if (mWaterPool)
83048337
{
83058338
mWaterPool->pushFaceGeometry();
8306-
}
8339+
}*/
83078340
}
83088341

83098342
unbindDeferredShader(haze_shader);

indra/newview/pipeline.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ class LLPipeline
306306
// if setup is true, wil lset texture compare mode function and filtering options
307307
void bindShadowMaps(LLGLSLShader& shader);
308308
void bindDeferredShaderFast(LLGLSLShader& shader);
309-
void bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_target = nullptr);
309+
void bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_target = nullptr, LLRenderTarget* depth_target = nullptr);
310310
void setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep);
311311

312312
void unbindDeferredShader(LLGLSLShader& shader);

0 commit comments

Comments
 (0)