diff options
| author | Graham Madarasz <graham@lindenlab.com> | 2013-04-19 07:48:05 -0700 | 
|---|---|---|
| committer | Graham Madarasz <graham@lindenlab.com> | 2013-04-19 07:48:05 -0700 | 
| commit | 6adc6d71a7147a7f53f266bb05cd0157e34f9f4b (patch) | |
| tree | ad3b8886cd2c09cc1510db6a8c2e2e87ffafb441 /indra/newview/app_settings/shaders/class1/deferred | |
| parent | 8bccedd163f1eb25c631e8501bdd468c24e6bf40 (diff) | |
| parent | f9ff68b5e3b016a53fe987e5b51442741ca88f15 (diff) | |
Merge viewer-dev-materials
Diffstat (limited to 'indra/newview/app_settings/shaders/class1/deferred')
13 files changed, 711 insertions, 136 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 713aae9187..17ac5a276d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -25,23 +25,19 @@  #extension GL_ARB_texture_rectangle : enable +#define INDEXED 1 +#define NON_INDEXED 2 +#define NON_INDEXED_NO_COLOR 3 +  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_color;  #else  #define frag_color gl_FragColor  #endif -uniform sampler2DRect depthMap; - -#ifndef INDEX_MODE -#ifndef INDEX_MODE_USE_COLOR +#if INDEX_MODE != INDEXED  uniform sampler2D diffuseMap;  #endif -#endif - -#ifdef INDEX_MODE -vec4 diffuseLookup(vec2 texcoord); -#endif  uniform vec2 screen_res; @@ -54,34 +50,20 @@ VARYING vec3 vary_fragcoord;  VARYING vec3 vary_position;  VARYING vec3 vary_pointlight_col;  VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2;  VARYING vec3 vary_norm; -VARYING mat3 vary_rotation; -#ifdef INDEX_MODE_USE_COLOR +#if INDEX_MODE != NON_INDEXED_NO_COLOR  VARYING vec4 vertex_color;  #endif -uniform mat4 inv_proj; -  uniform vec4 light_position[8];  uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; -uniform sampler2D bumpMap; -uniform samplerCube environmentMap; -uniform mat3 env_mat; - -uniform vec4 specular_color; - - -uniform float shadow_offset; -  vec3 calcDirectionalLight(vec3 n, vec3 l)  { -        float a = pow(max(dot(n,l),0.0), 0.7); +	float a = max(dot(n,l),0.0);  	return vec3(a,a,a);  } @@ -109,7 +91,7 @@ vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= max(pow(dot(n, lv), 0.7), 0.0);		 +		da *= max(dot(n, lv), 0.0);		  	}  	return vec3(da,da,da);	 @@ -122,22 +104,19 @@ void main()  	vec4 pos = vec4(vary_position, 1.0); -#ifdef INDEX_MODE +#if INDEX_MODE == INDEXED  	vec4 diff= diffuseLookup(vary_texcoord0.xy);  #else  	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);  #endif - -#ifdef INDEX_MODE_USE_COLOR -	float vertex_color_alpha = vertex_color.a; -#else +	diff.rgb = pow(diff.rgb, vec3(2.2)); +#if INDEX_MODE == NON_INDEXED_NO_COLOR  	float vertex_color_alpha = 1.0; +#else +	float vertex_color_alpha = vertex_color.a;  #endif -	vec3 normal = texture2D(bumpMap, vary_texcoord1.xy).xyz * 2 - 1; -	normal = vec3(dot(normal.xyz, vary_rotation[0]), -				dot(normal.xyz, vary_rotation[1]), -				dot(normal.xyz, vary_rotation[2])); +	vec3 normal = vary_norm;   	vec3 l = light_position[0].xyz;  	vec3 dlight = calcDirectionalLight(normal, l); diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 71e8e430e5..a4b4cd51e3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -34,30 +34,25 @@ uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix;  ATTRIBUTE vec3 position; -#ifdef INDEX_MODE +#if INDEX_MODE == INDEXED  void passTextureIndex();  #endif  ATTRIBUTE vec3 normal; +#if INDEX_MODE != NON_INDEXED_NO_COLOR  ATTRIBUTE vec4 diffuse_color; +#endif  ATTRIBUTE vec2 texcoord0; -ATTRIBUTE vec3 binormal; -ATTRIBUTE vec2 texcoord1; -ATTRIBUTE vec2 texcoord2; -#ifdef HAS_SKIN +#if HAS_SKIN  mat4 getObjectSkinnedTransform(); -#else - -#ifdef IS_AVATAR_SKIN +#elif 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); +float calcDirectionalLight(vec3 n, vec3 l);  vec3 atmosAmbient(vec3 light);  vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -70,20 +65,15 @@ VARYING vec3 vary_fragcoord;  VARYING vec3 vary_position;  VARYING vec3 vary_pointlight_col; -#ifdef INDEX_MODE_USE_COLOR +#if INDEX_MODE != NON_INDEXED_NO_COLOR  VARYING vec4 vertex_color;  #endif  VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2;  VARYING vec3 vary_norm; -VARYING mat3 vary_rotation;  uniform float near_clip; -uniform float shadow_offset; -uniform float shadow_bias;  uniform vec4 light_position[8];  uniform vec3 light_direction[8]; @@ -130,8 +120,9 @@ void main()  {  	vec4 pos;  	vec3 norm; +	  	//transform vertex -#ifdef HAS_SKIN +#if HAS_SKIN  	mat4 trans = getObjectSkinnedTransform();  	trans = modelview_matrix * trans; @@ -141,8 +132,7 @@ void main()  	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 +#elif IS_AVATAR_SKIN  	mat4 trans = getSkinnedTransform();  	vec4 pos_in = vec4(position.xyz, 1.0);  	pos.x = dot(trans[0], pos_in); @@ -163,12 +153,8 @@ void main()  	pos = (modelview_matrix * vert);  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  #endif -#endif - -	vary_texcoord1 = (texture_matrix0 * vec4(texcoord1,0,1)).xy; -	vary_texcoord2 = (texture_matrix0 * vec4(texcoord2,0,1)).xy; - -#ifdef INDEX_MODE +	 +#if INDEX_MODE == INDEXED  	passTextureIndex();  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;  #else @@ -176,19 +162,13 @@ void main()  #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; -	 -	vec3 n = norm; -	vec3 b = normalize(normal_matrix * binormal); -	vec3 t = cross(b, n); - -	vary_rotation[0] = vec3(t.x, b.x, n.x); -	vary_rotation[1] = vec3(t.y, b.y, n.y); -	vary_rotation[2] = vec3(t.z, b.z, n.z); +	vary_position = pos.xyz;  	calcAtmospherics(pos.xyz); +#if INDEX_MODE == NON_INDEXED_NO_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); @@ -204,18 +184,17 @@ void main()  	vary_directional.rgb = atmosAffectDirectionalLight(1.0f);  	col.rgb = col.rgb*diffuse_color.rgb; -#ifdef INDEX_MODE_USE_COLOR +#if INDEX_MODE != NON_INDEXED_NO_COLOR  	vertex_color = col;  #endif -#ifdef HAS_SKIN +#if HAS_SKIN  	vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); -#else -#ifdef IS_AVATAR_SKIN +#elif 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/class1/deferred/emissiveF.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl index 6aa4d7b4ed..ed02c4a481 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl @@ -42,7 +42,7 @@ void main()  	float shadow = 1.0;  	vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color; -	 +	color.rgb = pow(color.rgb, vec3(2.2));  	color.rgb = fullbrightAtmosTransport(color.rgb);  	color.rgb = fullbrightScaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 36433a5827..b91aaf80fb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -43,7 +43,7 @@ void main()  	float shadow = 1.0;  	vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color; -	 +	color.rgb = pow(color.rgb, vec3(2.2));  	color.rgb = fullbrightAtmosTransport(color.rgb);  	color.rgb = fullbrightScaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 35b176b457..5e75cc3ce6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -29,11 +29,360 @@  #define DIFFUSE_ALPHA_MODE_EMISSIVE 3 +#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + + +#if HAS_SUN_SHADOW + +uniform sampler2DShadow shadowMap0; +uniform sampler2DShadow shadowMap1; +uniform sampler2DShadow shadowMap2; +uniform sampler2DShadow shadowMap3; + +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform vec2 shadow_res; +uniform float shadow_bias; + +float pcfShadow(sampler2DShadow shadowMap, vec4 stc) +{ +	stc.xyz /= stc.w; +	stc.z += shadow_bias; +		 +	stc.x = floor(stc.x*shadow_res.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here +	 +	float cs = shadow2D(shadowMap, stc.xyz).x; +	float shadow = cs; +	 +    shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; +                        +    return shadow*0.2; +} + +#endif + +uniform samplerCube environmentMap; +uniform sampler2D	  lightFunc; + +// Inputs +uniform vec4 morphFactor; +uniform vec3 camPosLocal; +//uniform vec4 camPosWorld; +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; +VARYING vec2 vary_fragcoord; + +VARYING vec3 vary_position; + +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]; + +vec3 calcDirectionalLight(vec3 n, vec3 l) +{ +	float a = max(dot(n,l),0.0); +	return vec3(a,a,a); +} + + +vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, 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 = 1.0; + +	vec3 col = vec3(0,0,0); + +	if (d > 0.0 && la > 0.0 && fa > 0.0) +	{ +		//normalize light vector +		lv = normalize(lv); +	 +		//distance attenuation +		float dist2 = d/la; +		float dist_atten = 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);		 +		 +		float lit = max(da * dist_atten, 0.0); + +		col = light_col*lit*diffuse; + +		if (spec.a > 0.0) +		{ +			//vec3 ref = dot(pos+lv, norm); +			vec3 h = normalize(lv+npos); +			float nh = dot(n, h); +			float nv = dot(n, 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.rgb*spec.rgb; +				//col += spec.rgb; +			} +		} +	} + +	return max(col, vec3(0.0,0.0,0.0));	 + +} + +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; +} + +vec4 getPosition_d(vec2 pos_screen, float depth) +{ +	vec2 sc = pos_screen.xy*2.0; +	sc /= screen_res; +	sc -= vec2(1.0,1.0); +	vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); +	vec4 pos = inv_proj * ndc; +	pos /= pos.w; +	pos.w = 1.0; +	return pos; +} + +vec3 getPositionEye() +{ +	return vary_PositionEye; +} +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 / scene_light_strength ); +} + +vec3 scaleUpLight(vec3 light) +{ +	return (light * scene_light_strength); +} + +vec3 atmosAmbient(vec3 light) +{ +	return getAmblitColor() + light / 2.0; +} + +vec3 atmosAffectDirectionalLight(float lightIntensity) +{ +	return getSunlitColor() * lightIntensity; +} + +vec3 scaleSoftClip(vec3 light) +{ +	//soft clip effect: +	light = 1. - clamp(light, vec3(0.), vec3(1.)); +	light = 1. - pow(light, gamma.xxx); + +	return light; +} + +#else  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_data[3];  #else  #define frag_data gl_FragData  #endif +#endif  uniform sampler2D diffuseMap; @@ -74,16 +423,20 @@ vec2 encode_normal(vec3 n)  void main()   { -	vec4 col = texture2D(diffuseMap, vary_texcoord0.xy); -	col.rgb *= vertex_color.rgb; +	vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy); +	diffcol.rgb *= vertex_color.rgb;  #if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK -	if (col.a < minimum_alpha) +	if (diffcol.a < minimum_alpha)  	{  		discard;  	}  #endif +#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +	diffcol.rgb = pow(diffcol.rgb, vec3(2.2)); +#endif +  #if HAS_SPECULAR_MAP  	vec4 spec = texture2D(specularMap, vary_texcoord2.xy);  #else @@ -103,7 +456,7 @@ void main()  	vec3 tnorm = vary_normal;  #endif -	vec4 final_color = col; +	vec4 final_color = diffcol;  #if DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE  	final_color.a = 0; @@ -121,7 +474,191 @@ void main()  	final_specular.a = specular_color.a;  #endif + +#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +	{ +		//forward rendering, output just lit RGBA +	vec3 pos = vary_position; + +#if HAS_SUN_SHADOW +	float shadow = 0.0; +	 +	vec4 spos = vec4(pos,1.0); +		 +	if (spos.z > -shadow_clip.w) +	{	 +		vec4 lpos; +		 +		vec4 near_split = shadow_clip*-0.75; +		vec4 far_split = shadow_clip*-1.25; +		vec4 transition_domain = near_split-far_split; +		float weight = 0.0; + +		if (spos.z < near_split.z) +		{ +			lpos = shadow_matrix[3]*spos; +			 +			float w = 1.0; +			w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap3, lpos)*w; +			weight += w; +			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); +		} + +		if (spos.z < near_split.y && spos.z > far_split.z) +		{ +			lpos = shadow_matrix[2]*spos; +			 +			float w = 1.0; +			w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +			w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +			shadow += pcfShadow(shadowMap2, lpos)*w; +			weight += w; +		} + +		if (spos.z < near_split.x && spos.z > far_split.y) +		{ +			lpos = shadow_matrix[1]*spos; +			 +			float w = 1.0; +			w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +			w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +			shadow += pcfShadow(shadowMap1, lpos)*w; +			weight += w; +		} + +		if (spos.z > far_split.x) +		{ +			lpos = shadow_matrix[0]*spos; +							 +			float w = 1.0; +			w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +			shadow += pcfShadow(shadowMap0, lpos)*w; +			weight += w; +		} +		 + +		shadow /= weight; +	} +	else +	{ +		shadow = 1.0; +	} +#else +	float shadow = 1.0; +#endif + +		vec4 diffuse = final_color; +		vec3 norm = normalize(tnorm); +		vec4 spec = final_specular; +		float envIntensity = final_normal.z; + +		vec3 col; +		float bloom = 0.0; +		{ +			calcAtmospherics(pos.xyz, 1.0); +	 +			float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); + +			da = pow(da, 0.7); + +			col = atmosAmbient(vec3(0)); +			col += atmosAffectDirectionalLight(max(min(da, shadow), diffuse.a)); +	 +			col *= diffuse.rgb; +	 +			vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + +			if (spec.a > 0.0) // specular reflection +			{ +				// the old infinite-sky shiny reflection +				// +				 +				float sa = dot(refnormpersp, sun_dir.xyz); +				vec3 dumbshiny = vary_SunlitColor*shadow*(texture2D(lightFunc, vec2(sa, spec.a)).r); +							 +				// add the two types of shiny together +				vec3 spec_contrib = dumbshiny * spec.rgb; +				bloom = dot(spec_contrib, spec_contrib) / 6; +				col += spec_contrib; +			} + +			if (envIntensity > 0.0) +			{ +				//add environmentmap +				vec3 env_vec = env_mat * refnormpersp; +				col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb,  +					max(envIntensity-diffuse.a*2.0, 0.0)); +			} +	 +			col = atmosLighting(col); +			col = scaleSoftClip(col); + +			//col = mix(col.rgb, diffuse.rgb, diffuse.a); +		} +	 +		vec3 light_col = vec3(0,0,0); + +		vec3 npos = normalize(-pos.xyz); + +		 +		/*vec3 calcPointLightOrSpotLight( +			vec3 light_col,  +			vec3 npos,  +			vec3 diffuse,  +			vec4 spec,  +			vec3 v,  +			vec3 n,  +			vec4 lp,  +			vec3 ln,  +			float la,  +			float fa,  +			float is_pointlight) + +		*/ + +	/* +#ifdef MAC_GEFORCE_HACK + #define LIGHT_LOOP(i) \ +		light_col += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm, light_position[i], light_direction[i], light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); + +		LIGHT_LOOP(1) +		LIGHT_LOOP(2) +		LIGHT_LOOP(3) +		LIGHT_LOOP(4) +		LIGHT_LOOP(5) +		LIGHT_LOOP(6) +		LIGHT_LOOP(7) +#else*/ +	for (int i = 2; i < 8; i++) +	{ +		light_col += calcPointLightOrSpotLight( +			light_diffuse[i].rgb,  +			npos,  +			diffuse.rgb,  +			final_specular,  +			pos.xyz,  +			norm,  +			light_position[i],  +			light_direction[i],  +			light_attenuation[i].x,  +			light_attenuation[i].y,  +			light_attenuation[i].z); +	} +//#endif + +		col += light_col; +		frag_color.rgb = col; +		 +	} + + +	frag_color.a = diffcol.a*vertex_color.a; + +#else  	frag_data[0] = final_color;  	frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.  	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 88095a81e8..f578795abe 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl @@ -23,7 +23,12 @@   * $/LicenseInfo$   */ -#ifdef HAS_SKIN +#define DIFFUSE_ALPHA_MODE_IGNORE 0 +#define DIFFUSE_ALPHA_MODE_BLEND 1 +#define DIFFUSE_ALPHA_MODE_MASK 2 +#define DIFFUSE_ALPHA_MODE_EMISSIVE 3 + +#if HAS_SKIN  uniform mat4 modelview_matrix;  uniform mat4 projection_matrix;  mat4 getObjectSkinnedTransform(); @@ -32,8 +37,16 @@ uniform mat3 normal_matrix;  uniform mat4 modelview_projection_matrix;  #endif -uniform mat4 texture_matrix0; +#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +#if !HAS_SKIN +uniform mat4 modelview_matrix; +#endif + +VARYING vec3 vary_position; +#endif + +uniform mat4 texture_matrix0;  ATTRIBUTE vec3 position;  ATTRIBUTE vec4 diffuse_color; @@ -64,13 +77,17 @@ VARYING vec2 vary_texcoord0;  void main()  { -#ifdef HAS_SKIN +#if HAS_SKIN  	mat4 mat = getObjectSkinnedTransform();  	mat = modelview_matrix * mat;  	vec3 pos = (mat*vec4(position.xyz,1.0)).xyz; +#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +	vary_position = pos; +#endif +  	gl_Position = projection_matrix*vec4(pos,1.0);  #else @@ -89,7 +106,7 @@ void main()  	vary_texcoord2 = (texture_matrix0 * vec4(texcoord2,0,1)).xy;  #endif -#ifdef HAS_SKIN +#if HAS_SKIN  	vec3 n = normalize((mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz);  #if HAS_NORMAL_MAP  	vec3 b = normalize((mat*vec4(binormal.xyz+position.xyz,1.0)).xyz-pos.xyz); @@ -98,11 +115,10 @@ void main()  	vary_mat0 = vec3(t.x, b.x, n.x);  	vary_mat1 = vec3(t.y, b.y, n.y);  	vary_mat2 = vec3(t.z, b.z, n.z); -#else -	vary_normal  = n; -#endif - -#else +#else //HAS_NORMAL_MAP +vary_normal  = n; +#endif //HAS_NORMAL_MAP +#else //HAS_SKIN  	vec3 n = normalize(normal_matrix * normal);  #if HAS_NORMAL_MAP  	vec3 b = normalize(normal_matrix * binormal); @@ -111,11 +127,16 @@ void main()  	vary_mat0 = vec3(t.x, b.x, n.x);  	vary_mat1 = vec3(t.y, b.y, n.y);  	vary_mat2 = vec3(t.z, b.z, n.z); -#else +#else //HAS_NORMAL_MAP  	vary_normal = n; -#endif - -#endif +#endif //HAS_NORMAL_MAP +#endif //HAS_SKIN  	vertex_color = diffuse_color; + +#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +#if !HAS_SKIN +	vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz; +#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 3bd433c283..db42a54e42 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -125,11 +125,11 @@ void main()  			float fa = light_col[i].a+1.0;  			float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); -			dist_atten *= noise; +			dist_atten = pow(dist_atten, 2.2) * 2.2; -			float lit = pow(da, 0.7) * dist_atten; +			dist_atten *= noise; -			 +			float lit = da * dist_atten;  			vec3 col = light_col[i].rgb*lit*diff; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 959a85330e..50938d3ef9 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -154,6 +154,8 @@ void main()  	}  	vec3 norm = texture2DRect(normalMap, frag.xy).xyz; +	float envIntensity = norm.z; +  	norm = decode_normal(norm.xy);  	norm = normalize(norm); @@ -169,6 +171,7 @@ void main()  	float fa = falloff+1.0;  	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); +	dist_atten = pow(dist_atten, 2.2) * 2.2;  	if (dist_atten <= 0.0)  	{  		discard; @@ -201,7 +204,7 @@ void main()  			vec3 lcol = color.rgb * plcol.rgb * plcol.a; -			lit = pow(da, 0.7) * dist_atten * noise; +			lit = da * dist_atten * noise;  			col = lcol*lit*diff_tex;  			amb_da += (da*0.5)*proj_ambiance; @@ -221,8 +224,33 @@ void main()  	vec4 spec = texture2DRect(specularRect, frag.xy); +	  	if (spec.a > 0.0)  	{ +		float lit = da * dist_atten * noise; +		vec3 npos = -normalize(pos); + +		//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*color.rgb*spec.rgb; +			//col += spec.rgb; +		} +	}	 + +	if (envIntensity > 0.0) +	{  		vec3 ref = reflect(normalize(pos), norm);  		//project from point pos in direction ref to plane proj_p, proj_n @@ -239,8 +267,9 @@ void main()  			{  				stc.xy /= stc.w; -				float fatten = clamp(spec.a*spec.a+spec.a*0.5, 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 && @@ -248,28 +277,7 @@ void main()  					stc.x > 0.0 &&  					stc.y > 0.0)  				{ - -					vec3 npos = -normalize(pos); -					lv = pfinal-pos.xyz; -					lv = normalize(lv); - -					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 (sa > 0.0) -					{ -						float scol = fres * texture2D(lightFunc, vec2(nh, spec.a)).r * gt / (nh * da); -						col += scol*color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod).rgb*spec.rgb; -					} -					 -					//vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); -					//col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb; +					col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*proj_lod).rgb*spec.rgb;										  				}  			}  		} diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index 6976fc7bd9..36406cbf57 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -111,8 +111,9 @@ void main()  	vec3 col = texture2DRect(diffuseRect, frag.xy).rgb;  	float fa = falloff+1.0;  	float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); -	float lit = pow(da, 0.7) * dist_atten * noise; -	 +	dist_atten = pow(dist_atten, 2.2) * 2.2; +	float lit = da * dist_atten * noise; +  	col = color.rgb*lit*col;  	vec4 spec = texture2DRect(specularRect, frag.xy); diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl new file mode 100644 index 0000000000..2d6bce02c9 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -0,0 +1,46 @@ +/**  + * @file postDeferredGammaCorrect.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$ + */ +  +#extension GL_ARB_texture_rectangle : enable + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2DRect diffuseRect; + +uniform vec2 screen_res; +VARYING vec2 vary_fragcoord; + +uniform float texture_gamma; + +void main()  +{ +	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord); +	frag_color = pow(diff, vec4(texture_gamma, texture_gamma, texture_gamma, 1.0)); +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 4b4cb5c8ce..aafa932b8f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -60,6 +60,7 @@ uniform float density_multiplier;  uniform float distance_multiplier;  uniform float max_y;  uniform vec4 glow; +uniform float global_gamma;  uniform float scene_light_strength;  uniform mat3 env_mat;  uniform mat3 ssao_effect_mat; @@ -230,9 +231,9 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {  		  + tmpAmbient)));  	//brightness of surface both sunlight and ambient -	setSunlitColor(vec3(sunlight * .5)); -	setAmblitColor(vec3(tmpAmbient * .25)); -	setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1)); +	setSunlitColor(pow(vec3(sunlight * .5), vec3(global_gamma)) * 3.3); +	setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * 3.3); +	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * 3.3);  }  vec3 atmosLighting(vec3 light) @@ -291,12 +292,9 @@ void main()  	norm.xyz = decode_normal(norm.xy); // unpack norm  	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); -	 -	da = pow(da, 0.7);  	vec4 diffuse = texture2DRect(diffuseRect, tc);  	vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -	  	vec3 col;  	float bloom = 0.0;  	if (diffuse.a < 0.9) @@ -327,7 +325,7 @@ void main()  		if (envIntensity > 0.0)  		{ //add environmentmap  			vec3 env_vec = env_mat * refnormpersp; -			col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb,  +			col = mix(col.rgb, pow(textureCube(environmentMap, env_vec).rgb, vec3(2.2)) * 2.2,   				max(envIntensity-diffuse.a*2.0, 0.0));   		} @@ -343,5 +341,6 @@ void main()  	frag_color.rgb = col; -	frag_color.a = bloom; +	//frag_color.a = bloom; +	frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl index c6031fc45a..b59fcbe017 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl @@ -35,6 +35,6 @@ void main()  	//transform vertex  	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);  	gl_Position = pos;  -		 +	  	vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 918cdce040..56c10e25cc 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -84,6 +84,7 @@ vec3 decode_normal (vec2 enc)  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = pow(ret.rgb, vec3(2.2));  	vec2 dist = tc-vec2(0.5); @@ -99,7 +100,8 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	 +	ret.rgb = pow(ret.rgb, vec3(2.2)); +  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));  	float det = min(lod/(proj_lod*0.5), 1.0); @@ -116,7 +118,8 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	 +	ret.rgb = pow(ret.rgb, vec3(2.2)); +  	vec2 dist = tc-vec2(0.5);  	float d = dot(dist,dist); @@ -172,6 +175,7 @@ void main()  	float fa = falloff+1.0;  	float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); +	dist_atten = pow(dist_atten, 2.2) * 2.2;  	if (dist_atten <= 0.0)  	{  		discard; @@ -204,7 +208,7 @@ void main()  			vec3 lcol = color.rgb * plcol.rgb * plcol.a; -			lit = pow(da, 0.7) * dist_atten * noise; +			lit = da * dist_atten * noise;  			col = lcol*lit*diff_tex;  			amb_da += (da*0.5)*proj_ambiance; @@ -224,6 +228,7 @@ void main()  	vec4 spec = texture2DRect(specularRect, frag.xy); +  	if (spec.a > 0.0)  	{  		vec3 ref = reflect(normalize(pos), norm); | 
