diff options
| author | simon_linden <none@none> | 2013-09-19 15:30:34 -0700 | 
|---|---|---|
| committer | simon_linden <none@none> | 2013-09-19 15:30:34 -0700 | 
| commit | d3625d0b672d59b0164e1b4615edbb9550912ec6 (patch) | |
| tree | 292f86a4e1dc65d57faee094f5365bf72a240846 /indra/newview/app_settings/shaders | |
| parent | 8fa463113c19682a64988d2f8c527ef5e5dd156c (diff) | |
| parent | 95e34d86b9d86b3b3c7d3c39620e35b06f8fa9cf (diff) | |
Merge downstream code
Diffstat (limited to 'indra/newview/app_settings/shaders')
25 files changed, 1473 insertions, 243 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 4b428cb904..e5f7366b70 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,15 +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 vec3 vary_pointlight_col_linear;  VARYING vec2 vary_texcoord0;  VARYING vec3 vary_norm; @@ -69,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)  { @@ -83,7 +157,7 @@ vec3 calcDirectionalLight(vec3 n, vec3 l)  	return vec3(a,a,a);  } -float 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; @@ -91,19 +165,20 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	//get distance  	float d = length(lv); -	float da = 0.0; +	float da = 1.0; -	//if (d > 0.0 && la > 0.0 && fa > 0.0) +	vec3 col = vec3(0); + +	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv /= d; +		lv = normalize(lv);  		//distance attenuation -		float dist = d*la; -		da = clamp(1.0-(dist+fa-1.0)/fa, 0.0, 1.0); -		da *= da; -		da *= 2.0; -	 +		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 *= 2.0;  		// spotlight coefficient.  		float spot = max(dot(-ln, lv), is_pointlight); @@ -111,9 +186,15 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		//angular attenuation  		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 da;	 +	return max(col, vec3(0.0,0.0,0.0));  }  #if HAS_SHADOW @@ -136,40 +217,254 @@ float pcfShadow(sampler2DShadow shadowMap, vec4 stc)  }  #endif +#ifdef WATER_FOG +uniform vec4 waterPlane; +uniform vec4 waterFogColor; +uniform float waterFogDensity; +uniform float waterFogKS; -void main()  +vec4 applyWaterFogDeferred(vec3 pos, vec4 color)  { -#ifdef USE_INDEXED_TEX -	vec4 diff = diffuseLookup(vary_texcoord0.xy); -#else -	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); -#endif +	//normalize view vector +	vec3 view = normalize(pos); +	float es = -(dot(view, waterPlane.xyz)); -#ifdef USE_VERTEX_COLOR -	float vertex_color_alpha = vertex_color.a;	 -#else -	float vertex_color_alpha = 1.0; +	//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 -	float alpha = vertex_color_alpha*diff.a; +vec3 getSunlitColor() +{ +	return vary_SunlitColor; +} +vec3 getAmblitColor() +{ +	return vary_AmblitColor; +} +vec3 getAdditiveColor() +{ +	return vary_AdditiveColor; +} +vec3 getAtmosAttenuation() +{ +	return vary_AtmosAttenuation; +} -	vec4 gamma_diff = diff; +void setPositionEye(vec3 v) +{ +	vary_PositionEye = v; +} -	diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f)); +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()  +{  	vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;  	frag *= screen_res;  	vec4 pos = vec4(vary_position, 1.0); +	float shadow = 1.0;  #if HAS_SHADOW -	float shadow = 0.0;  	vec4 spos = pos;  	if (spos.z > -shadow_clip.w)  	{	 +		shadow = 0.0; +  		vec4 lpos;  		vec4 near_split = shadow_clip*-0.75; @@ -230,30 +525,81 @@ void main()  	}  #endif -	vec3 normal = vary_norm;  -	 -	vec3 l = light_position[0].xyz; -	vec3 dlight = calcDirectionalLight(normal, l); -	dlight = dlight * vary_directional.rgb * vary_pointlight_col; +#ifdef USE_INDEXED_TEX +	vec4 diff = diffuseLookup(vary_texcoord0.xy); +#else +	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); +#endif -#if HAS_SHADOW -	vec4 col = vec4(vary_ambient + dlight * shadow, vertex_color_alpha); +#ifdef FOR_IMPOSTOR +	vec4 color; +	color.rgb = diff.rgb; + +#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 +	 +	// 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 +	float final_alpha = diff.a; +#endif + + +	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); -	vec4 color = gamma_diff * col; +	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); -	//convert to linear space -	color.rgb = pow(color.rgb, vec3(2.2)); -	col = vec4(0,0,0,0); +	vec4 light = vec4(0,0,0,0); +	color.rgb = srgb_to_linear(color.rgb); -   #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); +   #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) @@ -263,10 +609,19 @@ void main()  	LIGHT_LOOP(6)  	LIGHT_LOOP(7) -	color.rgb += diff.rgb * vary_pointlight_col_linear * col.rgb; +	// keep it linear +	// +	color.rgb += light.rgb; -	//convert to gamma space -	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 cc63baa422..b40785bbd7 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -55,33 +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; -VARYING vec3 vary_pointlight_col_linear;  #ifdef USE_VERTEX_COLOR  VARYING vec4 vertex_color;  #endif  VARYING vec2 vary_texcoord0; -  VARYING vec3 vary_norm;  uniform float near_clip; -uniform vec3 sun_dir; -  void main()  {  	vec4 pos; @@ -134,42 +119,8 @@ 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; -	vary_pointlight_col_linear = pow(diff, vec3(2.2)); - -	 -	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 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 27bb43110b..07d28ed4cd 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); @@ -133,14 +217,14 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe  	vec3 col = vec3(0,0,0); -	//if (d > 0.0 && la > 0.0 && fa > 0.0) +	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv /= d; +		lv = normalize(lv);  		//distance attenuation -		float dist = d*la; -		float dist_atten = clamp(1.0-(dist-1.0+fa)/fa, 0.0, 1.0); +		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 *= 2.0; @@ -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; @@ -458,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 @@ -485,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) @@ -588,22 +678,26 @@ 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; @@ -626,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)  	{ @@ -644,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); + +	col = atmosLighting(col); +	col = scaleSoftClip(col);  	//convert to linear space before adding local lights -	col = pow(col, vec3(2.2)); +	col = srgb_to_linear(col); -			  	vec3 npos = normalize(-pos.xyz); +			 +	vec3 light = vec3(0,0,0); - #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); + #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) @@ -663,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; @@ -677,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 5a08980fec..236567219b 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -36,6 +36,7 @@ uniform sampler2DRect diffuseRect;  uniform sampler2DRect specularRect;  uniform sampler2DRect normalMap;  uniform samplerCube environmentMap; +uniform sampler2D noiseMap;  uniform sampler2D lightFunc; @@ -98,6 +99,8 @@ 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); @@ -105,47 +108,56 @@ void main()  	for (int i = 0; i < LIGHT_COUNT; ++i)  	{  		vec3 lv = light[i].xyz-pos; -		float d = length(lv); -		float dist = d * light[i].w; +		float dist = length(lv); +		dist /= light[i].w;  		if (dist <= 1.0)  		{ -			float da = dot(norm, lv); +		float da = dot(norm, lv);  			if (da > 0.0) -			{ -				lv /= d; -				da = dot(norm, lv); +		{ +			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; -				float lit = da * dist_atten; +			dist_atten *= noise; + +			float lit = da * dist_atten; -				vec3 col = light_col[i].rgb*lit*diff; +			vec3 col = light_col[i].rgb*lit*diff; -				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)); +			//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) +				{  					float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); -					col += max(lit*scol*light_col[i].rgb*spec.rgb, vec3(0.0)); +					col += lit*scol*light_col[i].rgb*spec.rgb; +					//col += spec.rgb;  				} -			 -				out_col += col;  			} +			 +			out_col += col;  		}  	} +	} +	  	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 7b09823242..2e5a2c273e 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -84,16 +84,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); @@ -109,7 +141,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)); @@ -127,7 +159,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 b331258952..73b9767a71 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -93,52 +93,64 @@ void main()  	vec3 pos = getPosition(frag.xy).xyz;  	vec3 lv = trans_center.xyz-pos; -	float d = length(lv); +	float dist = length(lv); +	dist /= size; +	if (dist > 1.0) +	{ +		discard; +	} -	float dist = d*size; - -	vec3 col = vec3(0.0); -	if (dist <= 1.0) +	vec3 norm = texture2DRect(normalMap, frag.xy).xyz; +	norm = decode_normal(norm.xy); // unpack norm +	float da = dot(norm, lv); +	if (da < 0.0)  	{ -		vec3 norm = texture2DRect(normalMap, frag.xy).xyz; -		norm = decode_normal(norm.xy); // unpack norm -			 -		norm = normalize(norm); -		lv = normalize(lv); -		float da = max(dot(norm, lv), 0.0); +		discard; +	} +	 +	norm = normalize(norm); +	lv = normalize(lv); +	da = dot(norm, lv);  		//float noise = texture2D(noiseMap, frag.xy/128.0).b; -		col = texture2DRect(diffuseRect, frag.xy).rgb; -		float fa = falloff+1.0; -		float dist_atten = clamp(1.0-(dist-1.0+fa)/fa, 0.0, 1.0); -		dist_atten *= dist_atten; -		dist_atten *= 2.0; +	vec3 col = texture2DRect(diffuseRect, frag.xy).rgb; +	float fa = falloff+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 lit = da * dist_atten; -		col = color.rgb*lit*col; +	col = color.rgb*lit*col; -		vec4 spec = texture2DRect(specularRect, frag.xy); -		if (spec.a > 0.0) +	vec4 spec = texture2DRect(specularRect, frag.xy); +	if (spec.a > 0.0) +	{ +		lit = min(da*6.0, 1.0) * dist_atten; + +		vec3 npos = -normalize(pos); +		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)  		{ -			lit = min(da*6.0, 1.0) * dist_atten; - -			vec3 npos = -normalize(pos); -			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))); -  			float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); -			col += max(lit*scol*color.rgb*spec.rgb, vec3(0.0)); +			col += lit*scol*color.rgb*spec.rgb;  		}  	} +	if (dot(col, col) <= 0.0) +	{ +		discard; +	} +		  	frag_color.rgb = col;	  	frag_color.a = 0.0;  } 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 26b1041cd5..760d52a9ce 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -79,6 +79,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) +{ +	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; @@ -154,6 +191,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; @@ -308,13 +392,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; @@ -330,7 +417,7 @@ void main()  		col.rgb *= ambient; -		col += atmosAffectDirectionalLight(max(min(da, 1.0), 0.0)); +		col += atmosAffectDirectionalLight(final_da);	  		col *= diffuse.rgb; @@ -370,13 +457,19 @@ 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;  	} -	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 e9e6ba9935..8d8a6c9dde 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -85,9 +85,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) 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/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 8de8ba1dd8..e7a3bb2001 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -53,11 +53,12 @@ uniform vec3 specular;  uniform float lightExp;  uniform float refScale;  uniform float kd; +uniform vec2 screenRes;  uniform vec3 normScale;  uniform float fresnelScale;  uniform float fresnelOffset;  uniform float blurMultiplier; -uniform mat3 normal_matrix; +uniform mat4 norm_mat; //region space to screen space  //bigWave is (refCoord.w, view.w);  VARYING vec4 refCoord; @@ -65,6 +66,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); @@ -119,7 +157,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; @@ -129,13 +167,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); @@ -146,24 +185,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 = normal_matrix*wavef; +	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/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)); | 
