diff options
Diffstat (limited to 'indra/newview/app_settings/shaders')
30 files changed, 1414 insertions, 685 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 0899caa2af..cd7a76db28 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -35,6 +35,26 @@ out vec4 frag_color;  #define frag_color gl_FragColor  #endif +uniform float display_gamma; +uniform vec4 gamma; +uniform vec4 lightnorm; +uniform vec4 sunlight_color; +uniform vec4 ambient; +uniform vec4 blue_horizon; +uniform vec4 blue_density; +uniform float haze_horizon; +uniform float haze_density; +uniform float cloud_shadow; +uniform float density_multiplier; +uniform float distance_multiplier; +uniform float max_y; +uniform vec4 glow; +uniform float scene_light_strength; +uniform mat3 env_mat; +uniform mat3 ssao_effect_mat; + +uniform vec3 sun_dir; +  #if HAS_SHADOW  uniform sampler2DShadow shadowMap0;  uniform sampler2DShadow shadowMap1; @@ -53,14 +73,8 @@ uniform float shadow_bias;  uniform sampler2D diffuseMap;  #endif -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional;  VARYING vec3 vary_fragcoord;  VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col;  VARYING vec2 vary_texcoord0;  VARYING vec3 vary_norm; @@ -68,12 +82,73 @@ VARYING vec3 vary_norm;  VARYING vec4 vertex_color;  #endif +vec3 vary_PositionEye; +vec3 vary_SunlitColor; +vec3 vary_AmblitColor; +vec3 vary_AdditiveColor; +vec3 vary_AtmosAttenuation; + +uniform mat4 inv_proj; +uniform vec2 screen_res; +  uniform vec4 light_position[8];  uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; -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); +	return n.xy / f + 0.5; +} + +vec3 decode_normal (vec2 enc) +{ +    vec2 fenc = enc*4-2; +    float f = dot(fenc,fenc); +    float g = sqrt(1-f/4); +    vec3 n; +    n.xy = fenc*g; +    n.z = 1-f/2; +    return n; +}  vec3 calcDirectionalLight(vec3 n, vec3 l)  { @@ -82,7 +157,7 @@ vec3 calcDirectionalLight(vec3 n, vec3 l)  	return vec3(a,a,a);  } -vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)  {  	//get light vector  	vec3 lv = lp.xyz-v; @@ -90,7 +165,9 @@ vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float  	//get distance  	float d = length(lv); -	float da = 0.0; +	float da = 1.0; + +	vec3 col = vec3(0);  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{ @@ -99,20 +176,25 @@ vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float  		//distance attenuation  		float dist = d/la; -		da = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); -		da *= da; -		da *= 1.4; -	 +		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +		dist_atten *= dist_atten; +		dist_atten *= 2.0;  		// spotlight coefficient.  		float spot = max(dot(-ln, lv), is_pointlight);  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= max(dot(n, lv), 0.0);		 +		da *= max(dot(n, lv), 0.0); + +		float lit = max(da * dist_atten,0.0); + +		col = light_col * lit * diffuse; + +		// no spec for alpha shader...  	} -	return vec3(da,da,da);	 +	return max(col, vec3(0.0,0.0,0.0));  }  #if HAS_SHADOW @@ -135,6 +217,237 @@ float pcfShadow(sampler2DShadow shadowMap, vec4 stc)  }  #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 getSunlitColor() +{ +	return vary_SunlitColor; +} +vec3 getAmblitColor() +{ +	return vary_AmblitColor; +} +vec3 getAdditiveColor() +{ +	return vary_AdditiveColor; +} +vec3 getAtmosAttenuation() +{ +	return vary_AtmosAttenuation; +} + +void setPositionEye(vec3 v) +{ +	vary_PositionEye = v; +} + +void setSunlitColor(vec3 v) +{ +	vary_SunlitColor = v; +} + +void setAmblitColor(vec3 v) +{ +	vary_AmblitColor = v; +} + +void setAdditiveColor(vec3 v) +{ +	vary_AdditiveColor = v; +} + +void setAtmosAttenuation(vec3 v) +{ +	vary_AtmosAttenuation = v; +} + +void calcAtmospherics(vec3 inPositionEye, float ambFactor) { + +	vec3 P = inPositionEye; +	setPositionEye(P); +	 +	vec3 tmpLightnorm = lightnorm.xyz; + +	vec3 Pn = normalize(P); +	float Plen = length(P); + +	vec4 temp1 = vec4(0); +	vec3 temp2 = vec3(0); +	vec4 blue_weight; +	vec4 haze_weight; +	vec4 sunlight = sunlight_color; +	vec4 light_atten; + +	//sunlight attenuation effect (hue and brightness) due to atmosphere +	//this is used later for sunlight modulation at various altitudes +	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); +		//I had thought blue_density and haze_density should have equal weighting, +		//but attenuation due to haze_density tends to seem too strong + +	temp1 = blue_density + vec4(haze_density); +	blue_weight = blue_density / temp1; +	haze_weight = vec4(haze_density) / temp1; + +	//(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) +	temp2.y = max(0.0, tmpLightnorm.y); +	temp2.y = 1. / temp2.y; +	sunlight *= exp( - light_atten * temp2.y); + +	// main atmospheric scattering line integral +	temp2.z = Plen * density_multiplier; + +	// Transparency (-> temp1) +	// ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier in a variable because the ati +	// compiler gets confused. +	temp1 = exp(-temp1 * temp2.z * distance_multiplier); + +	//final atmosphere attenuation factor +	setAtmosAttenuation(temp1.rgb); +	 +	//compute haze glow +	//(can use temp2.x as temp because we haven't used it yet) +	temp2.x = dot(Pn, tmpLightnorm.xyz); +	temp2.x = 1. - temp2.x; +		//temp2.x is 0 at the sun and increases away from sun +	temp2.x = max(temp2.x, .03);	//was glow.y +		//set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) +	temp2.x *= glow.x; +		//higher glow.x gives dimmer glow (because next step is 1 / "angle") +	temp2.x = pow(temp2.x, glow.z); +		//glow.z should be negative, so we're doing a sort of (1 / "angle") function + +	//add "minimum anti-solar illumination" +	temp2.x += .25; +	 +	//increase ambient when there are more clouds +	vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow * 0.5; +	 +	/*  decrease value and saturation (that in HSV, not HSL) for occluded areas +	 * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html +	 * // The following line of code performs the equivalent of: +	 * float ambAlpha = tmpAmbient.a; +	 * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis +	 * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue); +	 * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha); +	 */ +	tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a); + +	//haze color +	setAdditiveColor( +		vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient) +	  + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x +		  + tmpAmbient))); + +	//brightness of surface both sunlight and ambient +	setSunlitColor(vec3(sunlight * .5)); +	setAmblitColor(vec3(tmpAmbient * .25)); +	setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1)); +} + +vec3 atmosLighting(vec3 light) +{ +	light *= getAtmosAttenuation().r; +	light += getAdditiveColor(); +	return (2.0 * light); +} + +vec3 atmosTransport(vec3 light) { +	light *= getAtmosAttenuation().r; +	light += getAdditiveColor() * 2.0; +	return light; +} +vec3 atmosGetDiffuseSunlightColor() +{ +	return getSunlitColor(); +} + +vec3 scaleDownLight(vec3 light) +{ +	return (light / vec3(scene_light_strength, scene_light_strength, scene_light_strength)); +} + +vec3 scaleUpLight(vec3 light) +{ +	return (light * vec3(scene_light_strength, scene_light_strength, scene_light_strength)); +} + +vec3 atmosAmbient(vec3 light) +{ +	return getAmblitColor() + (light * vec3(0.5f, 0.5f, 0.5f)); +} + +vec3 atmosAffectDirectionalLight(float lightIntensity) +{ +	return getSunlitColor() * vec3(lightIntensity, lightIntensity, lightIntensity); +} + +vec3 scaleSoftClip(vec3 light) +{ +	//soft clip effect: +    vec3 zeroes = vec3(0.0f, 0.0f, 0.0f); +    vec3 ones   = vec3(1.0f, 1.0f, 1.0f); + +	light = ones - clamp(light, zeroes, ones); +	light = ones - pow(light, gamma.xxx); + +	return light; +} + +vec3 fullbrightAtmosTransport(vec3 light) { +	float brightness = dot(light.rgb, vec3(0.33333)); + +	return mix(atmosTransport(light.rgb), light.rgb + getAdditiveColor().rgb, brightness * brightness); +} + +vec3 fullbrightScaleSoftClip(vec3 light) +{ +	//soft clip effect: +	return light; +}  void main()   { @@ -143,13 +456,15 @@ void main()  	vec4 pos = vec4(vary_position, 1.0); +	float shadow = 1.0; -#if HAS_SHADOW -	float shadow = 0.0; +#if HAS_SHADOW	  	vec4 spos = pos;  	if (spos.z > -shadow_clip.w)  	{	 +		shadow = 0.0; +  		vec4 lpos;  		vec4 near_split = shadow_clip*-0.75; @@ -215,40 +530,77 @@ void main()  #else  	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);  #endif -	vec4 gamma_diff = diff; -	diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f)); +#ifdef FOR_IMPOSTOR +	vec4 color; +	color.rgb = diff.rgb;  #ifdef USE_VERTEX_COLOR -	float vertex_color_alpha = vertex_color.a;	 +	float final_alpha = diff.a * vertex_color.a; +	diff.rgb *= vertex_color.rgb;  #else -	float vertex_color_alpha = 1.0; +	float final_alpha = diff.a;  #endif -	 -	vec3 normal = vary_norm;  -	 -	vec3 l = light_position[0].xyz; -	vec3 dlight = calcDirectionalLight(normal, l); -	dlight = dlight * vary_directional.rgb * vary_pointlight_col; -#if HAS_SHADOW -	vec4 col = vec4(vary_ambient + dlight * shadow, vertex_color_alpha); +	// Insure we don't pollute depth with invis pixels in impostor rendering +	// +	if (final_alpha < 0.01) +	{ +		discard; +	} +#else + +#ifdef USE_VERTEX_COLOR +	float final_alpha = diff.a * vertex_color.a; +	diff.rgb *= vertex_color.rgb;  #else -	vec4 col = vec4(vary_ambient + dlight, vertex_color_alpha); +	float final_alpha = diff.a;  #endif -	vec4 color = gamma_diff * col; -	 -	color.rgb = atmosLighting(color.rgb); +	vec4 gamma_diff = diff;	 +	diff.rgb = srgb_to_linear(diff.rgb); + +	vec3 norm = vary_norm;  + +	calcAtmospherics(pos.xyz, 1.0); + +	vec2 abnormal	= encode_normal(norm.xyz); +		 norm.xyz   = decode_normal(abnormal.xy); + +	float da = dot(norm.xyz, sun_dir.xyz); + +    float final_da = da; +          final_da = min(final_da, shadow); +          final_da = max(final_da, 0.0f); +		  final_da = min(final_da, 1.0f); +		  final_da = pow(final_da, 1.0/1.3); + +	vec4 color = vec4(0,0,0,0); + +	color.rgb = atmosAmbient(color.rgb); +	color.a   = final_alpha; + +	float ambient = abs(da); +	ambient *= 0.5; +	ambient *= ambient; +	ambient = (1.0-ambient); + +	color.rgb *= ambient; +	color.rgb += atmosAffectDirectionalLight(final_da); +	color.rgb *= gamma_diff.rgb; + +	//color.rgb = mix(diff.rgb, color.rgb, final_alpha); + +	color.rgb = atmosLighting(color.rgb);  	color.rgb = scaleSoftClip(color.rgb); -	color.rgb = pow(color.rgb, vec3(2.2)); -	col = vec4(0,0,0,0); +	vec4 light = 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); +	color.rgb = srgb_to_linear(color.rgb); +   #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diff.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); +     	LIGHT_LOOP(1)  	LIGHT_LOOP(2)  	LIGHT_LOOP(3) @@ -257,9 +609,19 @@ void main()  	LIGHT_LOOP(6)  	LIGHT_LOOP(7) -	color.rgb += diff.rgb * pow(vary_pointlight_col, vec3(2.2)) * col.rgb; +	// keep it linear +	// +	color.rgb += light.rgb; -	color.rgb = pow(color.rgb, vec3(1.0/2.2)); +	// straight to display gamma, we're post-deferred +	// +	color.rgb = linear_to_srgb(color.rgb); + +#ifdef WATER_FOG +	color = applyWaterFogDeferred(pos.xyz, color); +#endif + +#endif  	frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 9d3ba564cd..60d414f2ff 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -55,67 +55,18 @@ mat4 getSkinnedTransform();  #endif  #endif -vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); -void calcAtmospherics(vec3 inPositionEye); - -vec3 atmosAmbient(vec3 light); -vec3 atmosAffectDirectionalLight(float lightIntensity); -vec3 scaleDownLight(vec3 light); -vec3 scaleUpLight(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional;  VARYING vec3 vary_fragcoord;  VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col;  #ifdef USE_VERTEX_COLOR  VARYING vec4 vertex_color;  #endif  VARYING vec2 vary_texcoord0; -  VARYING vec3 vary_norm;  uniform float near_clip; -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8];  -uniform vec3 light_diffuse[8]; - -uniform vec3 sun_dir; - -vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ -	//get light vector -	vec3 lv = lp.xyz-v; -	 -	//get distance -	float d = dot(lv,lv); -	 -	float da = 0.0; - -	if (d > 0.0 && la > 0.0 && fa > 0.0) -	{ -		//normalize light vector -		lv = normalize(lv); -	 -		//distance attenuation -		float dist2 = d/la; -		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - -		// spotlight coefficient. -		float spot = max(dot(-ln, lv), is_pointlight); -		da *= spot*spot; // GL_SPOT_EXPONENT=2 - -		//angular attenuation -		da *= max(dot(n, lv), 0.0);		 -	} - -	return vec3(da,da,da);	 -} -  void main()  {  	vec4 pos; @@ -168,43 +119,10 @@ void main()  	vary_norm = norm;  	vary_position = pos.xyz; -	calcAtmospherics(pos.xyz); - -#ifndef USE_VERTEX_COLOR -	vec4 diffuse_color = vec4(1,1,1,1); -#endif -	//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.)); -	vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); -	 -	vec3 diff = diffuse_color.rgb; - -	 - -	vary_pointlight_col = diff; - -	 -	col.rgb = vec3(0,0,0); - -	// Add windlight lights -	col.rgb = atmosAmbient(col.rgb); -	 -	float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); -	ambient *= 0.5; -	ambient *= ambient; -	ambient = (1.0-ambient); - -	col.rgb *= ambient; - -	vary_ambient = col.rgb*diff.rgb; - -	vary_directional.rgb = atmosAffectDirectionalLight(1.0f); -	 -	col.rgb = col.rgb*diff.rgb; -	  #ifdef USE_VERTEX_COLOR -	vertex_color = col; +	vertex_color = diffuse_color;  #endif -	 +  #ifdef HAS_SKIN  	vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);  #else @@ -219,4 +137,3 @@ void main()  #endif  } - diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index 968a5f6b3d..a4f54dff70 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -59,22 +59,6 @@ vec4 getPosition(vec2 pos_screen)  	return pos;  } -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -91,7 +75,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  void main()   { diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl index 59d109b886..8525e13333 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl @@ -50,7 +50,7 @@ void main()  	{  		discard;  	} - +	  	frag_data[0] = vec4(col.rgb, 0.0);  	frag_data[1] = vec4(0,0,0,0);  	vec3 nvn = normalize(vary_normal); diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index dc1dead656..f22b16965c 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -35,29 +35,143 @@ 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); +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 + +} + +vec3 fullbrightAtmosTransportDeferred(vec3 light) +{ +	return light; +} + +vec3 fullbrightScaleSoftClipDeferred(vec3 light) +{ +	//soft clip effect: +	return light; +} + +#ifdef 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  void main()   {  #if HAS_DIFFUSE_LOOKUP -	vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color; +	vec4 color = diffuseLookup(vary_texcoord0.xy);  #else -	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy)*vertex_color; +	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);  #endif -	color.rgb = pow(color.rgb,vec3(2.2f,2.2f,2.2f)); -	 -	color.rgb = fullbrightAtmosTransport(color.rgb); +	float final_alpha = color.a * vertex_color.a; -	color.rgb = fullbrightScaleSoftClip(color.rgb); +#ifdef HAS_ALPHA_MASK +	if (color.a < minimum_alpha) +	{ +		discard; +	} +#endif + +	color.rgb *= vertex_color.rgb; +	color.rgb = srgb_to_linear(color.rgb); +	color.rgb = fullbrightAtmosTransportDeferred(color.rgb); +	color.rgb = fullbrightScaleSoftClipDeferred(color.rgb); +	 +	color.rgb = linear_to_srgb(color.rgb); -	color.rgb = pow(color.rgb, vec3(1.0/2.2)); +#ifdef WATER_FOG +	vec3 pos = vary_position; +	vec4 fogged = applyWaterFogDeferred(pos, vec4(color.rgb, final_alpha)); +	color.rgb = fogged.rgb; +	color.a   = fogged.a; +#else +	color.a   = final_alpha; +#endif -	frag_color = color; +	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..8e899e3e0f 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); +#ifdef 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); -	 + +#ifdef 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/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl index bc0719cb82..f8fdde43f9 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl @@ -38,6 +38,42 @@ uniform sampler2D specularMap;  VARYING vec2 vary_texcoord0; +vec3 decode_normal (vec2 enc) +{ +    vec2 fenc = enc*4-2; +    float f = dot(fenc,fenc); +    float g = sqrt(1-f/4); +    vec3 n; +    n.xy = fenc*g; +    n.z = 1-f/2; +    return n; +} + +vec2 encode_normal(vec3 n) +{ +	float f = sqrt(8 * n.z + 8); +	return n.xy / f + 0.5; +} + +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 + +} +  void main()   {  	vec4 col = texture2D(diffuseMap, vary_texcoord0.xy); @@ -47,7 +83,12 @@ void main()  		discard;  	} -	frag_data[0] = vec4(col.rgb, col.a * 0.005); -	frag_data[1] = texture2D(specularMap, vary_texcoord0.xy); -	frag_data[2] = vec4(texture2D(normalMap, vary_texcoord0.xy).xyz, 0.0); +	vec4 norm = texture2D(normalMap,   vary_texcoord0.xy); +	vec4 spec = texture2D(specularMap, vary_texcoord0.xy); + +	col.rgb = linear_to_srgb(col.rgb); + +	frag_data[0] = vec4(col.rgb, 0.0); +	frag_data[1] = spec; +	frag_data[2] = vec4(norm.xy,0,0);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 618ea747f5..8202b4978f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -29,6 +29,44 @@  #define DIFFUSE_ALPHA_MODE_EMISSIVE 3  uniform float emissive_brightness; +uniform float display_gamma; + +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 + +}  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) @@ -114,6 +152,52 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; +#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 calcDirectionalLight(vec3 n, vec3 l)  {  	float a = max(dot(n,l),0.0); @@ -142,7 +226,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe  		float dist = d/la;  		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);  		dist_atten *= dist_atten; -		dist_atten *= 1.4; +		dist_atten *= 2.0;  		// spotlight coefficient.  		float spot = max(dot(-ln, lv), is_pointlight); @@ -199,10 +283,13 @@ vec4 getPosition_d(vec2 pos_screen, float depth)  	return pos;  } +#ifndef WATER_FOG  vec3 getPositionEye()  {  	return vary_PositionEye;  } +#endif +  vec3 getSunlitColor()  {  	return vary_SunlitColor; @@ -428,22 +515,6 @@ VARYING vec3 vary_normal;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -460,7 +531,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  void main()   { @@ -475,8 +545,8 @@ void main()  #endif  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) -	vec3 old_diffcol = diffcol.rgb; -	diffcol.rgb = pow(diffcol.rgb, vec3(2.2)); +	vec3 gamma_diff = diffcol.rgb; +	diffcol.rgb = srgb_to_linear(diffcol.rgb);  #endif  #if HAS_SPECULAR_MAP @@ -502,6 +572,9 @@ void main()      norm.xyz = tnorm;      norm.xyz = normalize(norm.xyz); +	vec2 abnormal	= encode_normal(norm.xyz); +		 norm.xyz   = decode_normal(abnormal.xy); +  	vec4 final_color = diffcol;  #if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE) @@ -597,7 +670,7 @@ void main()  	vec4 diffuse = final_color;  	float envIntensity = final_normal.z; -    vec3 col = vec3(0.0f,0.0f,0.0f); +	vec3 col = vec3(0.0f,0.0f,0.0f);  	float bloom = 0.0;  	calcAtmospherics(pos.xyz, 1.0); @@ -605,23 +678,27 @@ void main()  	vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));  	float da =dot(norm.xyz, sun_dir.xyz); +      float final_da = da;            final_da = min(final_da, shadow); -          final_da = max(final_da, diffuse.a); +          //final_da = max(final_da, diffuse.a);            final_da = max(final_da, 0.0f); +		  final_da = min(final_da, 1.0f); +		  final_da = pow(final_da, 1.0/1.3);  	col.rgb = atmosAmbient(col); -	float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +	float ambient = min(abs(da), 1.0);  	ambient *= 0.5;  	ambient *= ambient;  	ambient = (1.0-ambient);  	col.rgb *= ambient; -	col.rgb = col.rgb + atmosAffectDirectionalLight(pow(final_da, 1.0/1.3)); -	col.rgb *= old_diffcol.rgb; -	 +	col.rgb = col.rgb + atmosAffectDirectionalLight(final_da); + +	col.rgb *= gamma_diff.rgb; +  	float glare = 0.0; @@ -643,7 +720,8 @@ void main()  		col += spec_contrib;  	} -	col = mix(col.rgb, old_diffcol.rgb, diffuse.a); + +	col = mix(col.rgb, diffcol.rgb, diffuse.a);  	if (envIntensity > 0.0)  	{ @@ -661,16 +739,20 @@ void main()  		glare += cur_glare;  	} -	col = mix(atmosLighting(col), fullbrightAtmosTransport(col), diffuse.a); -	col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a); +	//col = mix(atmosLighting(col), fullbrightAtmosTransport(col), diffuse.a); +	//col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col),  diffuse.a); -	//convert to linear space before adding local lights -	col = pow(col, vec3(2.2)); +	col = atmosLighting(col); +	col = scaleSoftClip(col); +	//convert to linear space before adding local lights +	col = srgb_to_linear(col);  	vec3 npos = normalize(-pos.xyz); - #define LIGHT_LOOP(i) col.rgb = col.rgb + calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare); +	vec3 light = vec3(0,0,0); + + #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare);  		LIGHT_LOOP(1)  		LIGHT_LOOP(2) @@ -680,13 +762,22 @@ void main()  		LIGHT_LOOP(6)  		LIGHT_LOOP(7) +	col.rgb += light.rgb; + +	glare = min(glare, 1.0); +	float al = max(diffcol.a,glare)*vertex_color.a;  	//convert to gamma space for display on screen -	col.rgb = pow(col.rgb, vec3(1.0/2.2)); +	col.rgb = linear_to_srgb(col.rgb); + +#ifdef WATER_FOG +	vec4 temp = applyWaterFogDeferred(pos, vec4(col.rgb, al)); +	col.rgb = temp.rgb; +	al = temp.a; +#endif  	frag_color.rgb = col.rgb; -	glare = min(glare, 1.0); -	frag_color.a = max(diffcol.a,glare)*vertex_color.a; +	frag_color.a   = al;  #else  	frag_data[0] = final_color; @@ -694,3 +785,4 @@ void main()  	frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity.  #endif  } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl index b25032866b..393d1e69da 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl @@ -142,3 +142,4 @@ vary_normal  = n;  #endif  #endif  } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 868526d457..3ba6de8b76 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -45,9 +45,8 @@ uniform float sun_wash;  uniform int light_count; -#define MAX_LIGHT_COUNT		16 -uniform vec4 light[MAX_LIGHT_COUNT]; -uniform vec4 light_col[MAX_LIGHT_COUNT]; +uniform vec4 light[LIGHT_COUNT]; +uniform vec4 light_col[LIGHT_COUNT];  VARYING vec4 vary_fragcoord;  uniform vec2 screen_res; @@ -56,22 +55,6 @@ uniform float far_z;  uniform mat4 inv_proj; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -88,7 +71,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  vec4 getPosition(vec2 pos_screen)  { @@ -117,78 +99,66 @@ void main()  	norm = normalize(norm);  	vec4 spec = texture2DRect(specularRect, frag.xy);  	vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb; +	  	float noise = texture2D(noiseMap, frag.xy/128.0).b;  	vec3 out_col = vec3(0,0,0);  	vec3 npos = normalize(-pos);  	// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop -	for (int i = 0; i < MAX_LIGHT_COUNT; ++i) +	for (int i = 0; i < LIGHT_COUNT; ++i)  	{ -		bool light_contrib = (i < light_count); -		  		vec3 lv = light[i].xyz-pos;  		float dist = length(lv);  		dist /= light[i].w; -		if (dist > 1.0) +		if (dist <= 1.0)  		{ -			light_contrib = false; -		} -		 -		float da = dot(norm, lv); -		if (da < 0.0) -		{ -			light_contrib = false; -		} -		 -		if (light_contrib) -		{ -			lv = normalize(lv); -			da = dot(norm, lv); +			float da = dot(norm, lv); +			if (da > 0.0) +			{ +				lv = normalize(lv); +				da = dot(norm, lv); -			float fa = light_col[i].a+1.0; -			float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); -			dist_atten *= dist_atten; -			dist_atten *= 2.0; +				float fa = light_col[i].a+1.0; +				float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +				dist_atten *= dist_atten; +				dist_atten *= 2.0; -			dist_atten *= noise; +				dist_atten *= noise; -			float lit = da * dist_atten; +				float lit = da * dist_atten; -			vec3 col = light_col[i].rgb*lit*diff; +				vec3 col = light_col[i].rgb*lit*diff; -			//vec3 col = vec3(dist2, light_col[i].a, lit); +				//vec3 col = vec3(dist2, light_col[i].a, lit); -			if (spec.a > 0.0) -			{ -				lit = min(da*6.0, 1.0) * dist_atten; -				//vec3 ref = dot(pos+lv, norm); -				vec3 h = normalize(lv+npos); -				float nh = dot(norm, h); -				float nv = dot(norm, npos); -				float vh = dot(npos, h); -				float sa = nh; -				float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; - -				float gtdenom = 2 * nh; -				float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); -								 -				if (nh > 0.0) +				if (spec.a > 0.0)  				{ -					float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); -					col += lit*scol*light_col[i].rgb*spec.rgb; -					//col += spec.rgb; +					lit = min(da*6.0, 1.0) * dist_atten; +					//vec3 ref = dot(pos+lv, norm); +					vec3 h = normalize(lv+npos); +					float nh = dot(norm, h); +					float nv = dot(norm, npos); +					float vh = dot(npos, h); +					float sa = nh; +					float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + +					float gtdenom = 2 * nh; +					float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); +								 +					if (nh > 0.0) +					{ +						float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); +						col += lit*scol*light_col[i].rgb*spec.rgb; +						//col += spec.rgb; +					}  				} -			} -			out_col += col; +				out_col += col; +			}  		}  	} -	if (dot(out_col, out_col) <= 0.0) -	{ -		discard; -	} -	 +  	frag_color.rgb = out_col;  	frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 97bf49a605..ed68e38891 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -67,22 +67,6 @@ uniform vec2 screen_res;  uniform mat4 inv_proj; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -99,17 +83,48 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      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 -vec4 correctWithGamma(vec4 col) +} + +vec3 linear_to_srgb(vec3 cl)  { -	return vec4(pow(col.rgb, vec3(2.2)), col.a); +	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 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = tc-vec2(0.5); @@ -125,7 +140,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -143,7 +158,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = tc-vec2(0.5); diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index caf20ce707..106d48bd71 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -54,22 +54,6 @@ uniform vec2 screen_res;  uniform mat4 inv_proj;  uniform vec4 viewport; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -86,7 +70,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  vec4 getPosition(vec2 pos_screen)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl index 6f2cfae6d2..4e2f98aa29 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -36,11 +36,32 @@ uniform sampler2DRect diffuseRect;  uniform vec2 screen_res;  VARYING vec2 vary_fragcoord; -uniform float texture_gamma; +uniform float display_gamma; + +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 + +} +  void main()   {  	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord); -	frag_color = pow(diff, vec4(texture_gamma, texture_gamma, texture_gamma, 1.0f)); +	diff.rgb = linear_to_srgb(diff.rgb); +	frag_color = diff;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 08583ad0f2..ebe5e57bb7 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -78,22 +78,43 @@ vec3 vary_AtmosAttenuation;  uniform mat4 inv_proj;  uniform vec2 screen_res; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) +vec3 srgb_to_linear(vec3 cs)  { -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; +	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 decode_normal (vec2 enc) +vec3 linear_to_srgb(vec3 cl)  { -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} +	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 + +} + +  vec3 decode_normal (vec2 enc)  {      vec2 fenc = enc*4-2; @@ -104,7 +125,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  vec4 getPosition_d(vec2 pos_screen, float depth)  { @@ -170,6 +190,53 @@ void setAtmosAttenuation(vec3 v)  	vary_AtmosAttenuation = v;  } + +#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 +  void calcAtmospherics(vec3 inPositionEye, float ambFactor) {  	vec3 P = inPositionEye; @@ -324,13 +391,16 @@ void main()  	float envIntensity = norm.z;  	norm.xyz = decode_normal(norm.xy); // unpack norm -	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); -	da = pow(da, 1.0/1.3); +	float da = dot(norm.xyz, sun_dir.xyz); + +	float final_da = max(0.0,da); +          final_da = min(final_da, 1.0f); +	      final_da = pow(final_da, 1.0/1.3);  	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);  	vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);  	vec3 col; @@ -346,7 +416,7 @@ void main()  		col.rgb *= ambient; -		col += atmosAffectDirectionalLight(max(min(da, 1.0), 0.0)); +		col += atmosAffectDirectionalLight(final_da);	  		col *= diffuse.rgb; @@ -383,16 +453,22 @@ void main()  		if (norm.w < 0.5)  		{  			col = mix(atmosLighting(col), fullbrightAtmosTransport(col), diffuse.a); -			col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col), diffuse.a); +			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;  	} -	frag_color.rgb = col; - +	frag_color.rgb = col.rgb;  	frag_color.a = bloom;  } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 1975b18652..48c9cd363c 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -65,22 +65,6 @@ uniform vec2 screen_res;  uniform mat4 inv_proj; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -97,11 +81,47 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      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) diff --git a/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl b/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl new file mode 100644 index 0000000000..587f3d5a94 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl @@ -0,0 +1,46 @@ +/**  + * @file srgb.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +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)); +	return mix(high_range, low_range, lte); + +} + +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)); +	return mix(high_range, low_range, lt); + +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/srgb_mac.glsl b/indra/newview/app_settings/shaders/class1/deferred/srgb_mac.glsl new file mode 100644 index 0000000000..6cc1e6e798 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/srgb_mac.glsl @@ -0,0 +1,54 @@ +/**  + * @file srgb.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +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)); + +	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; +} + +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)); + +	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; +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl index 6653f57ee1..c0a5865bef 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl @@ -49,22 +49,6 @@ VARYING vec2 vary_fragcoord;  uniform mat4 inv_proj;  uniform vec2 screen_res; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -81,7 +65,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  vec4 getPosition(vec2 pos_screen)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl new file mode 100644 index 0000000000..78f841c733 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl @@ -0,0 +1,157 @@ +/** + * @file underWaterF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ +  +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_data[3]; +#else +#define frag_data gl_FragData +#endif + +uniform sampler2D diffuseMap; +uniform sampler2D bumpMap;    +uniform sampler2D screenTex; +uniform sampler2D refTex; +uniform sampler2D screenDepth; + +uniform vec4 fogCol; +uniform vec3 lightDir; +uniform vec3 specular; +uniform float lightExp; +uniform vec2 fbScale; +uniform float refScale; +uniform float znear; +uniform float zfar; +uniform float kd; +uniform vec4 waterPlane; +uniform vec3 eyeVec; +uniform vec4 waterFogColor; +uniform float waterFogDensity; +uniform float waterFogKS; +uniform vec2 screenRes; + +//bigWave is (refCoord.w, view.w); +VARYING vec4 refCoord; +VARYING vec4 littleWave; +VARYING vec4 view; + +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); +	return n.xy / f + 0.5; +} + +vec4 applyWaterFog(vec4 color, vec3 viewVec) +{ +	//normalize view vector +	vec3 view = normalize(viewVec); +	float es = -view.z; + +	//find intersection point with water plane and eye vector +	 +	//get eye depth +	float e0 = max(-waterPlane.w, 0.0); +	 +	//get object depth +	float depth = length(viewVec); +		 +	//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); +	//return vec4(1.0, 0.0, 1.0, 1.0); +	return color * D + kc * L; +	//depth /= 10.0; +	//return vec4(depth,depth,depth,0.0); +} + +void main()  +{ +	vec4 color; +	     +	//get detail normals +	vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0; +	vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0; +	vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;     +	vec3 wavef = normalize(wave1+wave2+wave3); +	 +	//figure out distortion vector (ripply)    +	vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5; +	distort = distort+wavef.xy*refScale; +		 +	vec4 fb = texture2D(screenTex, distort); + +	frag_data[0] = vec4(linear_to_srgb(fb.rgb), 1.0); // diffuse +	frag_data[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec +	frag_data[2] = vec4(encode_normal(wavef), 0.0, 0.0); // normalxyz, displace +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index daa2fb390a..72c46e240d 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -67,6 +67,43 @@ VARYING vec4 littleWave;  VARYING vec4 view;  VARYING vec4 vary_position; +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); @@ -121,7 +158,7 @@ void main()  	refcol *= df1 * 0.333;  	vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5; -	//wavef.z *= max(-viewVec.z, 0.1); +	wavef.z *= max(-viewVec.z, 0.1);  	wavef = normalize(wavef);  	float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset; @@ -131,13 +168,14 @@ void main()  	vec2 refvec4 = distort+refdistort4/dmod;  	float dweight = min(dist2*blurMultiplier, 1.0);  	vec4 baseCol = texture2D(refTex, refvec4); +  	refcol = mix(baseCol*df2, refcol, dweight);  	//get specular component -	//float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0); +	float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0);  	//harden specular -	//spec = pow(spec, 128.0); +	spec = pow(spec, 128.0);  	//figure out distortion vector (ripply)     	vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0); @@ -148,24 +186,17 @@ void main()  	// Note we actually want to use just df1, but multiplying by 0.999999 gets around an nvidia compiler bug  	color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999); -	float shadow = 1.0;  	vec4 pos = vary_position; -	 -	//vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz; -	vec4 spos = pos; -	//spec *= shadow; -	//color.rgb += spec * specular; -	 +	color.rgb += spec * specular; +  	color.rgb = atmosTransport(color.rgb);  	color.rgb = scaleSoftClip(color.rgb); -	//color.a = spec * sunAngle2; +	color.a   = spec * sunAngle2; -	//wavef.z *= 0.1f; -	//wavef = normalize(wavef); -	vec3 screenspacewavef = (norm_mat*vec4(wavef, 1.0)).xyz; +	vec3 screenspacewavef = normalize((norm_mat*vec4(wavef, 1.0)).xyz); -	frag_data[0] = vec4(color.rgb, 0.5); // diffuse -	frag_data[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec -	frag_data[2] = vec4(encode_normal(screenspacewavef), 0.0, 0.0); // normalxyz, displace +	frag_data[0] = vec4(color.rgb, color); // diffuse +	frag_data[1] = vec4(0);		// speccolor, spec +	frag_data[2] = vec4(encode_normal(screenspacewavef.xyz*0.5+0.5), 0.05, 0);// normalxy, 0, 0  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl index ece34dcc4e..9734acf005 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl @@ -85,7 +85,7 @@ void main()  	pos.w = 1.0;  	pos = modelview_matrix*pos; -	calcAtmospherics(view.xyz); +	calcAtmospherics(pos.xyz);  	//pass wave parameters to pixel shader  	vec2 bigWave =  (v.xy) * vec2(0.04,0.04)  + d1 * time * 0.055; diff --git a/indra/newview/app_settings/shaders/class1/interface/downsampleDepthF.glsl b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthF.glsl index 6523a06d22..f8efd7cb4a 100644 --- a/indra/newview/app_settings/shaders/class1/interface/downsampleDepthF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthF.glsl @@ -31,8 +31,6 @@ out vec4 frag_color;  uniform sampler2D depthMap; -uniform float delta; -  VARYING vec2 tc0;  VARYING vec2 tc1;  VARYING vec2 tc2; diff --git a/indra/newview/app_settings/shaders/class1/interface/downsampleDepthRectF.glsl b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthRectF.glsl index 0e5dc08183..942c5888e7 100644 --- a/indra/newview/app_settings/shaders/class1/interface/downsampleDepthRectF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/downsampleDepthRectF.glsl @@ -33,8 +33,6 @@ out vec4 frag_color;  uniform sampler2DRect depthMap; -uniform float delta; -  VARYING vec2 tc0;  VARYING vec2 tc1;  VARYING vec2 tc2; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl index eaaa7b208d..cad5b9ff04 100755 --- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl @@ -41,13 +41,13 @@ void default_lighting()  {  	vec4 color = diffuseLookup(vary_texcoord0.xy); +	color *= vertex_color; +  	if (color.a < minimum_alpha)  	{  		discard;  	} -	color.rgb *= vertex_color.rgb; -  	color.rgb = atmosLighting(color.rgb);  	color.rgb = scaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl deleted file mode 100755 index 13c6ffc607..0000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ /dev/null @@ -1,224 +0,0 @@ -/**  - * @file alphaV.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat3 normal_matrix; -uniform mat4 texture_matrix0; -uniform mat4 projection_matrix; -uniform mat4 modelview_matrix; -uniform mat4 modelview_projection_matrix; - -ATTRIBUTE vec3 position; - -#ifdef USE_INDEXED_TEX -void passTextureIndex(); -#endif - -ATTRIBUTE vec3 normal; - -#ifdef USE_VERTEX_COLOR -ATTRIBUTE vec4 diffuse_color; -#endif - -ATTRIBUTE vec2 texcoord0; - -#ifdef HAS_SKIN -mat4 getObjectSkinnedTransform(); -#else -#ifdef IS_AVATAR_SKIN -mat4 getSkinnedTransform(); -#endif -#endif - -vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); -void calcAtmospherics(vec3 inPositionEye); - -vec3 calcDirectionalLight(vec3 n, vec3 l); - -vec3 atmosAmbient(vec3 light); -vec3 atmosAffectDirectionalLight(float lightIntensity); -vec3 scaleDownLight(vec3 light); -vec3 scaleUpLight(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col; - -#ifdef USE_VERTEX_COLOR -VARYING vec4 vertex_color; -#endif - -VARYING vec2 vary_texcoord0; -VARYING vec3 vary_norm; - -uniform float near_clip; -uniform float shadow_offset; -uniform float shadow_bias; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8];  -uniform vec3 light_diffuse[8]; - -uniform vec3 sun_dir; - -vec3 calcDirectionalLight(vec3 n, vec3 l) -{ -        float a = max(dot(n,l),0.0); -        return vec3(a,a,a); -} - -vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ -	//get light vector -	vec3 lv = lp.xyz-v; -	 -	//get distance -	float d = dot(lv,lv); -	 -	float da = 0.0; - -	if (d > 0.0 && la > 0.0 && fa > 0.0) -	{ -		//normalize light vector -		lv = normalize(lv); -	 -		//distance attenuation -		float dist2 = d/la; -		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - -		// spotlight coefficient. -		float spot = max(dot(-ln, lv), is_pointlight); -		da *= spot*spot; // GL_SPOT_EXPONENT=2 - -		//angular attenuation -		da *= max(dot(n, lv), 0.0);		 -	} - -	return vec3(da,da,da);	 -} - -void main() -{ -	vec4 pos; -	vec3 norm; -	 -	//transform vertex -#ifdef HAS_SKIN -	mat4 trans = getObjectSkinnedTransform(); -	trans = modelview_matrix * trans; -	 -	pos = trans * vec4(position.xyz, 1.0); -	 -	norm = position.xyz + normal.xyz; -	norm = normalize((trans * vec4(norm, 1.0)).xyz - pos.xyz); -	vec4 frag_pos = projection_matrix * pos; -	gl_Position = frag_pos; -#else - -#ifdef IS_AVATAR_SKIN -	mat4 trans = getSkinnedTransform(); -	vec4 pos_in = vec4(position.xyz, 1.0); -	pos.x = dot(trans[0], pos_in); -	pos.y = dot(trans[1], pos_in); -	pos.z = dot(trans[2], pos_in); -	pos.w = 1.0; -	 -	norm.x = dot(trans[0].xyz, normal); -	norm.y = dot(trans[1].xyz, normal); -	norm.z = dot(trans[2].xyz, normal); -	norm = normalize(norm); -	 -	vec4 frag_pos = projection_matrix * pos; -	gl_Position = frag_pos; -#else -	norm = normalize(normal_matrix * normal); -	vec4 vert = vec4(position.xyz, 1.0); -	pos = (modelview_matrix * vert); -	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0); -#endif -	 -#endif - -#ifdef USE_INDEXED_TEX -	passTextureIndex(); -	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -#else -	vary_texcoord0 = texcoord0; -#endif -	 -	vary_norm = norm; -	float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz)); -	vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset; -	 -	calcAtmospherics(pos.xyz); - -#ifndef USE_VERTEX_COLOR -	vec4 diffuse_color = vec4(1,1,1,1); -#endif - -	//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.)); -	vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); - -	vec3 dff = pow(diffuse_color.rgb, vec3(2.2f,2.2f,2.2f)); - -	vary_pointlight_col = dff; - -	col.rgb = vec3(0,0,0); - -	// Add windlight lights -	col.rgb = atmosAmbient(col.rgb); -	 -	float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); -	ambient *= 0.5; -	ambient *= ambient; -	ambient = (1.0-ambient); - -	col.rgb *= ambient; - -	vary_directional.rgb = atmosAffectDirectionalLight(1.0f); -	vary_ambient = col.rgb*dff; -	 -	col.rgb = col.rgb*dff; -	 -#ifdef USE_VERTEX_COLOR -	vertex_color = col; -#endif -	 -#ifdef HAS_SKIN -	vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); -#else - -#ifdef IS_AVATAR_SKIN -	vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); -#else -	pos = modelview_projection_matrix * vert; -	vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); -#endif - -#endif - -} diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 780df9ed1a..df750d3cec 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -68,22 +68,43 @@ uniform vec2 screen_res;  uniform mat4 inv_proj; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) +vec3 srgb_to_linear(vec3 cs)  { -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; +	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 decode_normal (vec2 enc) +vec3 linear_to_srgb(vec3 cl)  { -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} +	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); @@ -100,14 +121,12 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#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)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); @@ -335,6 +354,10 @@ void main()  		}  	} + +	//not sure why, but this line prevents MATBUG-194 +	col = max(col, vec3(0.0)); +  	frag_color.rgb = col;	  	frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 67bac1f7c2..cc34285d65 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -78,22 +78,43 @@ vec3 vary_AtmosAttenuation;  uniform mat4 inv_proj;  uniform vec2 screen_res; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) +vec3 srgb_to_linear(vec3 cs)  { -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; +	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 decode_normal (vec2 enc) +vec3 linear_to_srgb(vec3 cl)  { -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} +	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); @@ -110,7 +131,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  vec4 getPosition_d(vec2 pos_screen, float depth)  { @@ -263,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; @@ -343,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; @@ -402,19 +468,25 @@ void main()  				envIntensity);    		} -						 +	  		if (norm.w < 0.5)  		{  			col = mix(atmosLighting(col), fullbrightAtmosTransport(col), diffuse.a);  			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;  	} -	 +  	frag_color.rgb = col;  	frag_color.a = bloom;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index fc0e6b2388..bb6afbbf62 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -68,22 +68,6 @@ uniform vec2 screen_res;  uniform mat4 inv_proj; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -100,11 +84,47 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      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) @@ -332,7 +352,10 @@ void main()  			}  		}  	} -	 + +	//not sure why, but this line prevents MATBUG-194 +	col = max(col, vec3(0.0)); +  	frag_color.rgb = col;	  	frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 7b09dd29dd..95c09d3238 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -65,22 +65,6 @@ uniform float shadow_offset;  uniform float spot_shadow_bias;  uniform float spot_shadow_offset; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -97,7 +81,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  vec4 getPosition(vec2 pos_screen)  { diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 01e34ed792..b5ff6404ea 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -66,22 +66,6 @@ uniform float shadow_offset;  uniform float spot_shadow_bias;  uniform float spot_shadow_offset; -#ifdef SINGLE_FP_ONLY -vec2 encode_normal(vec3 n) -{ -	vec2 sn; -	sn.xy = (n.xy * vec2(0.5f,0.5f)) + vec2(0.5f,0.5f); -	return sn; -} - -vec3 decode_normal (vec2 enc) -{ -	vec3 n; -	n.xy = (enc.xy * vec2(2.0f,2.0f)) - vec2(1.0f,1.0f); -	n.z = sqrt(1.0f - dot(n.xy,n.xy)); -	return n; -} -#else  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); @@ -98,7 +82,6 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } -#endif  vec4 getPosition(vec2 pos_screen)  { | 
