diff options
| author | Graham Linden <graham@lindenlab.com> | 2013-07-21 14:28:54 -0700 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2013-07-21 14:28:54 -0700 | 
| commit | caefe0e74cf553de41c6c8748dd2ea5ef4d82c06 (patch) | |
| tree | 55cdae8ef9376823851babf5a654361cd6e4ff33 /indra | |
| parent | 94abe75dea90ee91dd044161d8587279b0bfae13 (diff) | |
NORSPEC-311 fix alpha / opaque lighting diffs
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/newview/app_settings/settings.xml | 11 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl | 56 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/fullbrightAlphaMaskF.glsl | 55 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl | 73 | ||||
| -rwxr-xr-x | indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl | 9 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl | 2 | ||||
| -rwxr-xr-x | indra/newview/lldrawpoolalpha.cpp | 14 | ||||
| -rwxr-xr-x | indra/newview/lldrawpoolsimple.cpp | 48 | ||||
| -rwxr-xr-x | indra/newview/llviewershadermgr.cpp | 88 | ||||
| -rwxr-xr-x | indra/newview/llviewershadermgr.h | 3 | ||||
| -rwxr-xr-x | indra/newview/pipeline.cpp | 8 | 
11 files changed, 336 insertions, 31 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2d3b32159a..6570189c5b 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8894,6 +8894,17 @@        <key>Value</key>        <real>1.0</real>      </map> +  <key>RenderDeferredDisplayGamma</key> +  <map> +    <key>Comment</key> +    <string>Gamma ramp exponent for final correction before display gamma.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>1.8</real> +  </map>      <key>RenderGLCoreProfile</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index b64852f17b..69b0f8f012 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -136,6 +136,52 @@ float pcfShadow(sampler2DShadow shadowMap, vec4 stc)  }  #endif +#if WATER_FOG +uniform vec4 waterPlane; +uniform vec4 waterFogColor; +uniform float waterFogDensity; +uniform float waterFogKS; + +vec4 applyWaterFogDeferred(vec3 pos, vec4 color) +{ +	//normalize view vector +	vec3 view = normalize(pos); +	float es = -(dot(view, waterPlane.xyz)); + +	//find intersection point with water plane and eye vector +	 +	//get eye depth +	float e0 = max(-waterPlane.w, 0.0); +	 +	vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0); +	 +	//get object depth +	float depth = length(pos - int_v); +		 +	//get "thickness" of water +	float l = max(depth, 0.1); + +	float kd = waterFogDensity; +	float ks = waterFogKS; +	vec4 kc = waterFogColor; +	 +	float F = 0.98; +	 +	float t1 = -kd * pow(F, ks * e0); +	float t2 = kd + ks * es; +	float t3 = pow(F, t2*l) - 1.0; +	 +	float L = min(t1/t2*t3, 1.0); +	 +	float D = pow(0.98, l*kd); +	 +	color.rgb = color.rgb * D + kc.rgb * L; +	color.a = kc.a + color.a; +	 +	return color; +} +#endif +  vec3 srgb_to_linear(vec3 cs)  { @@ -240,8 +286,9 @@ void main()  	vec4 gamma_diff = diff;  	diff.rgb = srgb_to_linear(diff.rgb); - +	  #ifdef USE_VERTEX_COLOR +	diff.rgb *= vertex_color.rgb;  	float vertex_color_alpha = vertex_color.a;	  #else  	float vertex_color_alpha = 1.0; @@ -266,6 +313,7 @@ void main()  	color.rgb = scaleSoftClip(color.rgb);  	color.rgb = srgb_to_linear(color.rgb); +	  	col = vec4(0,0,0,0);     #define LIGHT_LOOP(i) col.rgb += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, normal, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); @@ -281,7 +329,11 @@ void main()  	color.rgb += diff.rgb * vary_pointlight_col_linear * col.rgb;  	color.rgb = linear_to_srgb(color.rgb); -	//color.rgb = vec3(1,0,1); + +#if WATER_FOG +	color = applyWaterFogDeferred(pos.xyz, color); +#endif +  	frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightAlphaMaskF.glsl index a74256de81..00743abe34 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightAlphaMaskF.glsl @@ -61,6 +61,52 @@ vec3 linear_to_srgb(vec3 cl)  	return 1.055 * pow(cl, vec3(0.41666)) - 0.055;  } +#ifdef WATER_FOG +uniform vec4 waterPlane; +uniform vec4 waterFogColor; +uniform float waterFogDensity; +uniform float waterFogKS; + +vec4 applyWaterFogDeferred(vec3 pos, vec4 color) +{ +	//normalize view vector +	vec3 view = normalize(pos); +	float es = -(dot(view, waterPlane.xyz)); + +	//find intersection point with water plane and eye vector +	 +	//get eye depth +	float e0 = max(-waterPlane.w, 0.0); +	 +	vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0); +	 +	//get object depth +	float depth = length(pos - int_v); +		 +	//get "thickness" of water +	float l = max(depth, 0.1); + +	float kd = waterFogDensity; +	float ks = waterFogKS; +	vec4 kc = waterFogColor; +	 +	float F = 0.98; +	 +	float t1 = -kd * pow(F, ks * e0); +	float t2 = kd + ks * es; +	float t3 = pow(F, t2*l) - 1.0; +	 +	float L = min(t1/t2*t3, 1.0); +	 +	float D = pow(0.98, l*kd); +	 +	color.rgb = color.rgb * D + kc.rgb * L; +	color.a = kc.a + color.a; +	 +	return color; +} +#endif +  uniform float minimum_alpha;  void main()  @@ -72,7 +118,7 @@ void main()  #endif  	float final_alpha = color.a * vertex_color.a; -	if (final_alpha < minimum_alpha) +	if (color.a < minimum_alpha)  	{  		discard;  	} @@ -84,7 +130,12 @@ void main()  	color.rgb = fullbrightScaleSoftClip(color.rgb);  	color.rgb = linear_to_srgb(color.rgb); -	//color.rgb = vec3(1,0,1); + + +#ifdef WATER_FOG +	color = applyWaterFogDeferred(pos, vec4(color)); +#endif +  	frag_color.rgb = color.rgb;  	frag_color.a   = final_alpha;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 5876efedec..1e8df68a72 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -35,12 +35,63 @@ out vec4 frag_color;  uniform sampler2D diffuseMap;  #endif +VARYING vec3 vary_position;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0;  vec3 fullbrightAtmosTransport(vec3 light);  vec3 fullbrightScaleSoftClip(vec3 light); +#if HAS_ALPHA_MASK +uniform float minimum_alpha; +#endif + +#ifdef WATER_FOG +uniform vec4 waterPlane; +uniform vec4 waterFogColor; +uniform float waterFogDensity; +uniform float waterFogKS; + +vec4 applyWaterFogDeferred(vec3 pos, vec4 color) +{ +	//normalize view vector +	vec3 view = normalize(pos); +	float es = -(dot(view, waterPlane.xyz)); + +	//find intersection point with water plane and eye vector +	 +	//get eye depth +	float e0 = max(-waterPlane.w, 0.0); +	 +	vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0); +	 +	//get object depth +	float depth = length(pos - int_v); +		 +	//get "thickness" of water +	float l = max(depth, 0.1); + +	float kd = waterFogDensity; +	float ks = waterFogKS; +	vec4 kc = waterFogColor; +	 +	float F = 0.98; +	 +	float t1 = -kd * pow(F, ks * e0); +	float t2 = kd + ks * es; +	float t3 = pow(F, t2*l) - 1.0; +	 +	float L = min(t1/t2*t3, 1.0); +	 +	float D = pow(0.98, l*kd); +	 +	color.rgb = color.rgb * D + kc.rgb * L; +	color.a = kc.a + color.a; +	 +	return color; +} +#endif +  vec3 srgb_to_linear(vec3 cs)  { @@ -69,15 +120,31 @@ void main()  	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);  #endif +	float final_alpha = color.a * vertex_color.a; + +#if HAS_ALPHA_MASK +	if (color.a < minimum_alpha) +	{ +		discard; +	} +#endif -	color.rgb = srgb_to_linear(color.rgb);  	color.rgb *= vertex_color.rgb; +	color.rgb = srgb_to_linear(color.rgb); +	  	color.rgb = fullbrightAtmosTransport(color.rgb);  	color.rgb = fullbrightScaleSoftClip(color.rgb); - +	  	color.rgb = linear_to_srgb(color.rgb); -	//color.rgb = vec3(1,0,1); + +#ifdef WATER_FOG +	vec3 pos = vary_position; +	vec4 fogged = applyWaterFogDeferred(pos, vec4(color.rgb, final_alpha)); +	color.rgb = fogged.rgb; +	color.a   = fogged.a; +#endif +  	frag_color.rgb = 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 3f09a15375..22f47b7572 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl @@ -40,6 +40,9 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);  vec3 scaleDownLight(vec3 light);  vec3 scaleUpLight(vec3 light); +#if WATER_FOG +VARYING vec3 vary_position; +#endif  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; @@ -53,7 +56,11 @@ void main()  	passTextureIndex();  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0); -	 + +#if WATER_FOG +	vary_position = pos.xyz; +#endif +  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;  	calcAtmospherics(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl index a3610bfffa..59b027a045 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -51,7 +51,7 @@ vec3 linear_to_srgb(vec3 cl)  void main()   {  	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord); -	diff.rgb = linear_to_srgb(diff.rgb); +	diff.rgb = pow(diff.rgb,vec3(texture_gamma));  	frag_color = diff;  } diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index e53c783161..973e263572 100755 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -93,11 +93,21 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)  	if (pass == 0)  	{ -		simple_shader = &gDeferredAlphaProgram; -		fullbright_shader = &gObjectFullbrightProgram; +		if (LLPipeline::sUnderWaterRender) +		{ +			simple_shader = &gDeferredAlphaWaterProgram; +			fullbright_shader = &gDeferredFullbrightWaterProgram; +		} +		else +		{ +			simple_shader = &gDeferredAlphaProgram; +			fullbright_shader = &gDeferredFullbrightProgram; +		} +  		fullbright_shader->bind();  		fullbright_shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);   		fullbright_shader->unbind(); +  		//prime simple shader (loads shadow relevant uniforms)  		gPipeline.bindDeferredShader(*simple_shader);  	} diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 87fbeaf2c0..d51b84cfbc 100755 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -111,7 +111,14 @@ void LLDrawPoolGlow::render(S32 pass)  	LLGLSLShader* shader = LLPipeline::sUnderWaterRender ? &gObjectEmissiveWaterProgram : &gObjectEmissiveProgram;  	shader->bind(); -	shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.f); +	if (LLPipeline::sRenderDeferred) +	{ +		shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); +	} +	else +	{ +		shader->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.f); +	}	  	LLGLDepthTest depth(GL_TRUE, GL_FALSE);  	gGL.setColorMask(false, true); @@ -536,7 +543,15 @@ void LLDrawPoolFullbright::prerender()  void LLDrawPoolFullbright::beginPostDeferredPass(S32 pass)  { -	gDeferredFullbrightProgram.bind(); +	if (LLPipeline::sUnderWaterRender) +	{ +		gDeferredFullbrightWaterProgram.bind(); +	} +	else +	{ +		gDeferredFullbrightProgram.bind(); +	} +	  }  void LLDrawPoolFullbright::renderPostDeferred(S32 pass) @@ -550,7 +565,14 @@ void LLDrawPoolFullbright::renderPostDeferred(S32 pass)  void LLDrawPoolFullbright::endPostDeferredPass(S32 pass)  { -	gDeferredFullbrightProgram.unbind(); +	if (LLPipeline::sUnderWaterRender) +	{ +		gDeferredFullbrightWaterProgram.unbind(); +	} +	else +	{ +		gDeferredFullbrightProgram.unbind(); +	}  	LLRenderPass::endRenderPass(pass);  } @@ -633,15 +655,17 @@ void LLDrawPoolFullbrightAlphaMask::beginPostDeferredPass(S32 pass)  	}   	else   	{ -#if LL_DARWIN -		// the OS X 10.6.8 GeForce driver is a real POS -		// this is a work-around for NORSPEC-314 -		gObjectFullbrightAlphaMaskProgram.bind(); -		gObjectFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); -#else -		gDeferredFullbrightAlphaMaskProgram.bind(); -		gDeferredFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); -#endif +		if (LLPipeline::sUnderWaterRender) +		{ +			gDeferredFullbrightAlphaMaskWaterProgram.bind(); +			gDeferredFullbrightAlphaMaskWaterProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); +		} +		else +		{ +			gDeferredFullbrightAlphaMaskProgram.bind(); +			gDeferredFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); +		} +		  	}  } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index e9c3990e9a..f0e4825279 100755 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -197,9 +197,12 @@ LLGLSLShader			gDeferredShadowAlphaMaskProgram;  LLGLSLShader			gDeferredAvatarShadowProgram;  LLGLSLShader			gDeferredAttachmentShadowProgram;  LLGLSLShader			gDeferredAlphaProgram; +LLGLSLShader			gDeferredAlphaWaterProgram;  LLGLSLShader			gDeferredAvatarEyesProgram;  LLGLSLShader			gDeferredFullbrightProgram;  LLGLSLShader			gDeferredFullbrightAlphaMaskProgram; +LLGLSLShader			gDeferredFullbrightWaterProgram; +LLGLSLShader			gDeferredFullbrightAlphaMaskWaterProgram;  LLGLSLShader			gDeferredEmissiveProgram;  LLGLSLShader			gDeferredPostProgram;  LLGLSLShader			gDeferredCoFProgram; @@ -301,9 +304,12 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gDeferredMaterialWaterProgram[9+LLMaterial::SHADER_COUNT]);  	mShaderList.push_back(&gDeferredMaterialWaterProgram[13+LLMaterial::SHADER_COUNT]);	  	mShaderList.push_back(&gDeferredAlphaProgram); +	mShaderList.push_back(&gDeferredAlphaWaterProgram);  	mShaderList.push_back(&gDeferredSkinnedAlphaProgram);  	mShaderList.push_back(&gDeferredFullbrightProgram); -	mShaderList.push_back(&gDeferredFullbrightAlphaMaskProgram);	 +	mShaderList.push_back(&gDeferredFullbrightAlphaMaskProgram); +	mShaderList.push_back(&gDeferredFullbrightWaterProgram); +	mShaderList.push_back(&gDeferredFullbrightAlphaMaskWaterProgram);	  	mShaderList.push_back(&gDeferredFullbrightShinyProgram);  	mShaderList.push_back(&gDeferredSkinnedFullbrightShinyProgram);  	mShaderList.push_back(&gDeferredSkinnedFullbrightProgram); @@ -1145,8 +1151,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAvatarProgram.unload();  		gDeferredAvatarAlphaProgram.unload();  		gDeferredAlphaProgram.unload(); +		gDeferredAlphaWaterProgram.unload();  		gDeferredFullbrightProgram.unload();  		gDeferredFullbrightAlphaMaskProgram.unload(); +		gDeferredFullbrightWaterProgram.unload(); +		gDeferredFullbrightAlphaMaskWaterProgram.unload();  		gDeferredEmissiveProgram.unload();  		gDeferredAvatarEyesProgram.unload();  		gDeferredPostProgram.unload();		 @@ -1518,7 +1527,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredAlphaProgram.addPermutation("USE_INDEXED_TEX", "1"); -		gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1"); +		//gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1"); +		gDeferredAlphaProgram.addPermutation("WATER_FOG", "0");  		gDeferredAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0");  		gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; @@ -1531,6 +1541,42 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ +		gDeferredAlphaWaterProgram.mName = "Deferred Alpha Underwater Shader"; +		gDeferredAlphaWaterProgram.mFeatures.atmosphericHelpers = true; +		gDeferredAlphaWaterProgram.mFeatures.calculatesLighting = false; +		gDeferredAlphaWaterProgram.mFeatures.calculatesAtmospherics = true; +		gDeferredAlphaWaterProgram.mFeatures.hasGamma = true; +		gDeferredAlphaWaterProgram.mFeatures.hasAtmospherics = true; +		gDeferredAlphaWaterProgram.mFeatures.hasLighting = false; +		gDeferredAlphaWaterProgram.mFeatures.isAlphaLighting = true; +		gDeferredAlphaWaterProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels +		if (mVertexShaderLevel[SHADER_DEFERRED] < 1) +		{ +			gDeferredAlphaWaterProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels; +		} +		else +		{ //shave off some texture units for shadow maps +			gDeferredAlphaWaterProgram.mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels - 6, 1); +		} +		gDeferredAlphaWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; +		gDeferredAlphaWaterProgram.mShaderFiles.clear(); +		gDeferredAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredAlphaWaterProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredAlphaWaterProgram.addPermutation("USE_INDEXED_TEX", "1"); +		//gDeferredAlphaWaterProgram.addPermutation("USE_VERTEX_COLOR", "1"); +		gDeferredAlphaWaterProgram.addPermutation("WATER_FOG", "1"); +		gDeferredAlphaWaterProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0"); +		gDeferredAlphaWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + +		success = gDeferredAlphaWaterProgram.createShader(NULL, NULL); + +		// Hack +		gDeferredAlphaWaterProgram.mFeatures.calculatesLighting = true; +		gDeferredAlphaWaterProgram.mFeatures.hasLighting = true; +	} + +	if (success) +	{  		gDeferredAvatarEyesProgram.mName = "Deferred Avatar Eyes Shader";  		gDeferredAvatarEyesProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredAvatarEyesProgram.mFeatures.hasGamma = true; @@ -1559,20 +1605,54 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ -		gDeferredFullbrightAlphaMaskProgram.mName = "Deferred Fullbright Alpha Mask Shader"; +		gDeferredFullbrightAlphaMaskProgram.mName = "Deferred Fullbright Alpha Masking Shader";  		gDeferredFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredFullbrightAlphaMaskProgram.mFeatures.hasGamma = true;  		gDeferredFullbrightAlphaMaskProgram.mFeatures.hasTransport = true;  		gDeferredFullbrightAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;  		gDeferredFullbrightAlphaMaskProgram.mShaderFiles.clear();  		gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); -		gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredFullbrightAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		gDeferredFullbrightAlphaMaskProgram.addPermutation("HAS_ALPHA_MASK","1");  		success = gDeferredFullbrightAlphaMaskProgram.createShader(NULL, NULL);  	}  	if (success)  	{ +		gDeferredFullbrightWaterProgram.mName = "Deferred Fullbright Underwater Shader"; +		gDeferredFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true; +		gDeferredFullbrightWaterProgram.mFeatures.hasGamma = true; +		gDeferredFullbrightWaterProgram.mFeatures.hasTransport = true; +		gDeferredFullbrightWaterProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels; +		gDeferredFullbrightWaterProgram.mShaderFiles.clear(); +		gDeferredFullbrightWaterProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredFullbrightWaterProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredFullbrightWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		gDeferredFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; +		gDeferredFullbrightWaterProgram.addPermutation("WATER_FOG","1"); +		success = gDeferredFullbrightWaterProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gDeferredFullbrightAlphaMaskWaterProgram.mName = "Deferred Fullbright Underwater Alpha Masking Shader"; +		gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.calculatesAtmospherics = true; +		gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.hasGamma = true; +		gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.hasTransport = true; +		gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels; +		gDeferredFullbrightAlphaMaskWaterProgram.mShaderFiles.clear(); +		gDeferredFullbrightAlphaMaskWaterProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredFullbrightAlphaMaskWaterProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredFullbrightAlphaMaskWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		gDeferredFullbrightAlphaMaskWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; +		gDeferredFullbrightAlphaMaskWaterProgram.addPermutation("HAS_ALPHA_MASK","1"); +		gDeferredFullbrightAlphaMaskWaterProgram.addPermutation("WATER_FOG","1"); +		success = gDeferredFullbrightAlphaMaskWaterProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gDeferredFullbrightShinyProgram.mName = "Deferred FullbrightShiny Shader";  		gDeferredFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredFullbrightShinyProgram.mFeatures.hasGamma = true; diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index f14180d957..5fa9b82170 100755 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -366,6 +366,9 @@ extern LLGLSLShader			gDeferredAttachmentShadowProgram;  extern LLGLSLShader			gDeferredAlphaProgram;  extern LLGLSLShader			gDeferredFullbrightProgram;  extern LLGLSLShader			gDeferredFullbrightAlphaMaskProgram; +extern LLGLSLShader			gDeferredAlphaWaterProgram; +extern LLGLSLShader			gDeferredFullbrightWaterProgram; +extern LLGLSLShader			gDeferredFullbrightAlphaMaskWaterProgram;  extern LLGLSLShader			gDeferredEmissiveProgram;  extern LLGLSLShader			gDeferredAvatarEyesProgram;  extern LLGLSLShader			gDeferredAvatarAlphaProgram; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index d89ad615ae..c593c85ce7 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8831,9 +8831,9 @@ void LLPipeline::renderDeferredLighting()  		gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); -		F32 gamma = 1.0/2.2; +		F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); -		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, gamma); +		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));  		gGL.begin(LLRender::TRIANGLE_STRIP);  		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); @@ -9380,9 +9380,9 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target)  		gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, target->getWidth(), target->getHeight()); -		F32 gamma = 1.0/2.2; +		F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); -		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, gamma); +		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));  		gGL.begin(LLRender::TRIANGLE_STRIP);  		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); | 
