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 | |
| parent | 8bccedd163f1eb25c631e8501bdd468c24e6bf40 (diff) | |
| parent | f9ff68b5e3b016a53fe987e5b51442741ca88f15 (diff) | |
Merge viewer-dev-materials
Diffstat (limited to 'indra')
30 files changed, 971 insertions, 267 deletions
| diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h index df5a45cabd..b294288c64 100644 --- a/indra/llprimitive/llmaterial.h +++ b/indra/llprimitive/llmaterial.h @@ -49,8 +49,11 @@ public:  	typedef enum  	{ -		SHADER_COUNT = 16 +		SHADER_COUNT = 16, +		ALPHA_SHADER_COUNT = 4  	} eShaderCount; + +	  	static const U8			DEFAULT_SPECULAR_LIGHT_EXPONENT = ((U8)(0.2f * 255));  	static const LLColor4U	DEFAULT_SPECULAR_LIGHT_COLOR; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 84b2bde206..eb5c9cc5c0 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8072,7 +8072,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>1</integer> +      <integer>0</integer>      </map>    <key>RenderDebugNormalScale</key>    <map> 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); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl index 6c34643aab..e130ef5d91 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl @@ -30,6 +30,7 @@ out vec4 frag_color;  #endif  uniform float minimum_alpha; +uniform float texture_gamma;  vec3 fullbrightAtmosTransport(vec3 light);  vec3 fullbrightScaleSoftClip(vec3 light); @@ -45,7 +46,7 @@ void fullbright_lighting()  	{  		discard;  	} - +	color.rgb = pow(color.rgb, vec3(texture_gamma));  	color.rgb = fullbrightAtmosTransport(color.rgb);  	color.rgb = fullbrightScaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl index f4477bd29a..56ad658696 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl @@ -30,6 +30,7 @@ out vec4 frag_color;  #endif  uniform float minimum_alpha; +uniform float texture_gamma;  vec3 fullbrightAtmosTransport(vec3 light);  vec3 fullbrightScaleSoftClip(vec3 light); @@ -47,7 +48,7 @@ void fullbright_lighting()  	{  		discard;  	} - +	color.rgb = pow(color.rgb, vec3(texture_gamma));  	color.rgb = fullbrightAtmosTransport(color.rgb);  	color.rgb = fullbrightScaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index da47d60049..59950a88ef 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -25,6 +25,10 @@  #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 @@ -35,9 +39,8 @@ uniform sampler2DShadow shadowMap0;  uniform sampler2DShadow shadowMap1;  uniform sampler2DShadow shadowMap2;  uniform sampler2DShadow shadowMap3; -uniform sampler2DRect depthMap; -#ifndef INDEX_MODE +#if INDEX_MODE != INDEXED  uniform sampler2D diffuseMap;  #endif @@ -53,12 +56,9 @@ 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 @@ -66,19 +66,11 @@ uniform mat4 shadow_matrix[6];  uniform vec4 shadow_clip;  uniform float shadow_bias; -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; -  vec3 calcDirectionalLight(vec3 n, vec3 l)  {          float a = pow(max(dot(n,l),0.0), 0.7); @@ -206,22 +198,19 @@ void main()  	}  	vec4 diff; -#ifdef INDEX_MODE +#if INDEX_MODE == INDEXED	  	diff = diffuseLookup(vary_texcoord0.xy);  #else  	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/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index 45f3946467..dc4dd5d5e9 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -23,6 +23,10 @@   * $/LicenseInfo$   */ +#define INDEXED 1 +#define NON_INDEXED 2 +#define NON_INDEXED_NO_COLOR 3 +  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 projection_matrix; @@ -30,24 +34,20 @@ 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); @@ -65,16 +65,13 @@ 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; @@ -127,7 +124,7 @@ void main()  	vec3 norm;  	//transform vertex -#ifdef HAS_SKIN +#if HAS_SKIN  	mat4 trans = getObjectSkinnedTransform();  	trans = modelview_matrix * trans; @@ -137,8 +134,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); @@ -159,11 +155,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 @@ -174,44 +167,39 @@ void main()  	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); -  	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); -	vary_pointlight_col = diffuse_color.rgb; +	vec3 dff = pow(diffuse_color.rgb, vec3(2.2f,2.2f,2.2f)); + +	vary_pointlight_col = dff;  	col.rgb = vec3(0,0,0);  	// Add windlight lights  	col.rgb = atmosAmbient(col.rgb); -	vary_ambient = col.rgb*diffuse_color.rgb; -	vary_directional.rgb = atmosAffectDirectionalLight(1.0f); +	vary_directional.rgb = atmosAffectDirectionalLight(1); +	vary_ambient = col.rgb*dff; -	col.rgb = col.rgb*diffuse_color.rgb; +	col.rgb = col.rgb*dff; -#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/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 90b6856c5c..cfd50ec1ec 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -166,6 +166,9 @@ void main()  	}  	vec3 norm = texture2DRect(normalMap, frag.xy).xyz; +	 +	float envIntensity = norm.z; +  	norm = decode_normal(norm.xy);  	norm = normalize(norm); @@ -193,7 +196,11 @@ void main()  	vec3 col = vec3(0,0,0);  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -		 +	 +	vec4 spec = texture2DRect(specularRect, frag.xy); + +	 +  	float noise = texture2D(noiseMap, frag.xy/128.0).b;  	if (proj_tc.z > 0.0 &&  		proj_tc.x < 1.0 && @@ -201,11 +208,13 @@ void main()  		proj_tc.x > 0.0 &&  		proj_tc.y > 0.0)  	{ -		float lit = 0.0;  		float amb_da = proj_ambiance; -		 +		float lit = 0.0; +  		if (da > 0.0)  		{ +			lit = da * dist_atten * noise; +  			float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);  			float lod = diff * proj_lod; @@ -213,8 +222,6 @@ void main()  			vec3 lcol = color.rgb * plcol.rgb * plcol.a; -			lit = pow(da,0.7) * dist_atten * noise; -  			col = lcol*lit*diff_tex*shadow;  			amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;  		} @@ -231,10 +238,37 @@ void main()  		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;  	} -	 -	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*shadow; +			//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 @@ -251,7 +285,7 @@ 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); @@ -261,29 +295,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 (nh > 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*shadow*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*shadow; +					col += color.rgb*texture2DLodSpecular(projectionMap, stc.xy, proj_lod-envIntensity*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 5fb22c7f4d..3d39394c32 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/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 vec4 shadow_clip; @@ -233,9 +234,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) @@ -293,7 +294,6 @@ void main()  	float envIntensity = norm.z;  	norm.xyz = decode_normal(norm.xy);  	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); -	da = pow(da, 0.7);  	vec4 diffuse = texture2DRect(diffuseRect, tc); @@ -334,7 +334,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));   		} diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 5fd6f0afb7..87180fd3e4 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -83,6 +83,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); @@ -98,6 +99,7 @@ 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)); @@ -115,6 +117,7 @@ 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); @@ -182,6 +185,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; @@ -214,7 +218,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*shadow;  			amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl index da3d922017..d543479b85 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl @@ -54,6 +54,7 @@ uniform float density_multiplier;  uniform float distance_multiplier;  uniform float max_y;  uniform vec4 glow; +uniform float global_gamma;  void calcAtmospherics(vec3 inPositionEye) { @@ -129,11 +130,17 @@ void calcAtmospherics(vec3 inPositionEye) {  		vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient)  	  + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x  		  + tmpAmbient))); +	 +	float gammaScale = 1.0; +	if (global_gamma > 1.0) +	{ +		gammaScale = global_gamma / 2 + global_gamma; +	}  	//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)) * gammaScale); +	setAmblitColor(pow(vec3(tmpAmbient * .25), vec3(global_gamma)) * gammaScale); +	setAdditiveColor(pow(getAdditiveColor() * vec3(1.0 - temp1), vec3(global_gamma)) * gammaScale);  	// vary_SunlitColor = vec3(0);  	// vary_AmblitColor = vec3(0); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index e9895a6e10..fe058cf094 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -484,7 +484,7 @@ void LLDrawable::makeActive()  	}  	llassert(isAvatar() || isRoot() || mParent->isActive()); -	} +}  void LLDrawable::makeStatic(BOOL warning_enabled) diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 70168c53c0..1912ae0c16 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -152,8 +152,7 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)  		gPipeline.mDeferredDepth.copyContents(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(),  							0, 0, gPipeline.mDeferredDepth.getWidth(), gPipeline.mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);	  		gPipeline.mDeferredDepth.bindTarget(); -		simple_shader = NULL; -		fullbright_shader = NULL; +		simple_shader = fullbright_shader = &gObjectFullbrightAlphaMaskProgram;  		gObjectFullbrightAlphaMaskProgram.bind();  		gObjectFullbrightAlphaMaskProgram.setMinimumAlpha(0.33f);  	} @@ -441,6 +440,13 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  				LLRenderPass::applyModelMatrix(params); +				LLMaterial* mat = NULL; + +				if (deferred_render && !LLPipeline::sUnderWaterRender) +				{ +					mat = params.mMaterial; +				} +  				if (params.mFullbright)  				{  					// Turn off lighting if it hasn't already been so. @@ -473,11 +479,30 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  					light_enabled = TRUE;  				} -				// If we need shaders, and we're not ALREADY using the proper shader, then bind it -				// (this way we won't rebind shaders unnecessarily). -				if(use_shaders && (current_shader != target_shader)) +				if (!params.mFullbright && deferred_render && mat) +				{ +					U32 mask = mat->getShaderMask(); + +					llassert(mask < LLMaterial::SHADER_COUNT); +					target_shader = &(gDeferredMaterialProgram[mask]); + +					if (current_shader != target_shader) +					{ +						gPipeline.bindDeferredShader(*target_shader); +					} +				} +				else if (!params.mFullbright) +				{ +					target_shader = simple_shader; +				} +				else  				{ -					llassert(target_shader != NULL); +					target_shader = fullbright_shader; +				} +				 +				if(use_shaders && (current_shader != target_shader)) +				{// If we need shaders, and we're not ALREADY using the proper shader, then bind it +				// (this way we won't rebind shaders unnecessarily).  					current_shader = target_shader;  					current_shader->bind();  				} @@ -487,7 +512,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  					current_shader = NULL;  				} -				if (params.mMaterial.notNull() && current_shader && (current_shader == simple_shader)) +				if (use_shaders && mat && !params.mFullbright)  				{  					// I apologize in advance for not giving this its own shader.  					// We have a material.  Supply the appropriate data here. @@ -542,12 +567,20 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  						}  					}  				} -				else +				else    				{ //not batching textures or batch has only 1 texture -- might need a texture matrix  					if (params.mTexture.notNull())  					{  						params.mTexture->addTextureStats(params.mVSize); -						gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; +						if (use_shaders && mat) +						{ +							current_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, params.mTexture); +						} +						else +						{ +							gGL.getTexUnit(0)->bind(params.mTexture, TRUE); +						} +						  						if (params.mTextureMatrix)  						{  							tex_setup = true; diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index aa5687f338..612741e57c 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -230,7 +230,7 @@ void LLDrawPoolAvatar::renderDeferred(S32 pass)  S32 LLDrawPoolAvatar::getNumPostDeferredPasses()  { -	return 6; +	return 10;  }  void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass) @@ -254,6 +254,8 @@ void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)  		break;  	case 5:  		beginRiggedGlow(); +	default: +		beginDeferredRiggedMaterialAlpha(pass-6);  		break;  	}  } @@ -280,11 +282,34 @@ void LLDrawPoolAvatar::beginDeferredRiggedAlpha()  	gPipeline.enableLightsDynamic();  } +void LLDrawPoolAvatar::beginDeferredRiggedMaterialAlpha(S32 pass) +{ +	switch (pass) +	{ +	case 0: pass = 1; break; +	case 1: pass = 5; break; +	case 2: pass = 9; break; +	default: pass = 13; break; +	} + +	pass += LLMaterial::SHADER_COUNT; + +	sVertexProgram = &gDeferredMaterialProgram[pass]; + +	gPipeline.bindDeferredShader(*sVertexProgram); +	sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); +	normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP); +	specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP); +	gPipeline.enableLightsDynamic(); +} +  void LLDrawPoolAvatar::endDeferredRiggedAlpha()  {  	LLVertexBuffer::unbind();  	gPipeline.unbindDeferredShader(*sVertexProgram);  	sDiffuseChannel = 0; +	normal_channel = -1; +	specular_channel = -1;  	sVertexProgram = NULL;  } @@ -310,6 +335,9 @@ void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)  	case 5:  		endRiggedGlow();  		break; +	default: +		endDeferredRiggedAlpha(); +		break;  	}  } @@ -333,7 +361,11 @@ void LLDrawPoolAvatar::renderPostDeferred(S32 pass)  		6, //rigged fullbright shiny  		7, //rigged alpha  		8, //rigged fullbright alpha -		9, //rigged glow +		9, //rigged material alpha 1 +		10,//rigged material alpha 2 +		11,//rigged material alpha 3 +		12,//rigged material alpha 4 +		13, //rigged glow  	};  	pass = actual_pass[pass]; @@ -1015,6 +1047,13 @@ void LLDrawPoolAvatar::endDeferredRiggedBump()  void LLDrawPoolAvatar::beginDeferredRiggedMaterial(S32 pass)  { +	if (pass == 1 || +		pass == 5 || +		pass == 9 || +		pass == 13) +	{ //skip alpha passes +		return; +	}  	sVertexProgram = &gDeferredMaterialProgram[pass+LLMaterial::SHADER_COUNT];  	sVertexProgram->bind();  	normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP); @@ -1024,6 +1063,14 @@ void LLDrawPoolAvatar::beginDeferredRiggedMaterial(S32 pass)  void LLDrawPoolAvatar::endDeferredRiggedMaterial(S32 pass)  { +	if (pass == 1 || +		pass == 5 || +		pass == 9 || +		pass == 13) +	{ +		return; +	} +  	LLVertexBuffer::unbind();  	sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);  	sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP); @@ -1211,11 +1258,21 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  	if (is_deferred_render && pass >= 5 && pass <= 21)  	{ -		renderDeferredRiggedMaterial(avatarp, pass-5); +		S32 p = pass-5; + +		if (p != 1 && +			p != 5 && +			p != 9 && +			p != 13) +		{ +			renderDeferredRiggedMaterial(avatarp, p); +		}  		return;  	} + +  	if (pass == 5)  	{  		renderRiggedShinySimple(avatarp); @@ -1228,7 +1285,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  		return;  	} -	if (pass >= 7 && pass < 9) +	if (pass >= 7 && pass < 13)  	{  		if (pass == 7)  		{ @@ -1241,9 +1298,24 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  			renderRiggedFullbrightAlpha(avatarp);  			return;  		} + +		S32 p = 0; +		switch (pass) +		{ +		case 9: p = 1; break; +		case 10: p = 5; break; +		case 11: p = 9; break; +		case 12: p = 13; break; +		} + +		{ +			LLGLEnable blend(GL_BLEND); +			renderDeferredRiggedMaterial(avatarp, p); +		} +		return;  	} -	if (pass == 9) +	if (pass == 13)  	{  		renderRiggedGlow(avatarp); @@ -1543,7 +1615,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  			LLMaterial* mat = face->getTextureEntry()->getMaterialParams().get(); -			if (is_deferred_render && mat) +			if (mat)  			{  				gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP));  				gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP)); diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index b87449fbf6..bb9126c162 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -114,6 +114,7 @@ public:  	void beginRiggedGlow();  	void beginDeferredRiggedAlpha();  	void beginDeferredRiggedMaterial(S32 pass); +	void beginDeferredRiggedMaterialAlpha(S32 pass);  	void endRiggedSimple();  	void endRiggedFullbright(); @@ -124,6 +125,7 @@ public:  	void endRiggedGlow();  	void endDeferredRiggedAlpha();  	void endDeferredRiggedMaterial(S32 pass); +	void endDeferredRiggedMaterialAlpha(S32 pass);  	void beginDeferredRiggedSimple();  	void beginDeferredRiggedBump(); @@ -149,7 +151,7 @@ public:  	void renderDeferredRiggedSimple(LLVOAvatar* avatar);  	void renderDeferredRiggedBump(LLVOAvatar* avatar);  	void renderDeferredRiggedMaterial(LLVOAvatar* avatar, S32 pass); - +	  	typedef enum  	{  		RIGGED_MATERIAL=0, diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 2a2ca74e5d..062808fe53 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -175,9 +175,6 @@ LLGLSLShader			gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;  LLGLSLShader			gDeferredSkinnedDiffuseProgram;  LLGLSLShader			gDeferredSkinnedBumpProgram;  LLGLSLShader			gDeferredSkinnedAlphaProgram; -#if LL_DARWIN -LLGLSLShader			gDeferredSkinnedAlphaProgramMac; -#endif  LLGLSLShader			gDeferredBumpProgram;  LLGLSLShader			gDeferredTerrainProgram;  LLGLSLShader			gDeferredTreeProgram; @@ -203,6 +200,7 @@ LLGLSLShader			gDeferredEmissiveProgram;  LLGLSLShader			gDeferredPostProgram;  LLGLSLShader			gDeferredCoFProgram;  LLGLSLShader			gDeferredDoFCombineProgram; +LLGLSLShader			gDeferredPostGammaCorrectProgram;  LLGLSLShader			gFXAAProgram;  LLGLSLShader			gDeferredPostNoDoFProgram;  LLGLSLShader			gDeferredWLSkyProgram; @@ -1221,8 +1219,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; -		gDeferredSkinnedAlphaProgram.addPermutation("INDEX_MODE_USE_COLOR", "1"); +		gDeferredSkinnedAlphaProgram.addPermutation("INDEX_MODE", "2");  		gDeferredSkinnedAlphaProgram.addPermutation("HAS_SKIN", "1"); +		gDeferredSkinnedAlphaProgram.addPermutation("IS_AVATAR_SKIN", "0");  		success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);  		// Hack to include uniforms for lighting without linking in lighting file @@ -1240,6 +1239,14 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		success = gDeferredBumpProgram.createShader(NULL, NULL);  	} +	gDeferredMaterialProgram[1].mFeatures.hasLighting = false; +	gDeferredMaterialProgram[5].mFeatures.hasLighting = false; +	gDeferredMaterialProgram[9].mFeatures.hasLighting = false; +	gDeferredMaterialProgram[13].mFeatures.hasLighting = false; +	gDeferredMaterialProgram[1+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = false; +	gDeferredMaterialProgram[5+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = false; +	gDeferredMaterialProgram[9+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = false; +	gDeferredMaterialProgram[13+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = false;  	for (U32 i = 0; i < LLMaterial::SHADER_COUNT*2; ++i)  	{ @@ -1256,11 +1263,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  			gDeferredMaterialProgram[i].addPermutation("HAS_NORMAL_MAP", i & 0x8? "1" : "0");  			gDeferredMaterialProgram[i].addPermutation("HAS_SPECULAR_MAP", i & 0x4 ? "1" : "0");  			gDeferredMaterialProgram[i].addPermutation("DIFFUSE_ALPHA_MODE", llformat("%d", alpha_mode)); - +			gDeferredMaterialProgram[i].addPermutation("HAS_SUN_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0");  			bool has_skin = i & 0x10; +			gDeferredMaterialProgram[i].addPermutation("HAS_SKIN",has_skin ? "1" : "0");  			if (has_skin)  			{ -				gDeferredMaterialProgram[i].addPermutation("HAS_SKIN", "1");  				gDeferredMaterialProgram[i].mFeatures.hasObjectSkinning = true;  			} @@ -1268,6 +1275,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		}  	} +	gDeferredMaterialProgram[1].mFeatures.hasLighting = true; +	gDeferredMaterialProgram[5].mFeatures.hasLighting = true; +	gDeferredMaterialProgram[9].mFeatures.hasLighting = true; +	gDeferredMaterialProgram[13].mFeatures.hasLighting = true; +	gDeferredMaterialProgram[1+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = true; +	gDeferredMaterialProgram[5+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = true; +	gDeferredMaterialProgram[9+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = true; +	gDeferredMaterialProgram[13+LLMaterial::SHADER_COUNT].mFeatures.hasLighting = true; + +  	if (success)  	{ diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index e9283d8bad..a3c2adae20 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -351,6 +351,7 @@ extern LLGLSLShader			gDeferredCoFProgram;  extern LLGLSLShader			gDeferredDoFCombineProgram;  extern LLGLSLShader			gFXAAProgram;  extern LLGLSLShader			gDeferredPostNoDoFProgram; +extern LLGLSLShader			gDeferredPostGammaCorrectProgram;  extern LLGLSLShader			gDeferredAvatarShadowProgram;  extern LLGLSLShader			gDeferredAttachmentShadowProgram;  extern LLGLSLShader			gDeferredAlphaProgram; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 75c6480a95..4071e80ca1 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -398,7 +398,7 @@ void validate_framebuffer_object();  bool addDeferredAttachments(LLRenderTarget& target)  { -	return target.addColorAttachment(GL_RGBA) && //specular +	return target.addColorAttachment(GL_SRGB8_ALPHA8) && //specular  			target.addColorAttachment(GL_RGB10_A2); //normal+z  } @@ -9488,7 +9488,6 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  	//currently used for amount to extrude frusta corners for constructing shadow frusta  	LLVector3 n = RenderShadowNearDist; -	(void)n;  	//F32 nearDist[] = { n.mV[0], n.mV[1], n.mV[2], n.mV[2] };  	//put together a universal "near clip" plane for shadow frusta | 
