diff options
| author | Dave Parks <davep@lindenlab.com> | 2022-12-05 11:48:50 -0600 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2022-12-05 11:48:50 -0600 | 
| commit | 3c20f0b1d4dd7257dc608823d82b6f798c492b43 (patch) | |
| tree | 097a0449791247c160c07fdea2c0a0a438e837f5 | |
| parent | 598e33e2e880388a457a496bea5b5d25bdf2aa28 (diff) | |
SL-18692 Fix for fullbright alpha not clipping against water plane (also fixes ultraspace particles).
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl | 37 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl | 4 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolalpha.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 57 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.h | 2 | 
5 files changed, 83 insertions, 19 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 33b97aefcb..73e5b401c0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -54,35 +54,44 @@ vec3 fullbrightScaleSoftClip(vec3 light);  uniform float minimum_alpha;  #endif +#ifdef IS_ALPHA +void waterClip(vec3 pos); +#endif +  void main()   { + +#ifdef IS_ALPHA +    waterClip(vary_position.xyz); +#endif +  #ifdef HAS_DIFFUSE_LOOKUP -	vec4 color = diffuseLookup(vary_texcoord0.xy); +    vec4 color = diffuseLookup(vary_texcoord0.xy);  #else -	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy); +    vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);  #endif -	float final_alpha = color.a * vertex_color.a; +    float final_alpha = color.a * vertex_color.a;  #ifdef HAS_ALPHA_MASK -	if (color.a < minimum_alpha) -	{ -		discard; -	} +    if (color.a < minimum_alpha) +    { +        discard; +    }  #endif -	color.rgb *= vertex_color.rgb; +    color.rgb *= vertex_color.rgb;  #ifdef WATER_FOG -	vec3 pos = vary_position; -	vec4 fogged = applyWaterFogView(pos, vec4(color.rgb, final_alpha)); -	color.rgb = fogged.rgb; -	color.a   = fogged.a; +    vec3 pos = vary_position; +    vec4 fogged = applyWaterFogView(pos, vec4(color.rgb, final_alpha)); +    color.rgb = fogged.rgb; +    color.a   = fogged.a;  #else      color.a   = final_alpha;  #endif -	frag_color.rgb = srgb_to_linear(color.rgb); -	frag_color.a   = color.a; +    frag_color.rgb = srgb_to_linear(color.rgb); +    frag_color.a   = color.a;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl index e71636f2c9..e565722164 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl @@ -38,9 +38,7 @@ void calcAtmospherics(vec3 inPositionEye);  vec3 atmosAmbient();  vec3 atmosAffectDirectionalLight(float lightIntensity); -#ifdef WATER_FOG  VARYING vec3 vary_position; -#endif  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; @@ -66,9 +64,7 @@ void main()  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  #endif -#ifdef WATER_FOG  	vary_position = pos.xyz; -#endif  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 759aa078ff..c09de14b23 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -173,7 +173,7 @@ void LLDrawPoolAlpha::renderPostDeferred(S32 pass)      prepare_alpha_shader(emissive_shader, true, false, water_sign);      fullbright_shader   = (LLPipeline::sImpostorRender) ? &gDeferredFullbrightAlphaMaskProgram : -        (LLPipeline::sUnderWaterRender) ? &gDeferredFullbrightWaterProgram : &gDeferredFullbrightAlphaMaskProgram; +        (LLPipeline::sUnderWaterRender) ? &gDeferredFullbrightWaterAlphaProgram : &gDeferredFullbrightAlphaMaskAlphaProgram;      prepare_alpha_shader(fullbright_shader, true, true, water_sign);      simple_shader   = (LLPipeline::sImpostorRender) ? &gDeferredAlphaImpostorProgram : diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index ff9f767940..a742264801 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -234,8 +234,11 @@ LLGLSLShader            gDeferredSkinnedAlphaWaterProgram;  LLGLSLShader			gDeferredAvatarEyesProgram;  LLGLSLShader			gDeferredFullbrightProgram;  LLGLSLShader			gDeferredFullbrightAlphaMaskProgram; +LLGLSLShader			gDeferredFullbrightAlphaMaskAlphaProgram;  LLGLSLShader			gDeferredFullbrightWaterProgram;  LLGLSLShader            gDeferredSkinnedFullbrightWaterProgram; +LLGLSLShader			gDeferredFullbrightWaterAlphaProgram; +LLGLSLShader			gDeferredSkinnedFullbrightWaterAlphaProgram;  LLGLSLShader			gDeferredFullbrightAlphaMaskWaterProgram;  LLGLSLShader            gDeferredSkinnedFullbrightAlphaMaskWaterProgram;  LLGLSLShader			gDeferredEmissiveProgram; @@ -255,6 +258,7 @@ LLGLSLShader			gDeferredFullbrightShinyProgram;  LLGLSLShader            gDeferredSkinnedFullbrightShinyProgram;  LLGLSLShader			gDeferredSkinnedFullbrightProgram;  LLGLSLShader            gDeferredSkinnedFullbrightAlphaMaskProgram; +LLGLSLShader            gDeferredSkinnedFullbrightAlphaMaskAlphaProgram;  LLGLSLShader			gNormalMapGenProgram;  LLGLSLShader            gDeferredGenBrdfLutProgram; @@ -355,14 +359,18 @@ LLViewerShaderMgr::LLViewerShaderMgr() :      mShaderList.push_back(&gDeferredSkinnedAlphaWaterProgram);  	mShaderList.push_back(&gDeferredFullbrightProgram);  	mShaderList.push_back(&gDeferredFullbrightAlphaMaskProgram); +    mShaderList.push_back(&gDeferredFullbrightAlphaMaskAlphaProgram);  	mShaderList.push_back(&gDeferredFullbrightWaterProgram);      mShaderList.push_back(&gDeferredSkinnedFullbrightWaterProgram); +    mShaderList.push_back(&gDeferredFullbrightWaterAlphaProgram); +    mShaderList.push_back(&gDeferredSkinnedFullbrightWaterAlphaProgram);  	mShaderList.push_back(&gDeferredFullbrightAlphaMaskWaterProgram);      mShaderList.push_back(&gDeferredSkinnedFullbrightAlphaMaskWaterProgram);  	mShaderList.push_back(&gDeferredFullbrightShinyProgram);      mShaderList.push_back(&gDeferredSkinnedFullbrightShinyProgram);  	mShaderList.push_back(&gDeferredSkinnedFullbrightProgram);      mShaderList.push_back(&gDeferredSkinnedFullbrightAlphaMaskProgram); +    mShaderList.push_back(&gDeferredSkinnedFullbrightAlphaMaskAlphaProgram);  	mShaderList.push_back(&gDeferredEmissiveProgram);      mShaderList.push_back(&gDeferredSkinnedEmissiveProgram);  	mShaderList.push_back(&gDeferredAvatarEyesProgram); @@ -1273,8 +1281,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          gDeferredSkinnedAlphaWaterProgram.unload();  		gDeferredFullbrightProgram.unload();  		gDeferredFullbrightAlphaMaskProgram.unload(); +        gDeferredFullbrightAlphaMaskAlphaProgram.unload();  		gDeferredFullbrightWaterProgram.unload();          gDeferredSkinnedFullbrightWaterProgram.unload(); +        gDeferredFullbrightWaterAlphaProgram.unload(); +        gDeferredSkinnedFullbrightWaterAlphaProgram.unload();  		gDeferredFullbrightAlphaMaskWaterProgram.unload();          gDeferredSkinnedFullbrightAlphaMaskWaterProgram.unload();  		gDeferredEmissiveProgram.unload(); @@ -1296,6 +1307,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          gDeferredSkinnedFullbrightShinyProgram.unload();  		gDeferredSkinnedFullbrightProgram.unload();          gDeferredSkinnedFullbrightAlphaMaskProgram.unload(); +        gDeferredSkinnedFullbrightAlphaMaskAlphaProgram.unload();          gDeferredHighlightProgram.unload();          gDeferredHighlightNormalProgram.unload(); @@ -2213,6 +2225,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredFullbrightAlphaMaskProgram.mShaderFiles.clear();  		gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER));  		gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER)); +        gDeferredFullbrightAlphaMaskProgram.clearPermutations();  		gDeferredFullbrightAlphaMaskProgram.addPermutation("HAS_ALPHA_MASK","1");  		gDeferredFullbrightAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];          success = make_rigged_variant(gDeferredFullbrightAlphaMaskProgram, gDeferredSkinnedFullbrightAlphaMaskProgram); @@ -2220,6 +2233,27 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		llassert(success);  	} +    if (success) +    { +        gDeferredFullbrightAlphaMaskAlphaProgram.mName = "Deferred Fullbright Alpha Masking Alpha Shader"; +        gDeferredFullbrightAlphaMaskAlphaProgram.mFeatures.calculatesAtmospherics = true; +        gDeferredFullbrightAlphaMaskAlphaProgram.mFeatures.hasGamma = true; +        gDeferredFullbrightAlphaMaskAlphaProgram.mFeatures.hasTransport = true; +        gDeferredFullbrightAlphaMaskAlphaProgram.mFeatures.hasSrgb = true; +        gDeferredFullbrightAlphaMaskAlphaProgram.mFeatures.isDeferred = true; +        gDeferredFullbrightAlphaMaskAlphaProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels; +        gDeferredFullbrightAlphaMaskAlphaProgram.mShaderFiles.clear(); +        gDeferredFullbrightAlphaMaskAlphaProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER)); +        gDeferredFullbrightAlphaMaskAlphaProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER)); +        gDeferredFullbrightAlphaMaskAlphaProgram.clearPermutations(); +        gDeferredFullbrightAlphaMaskAlphaProgram.addPermutation("HAS_ALPHA_MASK", "1"); +        gDeferredFullbrightAlphaMaskAlphaProgram.addPermutation("IS_ALPHA", "1"); +        gDeferredFullbrightAlphaMaskAlphaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; +        success = make_rigged_variant(gDeferredFullbrightAlphaMaskAlphaProgram, gDeferredSkinnedFullbrightAlphaMaskAlphaProgram); +        success = success && gDeferredFullbrightAlphaMaskAlphaProgram.createShader(NULL, NULL); +        llassert(success); +    } +  	if (success)  	{  		gDeferredFullbrightWaterProgram.mName = "Deferred Fullbright Underwater Shader"; @@ -2240,6 +2274,29 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		llassert(success);  	} +    if (success) +    { +        gDeferredFullbrightWaterAlphaProgram.mName = "Deferred Fullbright Underwater Alpha Shader"; +        gDeferredFullbrightWaterAlphaProgram.mFeatures.calculatesAtmospherics = true; +        gDeferredFullbrightWaterAlphaProgram.mFeatures.hasGamma = true; +        gDeferredFullbrightWaterAlphaProgram.mFeatures.hasTransport = true; +        gDeferredFullbrightWaterAlphaProgram.mFeatures.hasWaterFog = true; +        gDeferredFullbrightWaterAlphaProgram.mFeatures.hasSrgb = true; +        gDeferredFullbrightWaterAlphaProgram.mFeatures.isDeferred = true; +        gDeferredFullbrightWaterAlphaProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels; +        gDeferredFullbrightWaterAlphaProgram.mShaderFiles.clear(); +        gDeferredFullbrightWaterAlphaProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER)); +        gDeferredFullbrightWaterAlphaProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER)); +        gDeferredFullbrightWaterAlphaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; +        gDeferredFullbrightWaterAlphaProgram.mShaderGroup = LLGLSLShader::SG_WATER; +        gDeferredFullbrightWaterAlphaProgram.clearPermutations(); +        gDeferredFullbrightWaterAlphaProgram.addPermutation("WATER_FOG", "1"); +        gDeferredFullbrightWaterAlphaProgram.addPermutation("IS_ALPHA", "1"); +        success = make_rigged_variant(gDeferredFullbrightWaterAlphaProgram, gDeferredSkinnedFullbrightWaterAlphaProgram); +        success = success && gDeferredFullbrightWaterAlphaProgram.createShader(NULL, NULL); +        llassert(success); +    } +  	if (success)  	{  		gDeferredFullbrightAlphaMaskWaterProgram.mName = "Deferred Fullbright Underwater Alpha Masking Shader"; diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index e32051f830..a53706e96a 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -294,8 +294,10 @@ extern LLGLSLShader			gDeferredAlphaProgram;  extern LLGLSLShader			gDeferredAlphaImpostorProgram;  extern LLGLSLShader			gDeferredFullbrightProgram;  extern LLGLSLShader			gDeferredFullbrightAlphaMaskProgram; +extern LLGLSLShader			gDeferredFullbrightAlphaMaskAlphaProgram;  extern LLGLSLShader			gDeferredAlphaWaterProgram;  extern LLGLSLShader			gDeferredFullbrightWaterProgram; +extern LLGLSLShader			gDeferredFullbrightWaterAlphaProgram;  extern LLGLSLShader			gDeferredFullbrightAlphaMaskWaterProgram;  extern LLGLSLShader			gDeferredEmissiveProgram;  extern LLGLSLShader			gDeferredAvatarEyesProgram; | 
