diff options
| author | Graham Linden <graham@lindenlab.com> | 2013-09-18 18:24:16 -0700 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2013-09-18 18:24:16 -0700 | 
| commit | 95e34d86b9d86b3b3c7d3c39620e35b06f8fa9cf (patch) | |
| tree | 5a2652bef97f1bb2d76c0b86482cebe2b2505a79 /indra/newview/app_settings/shaders/class2/deferred | |
| parent | 93503a05ec905ef2a8df39802fdc3475c961f3bc (diff) | |
| parent | ad777b46d0fe5d790e43efb1771e9f64f3ad3dfb (diff) | |
The unbearable lightness of being norspec
Diffstat (limited to 'indra/newview/app_settings/shaders/class2/deferred')
3 files changed, 171 insertions, 11 deletions
| diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 62ca3f1ff1..c20e00163c 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -69,6 +69,43 @@ uniform vec2 screen_res;  uniform mat4 inv_proj; +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +} +  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -88,10 +125,9 @@ vec3 decode_normal (vec2 enc)  vec4 correctWithGamma(vec4 col)  { -	return vec4(pow(col.rgb, vec3(2.2)), col.a); +	return vec4(srgb_to_linear(col.rgb), col.a);  } -  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); @@ -298,14 +334,12 @@ void main()  			vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;  			vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); +			stc /= stc.w;  			if (stc.z > 0.0)  			{ -				stc.xy /= stc.w; +				float fatten = clamp(envIntensity*envIntensity+envIntensity*0.25, 0.25, 1.0); -				float fatten = clamp(envIntensity*envIntensity+envIntensity*0.5, 0.25, 1.0); -				 -				//stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);  				stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);  				if (stc.x < 1.0 && @@ -313,7 +347,7 @@ void main()  					stc.x > 0.0 &&  					stc.y > 0.0)  				{ -					col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*proj_lod).rgb*shadow*spec.rgb;										 +					col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod).rgb*shadow*spec.rgb;										  				}  			}  		} diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 6e05091b57..1022c23f7b 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -78,6 +78,43 @@ vec3 vary_AtmosAttenuation;  uniform mat4 inv_proj;  uniform vec2 screen_res; +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +} +  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -246,6 +283,52 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {  	setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));  } +#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 atmosLighting(vec3 light)  {  	light *= getAtmosAttenuation().r; @@ -326,7 +409,7 @@ void main()  	vec4 diffuse = texture2DRect(diffuseRect, tc);  	//convert to gamma space -	diffuse.rgb = pow(diffuse.rgb, vec3(1.0/2.2)); +	diffuse.rgb = linear_to_srgb(diffuse.rgb);  	vec3 col;  	float bloom = 0.0; @@ -392,7 +475,13 @@ void main()  			col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a);  		} -		col = pow(col, vec3(2.2)); +		#ifdef WATER_FOG +			vec4 fogged = applyWaterFogDeferred(pos,vec4(col, bloom)); +			col = fogged.rgb; +			bloom = fogged.a; +		#endif + +		col = srgb_to_linear(col);  		//col = vec3(1,0,1);  		//col.g = envIntensity; diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 4bad439952..7689b72d20 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -86,9 +86,46 @@ vec3 decode_normal (vec2 enc)      return n;  } +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +} +  vec4 correctWithGamma(vec4 col)  { -	return vec4(pow(col.rgb, vec3(2.2)), col.a); +	return vec4(srgb_to_linear(col.rgb), col.a);  }  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) @@ -316,7 +353,7 @@ void main()  			}  		}  	} - +	  	//not sure why, but this line prevents MATBUG-194  	col = max(col, vec3(0.0)); | 
