diff options
9 files changed, 174 insertions, 156 deletions
| diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 191c9862f0..594edd43d5 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -280,6 +280,7 @@ void LLGLSLShader::unload()  	mTexture.clear();  	mUniform.clear();  	mShaderFiles.clear(); +	mDefines.clear();  	if (mProgramObject)  	{ diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index d175d2b518..9f1fdb4385 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -35,7 +35,7 @@ out vec4 frag_color;  #define frag_color gl_FragColor  #endif -#if INDEX_MODE != INDEXED +#ifdef USE_DIFFUSE_TEX  uniform sampler2D diffuseMap;  #endif @@ -52,7 +52,7 @@ VARYING vec3 vary_pointlight_col;  VARYING vec2 vary_texcoord0;  VARYING vec3 vary_norm; -#if INDEX_MODE != NON_INDEXED_NO_COLOR +#ifdef USE_VERTEX_COLOR  VARYING vec4 vertex_color;  #endif @@ -104,16 +104,18 @@ void main()  	vec4 pos = vec4(vary_position, 1.0); -#if INDEX_MODE == INDEXED +#ifdef USE_INDEXED_TEX  	vec4 diff = diffuseLookup(vary_texcoord0.xy);  #else  	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);  #endif -	diff.rgb = pow(diff.rgb, vec3(2.2)); -#if INDEX_MODE == NON_INDEXED_NO_COLOR -	float vertex_color_alpha = 1.0; + +	diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f)); + +#ifdef USE_VERTEX_COLOR +	float vertex_color_alpha = vertex_color.a;	  #else -	float vertex_color_alpha = vertex_color.a; +	float vertex_color_alpha = 1.0;  #endif  	vec3 normal = vary_norm;  diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 6a1bfd5bef..a8efd3e95b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -34,25 +34,31 @@ uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix;  ATTRIBUTE vec3 position; -#if INDEX_MODE == INDEXED + +#ifdef USE_INDEXED_TEX  void passTextureIndex();  #endif +  ATTRIBUTE vec3 normal; -#if INDEX_MODE != NON_INDEXED_NO_COLOR + +#ifdef USE_VERTEX_COLOR  ATTRIBUTE vec4 diffuse_color;  #endif +  ATTRIBUTE vec2 texcoord0; -#if HAS_SKIN +#ifdef HAS_SKIN  mat4 getObjectSkinnedTransform(); -#elif IS_AVATAR_SKIN +#else +#ifdef IS_AVATAR_SKIN  mat4 getSkinnedTransform();  #endif +#endif  vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);  void calcAtmospherics(vec3 inPositionEye); -float calcDirectionalLight(vec3 n, vec3 l); +vec3 calcDirectionalLight(vec3 n, vec3 l);  vec3 atmosAmbient(vec3 light);  vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -65,7 +71,7 @@ VARYING vec3 vary_fragcoord;  VARYING vec3 vary_position;  VARYING vec3 vary_pointlight_col; -#if INDEX_MODE != NON_INDEXED_NO_COLOR +#ifdef USE_VERTEX_COLOR  VARYING vec4 vertex_color;  #endif @@ -80,13 +86,13 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; -float calcDirectionalLight(vec3 n, vec3 l) +vec3 calcDirectionalLight(vec3 n, vec3 l)  {          float a = max(dot(n,l),0.0); -        return a; +        return vec3(a,a,a);  } -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)  {  	//get light vector  	vec3 lv = lp.xyz-v; @@ -113,7 +119,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= max(dot(n, lv), 0.0);		  	} -	return da;	 +	return vec3(da,da,da);	  }  void main() @@ -122,7 +128,7 @@ void main()  	vec3 norm;  	//transform vertex -#if HAS_SKIN +#ifdef HAS_SKIN  	mat4 trans = getObjectSkinnedTransform();  	trans = modelview_matrix * trans; @@ -132,7 +138,9 @@ void main()  	norm = normalize((trans * vec4(norm, 1.0)).xyz - pos.xyz);  	vec4 frag_pos = projection_matrix * pos;  	gl_Position = frag_pos; -#elif IS_AVATAR_SKIN +#else + +#ifdef IS_AVATAR_SKIN  	mat4 trans = getSkinnedTransform();  	vec4 pos_in = vec4(position.xyz, 1.0);  	pos.x = dot(trans[0], pos_in); @@ -154,7 +162,9 @@ void main()  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  #endif -#if INDEX_MODE == INDEXED +#endif + +#ifdef USE_INDEXED_TEX  	passTextureIndex();  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;  #else @@ -166,36 +176,41 @@ void main()  	calcAtmospherics(pos.xyz); -#if INDEX_MODE == NON_INDEXED_NO_COLOR +#ifndef USE_VERTEX_COLOR  	vec4 diffuse_color = vec4(1,1,1,1);  #endif  	//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));  	vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); -	vec3 diff = pow(diffuse_color.rgb, vec3(2.2)); -	 -	vary_pointlight_col = diff; +	vary_pointlight_col = diffuse_color.rgb;  	col.rgb = vec3(0,0,0);  	// Add windlight lights -	col.rgb = atmosAmbient(vec3(0.)); +	col.rgb = atmosAmbient(col.rgb); -	vary_ambient = col.rgb*diff; -	vary_directional.rgb = atmosAffectDirectionalLight(1); +	vary_ambient = col.rgb*diffuse_color.rgb; + +	vary_directional.rgb = atmosAffectDirectionalLight(1.0f); -	col.rgb = col.rgb*diff; -#if INDEX_MODE != NON_INDEXED_NO_COLOR +	col.rgb = col.rgb*diffuse_color.rgb; +	 +#ifdef USE_VERTEX_COLOR  	vertex_color = col;  #endif -#if HAS_SKIN +#ifdef HAS_SKIN  	vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); -#elif IS_AVATAR_SKIN +#else + +#ifdef IS_AVATAR_SKIN  	vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);  #else  	pos = modelview_projection_matrix * vert;  	vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);  #endif +#endif +  } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 5e75cc3ce6..b3c1a067ee 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -29,7 +29,8 @@  #define DIFFUSE_ALPHA_MODE_EMISSIVE 3 -#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) +  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_color;  #else @@ -349,29 +350,32 @@ vec3 atmosGetDiffuseSunlightColor()  vec3 scaleDownLight(vec3 light)  { -	return (light / scene_light_strength ); +	return (light / vec3(scene_light_strength, scene_light_strength, scene_light_strength));  }  vec3 scaleUpLight(vec3 light)  { -	return (light * scene_light_strength); +	return (light * vec3(scene_light_strength, scene_light_strength, scene_light_strength));  }  vec3 atmosAmbient(vec3 light)  { -	return getAmblitColor() + light / 2.0; +	return getAmblitColor() + (light * vec3(0.5f, 0.5f, 0.5f));  }  vec3 atmosAffectDirectionalLight(float lightIntensity)  { -	return getSunlitColor() * lightIntensity; +	return getSunlitColor() * vec3(lightIntensity, lightIntensity, lightIntensity);  }  vec3 scaleSoftClip(vec3 light)  {  	//soft clip effect: -	light = 1. - clamp(light, vec3(0.), vec3(1.)); -	light = 1. - pow(light, gamma.xxx); +    vec3 zeroes = vec3(0.0f, 0.0f, 0.0f); +    vec3 ones   = vec3(1.0f, 1.0f, 1.0f); + +	light = ones - clamp(light, zeroes, ones); +	light = ones - pow(light, gamma.xxx);  	return light;  } @@ -399,7 +403,7 @@ VARYING vec2 vary_texcoord2;  uniform float env_intensity;  uniform vec4 specular_color; -#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)  uniform float minimum_alpha;  #endif @@ -426,14 +430,14 @@ void main()  	vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy);  	diffcol.rgb *= vertex_color.rgb; -#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)  	if (diffcol.a < minimum_alpha)  	{  		discard;  	}  #endif -#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)  	diffcol.rgb = pow(diffcol.rgb, vec3(2.2));  #endif @@ -456,9 +460,12 @@ void main()  	vec3 tnorm = vary_normal;  #endif +    norm.xyz = tnorm; +    norm.xyz = normalize(norm.xyz); +  	vec4 final_color = diffcol; -#if DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE +#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE)  	final_color.a = 0;  #endif @@ -475,8 +482,7 @@ void main()  #endif -#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND -	{ +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)  		//forward rendering, output just lit RGBA  	vec3 pos = vary_position; @@ -549,26 +555,27 @@ void main()  	float shadow = 1.0;  #endif +	spec = final_specular;  		vec4 diffuse = final_color; -		vec3 norm = normalize(tnorm); -		vec4 spec = final_specular;  		float envIntensity = final_normal.z; -		vec3 col; +    vec3 col = vec3(0.0f,0.0f,0.0f); +  		float bloom = 0.0; -		{  			calcAtmospherics(pos.xyz, 1.0); -			float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); +	vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); -			da = pow(da, 0.7); +	float da =dot(norm.xyz, sun_dir.xyz); +    float final_da = pow(da, 0.7f); +          final_da = min(final_da, shadow); +          final_da = max(final_da, diffuse.a); +          final_da = max(final_da, 0.0f); -			col = atmosAmbient(vec3(0)); -			col += atmosAffectDirectionalLight(max(min(da, shadow), diffuse.a)); -	 -			col *= diffuse.rgb; +	col.rgb = atmosAmbient(col); +	col.rgb = col.rgb + atmosAffectDirectionalLight(final_da); +	col.rgb *= diffuse.rgb; -			vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));  			if (spec.a > 0.0) // specular reflection  			{ @@ -595,33 +602,10 @@ void main()  			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); +	col.rgb = col.rgb + calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z);  		LIGHT_LOOP(1)  		LIGHT_LOOP(2) @@ -630,34 +614,19 @@ void main()  		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.rgb = col.rgb;  	frag_color.a = diffcol.a*vertex_color.a;  #else  	frag_data[0] = final_color; + +#ifdef UGLY_MAC_HACK +	// magic spec exp clamp fixes rendering artifacts on older mac GF drivers +	// +	final_specular = min(final_specular, vec4(1.0f, 1.0f, 1.0f, 0.125f)); +#endif +  	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 f578795abe..0638dcfa55 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl @@ -37,7 +37,8 @@ uniform mat3 normal_matrix;  uniform mat4 modelview_projection_matrix;  #endif -#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) +  #if !HAS_SKIN  uniform mat4 modelview_matrix;  #endif @@ -84,7 +85,7 @@ void main()  	vec3 pos = (mat*vec4(position.xyz,1.0)).xyz; -#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)  	vary_position = pos;  #endif @@ -134,7 +135,7 @@ vary_normal  = n;  	vertex_color = diffuse_color; -#if DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)  #if !HAS_SKIN  	vary_position = (modelview_matrix*vec4(position.xyz, 1.0)).xyz;  #endif diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index db58c19057..73c85c0419 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -25,10 +25,6 @@  #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 @@ -40,7 +36,7 @@ uniform sampler2DShadow shadowMap1;  uniform sampler2DShadow shadowMap2;  uniform sampler2DShadow shadowMap3; -#if INDEX_MODE != INDEXED +#ifdef USE_DIFFUSE_TEX  uniform sampler2D diffuseMap;  #endif @@ -58,7 +54,7 @@ VARYING vec3 vary_pointlight_col;  VARYING vec2 vary_texcoord0;  VARYING vec3 vary_norm; -#if INDEX_MODE != NON_INDEXED_NO_COLOR +#ifdef USE_VERTEX_COLOR  VARYING vec4 vertex_color;  #endif @@ -198,20 +194,23 @@ void main()  	}  	vec4 diff; -#if INDEX_MODE == INDEXED	 + +#ifdef USE_INDEXED_TEX  	diff = diffuseLookup(vary_texcoord0.xy); -#else +#endif + +#ifdef USE_DIFFUSE_TEX  	diff = texture2D(diffuseMap,vary_texcoord0.xy);  #endif -	diff.rgb = pow(diff.rgb, vec3(2.2)); -#if INDEX_MODE == NON_INDEXED_NO_COLOR +	diff.rgb = pow(diff.rgb, vec3(2.2f, 2.2f, 2.2f)); +  	float vertex_color_alpha = 1.0; -#else -	float vertex_color_alpha = vertex_color.a; + +#ifdef USE_VERTEX_COLOR +	vertex_color_alpha = vertex_color.a;	  #endif  	vec3 normal = vary_norm; -	  	vec3 l = light_position[0].xyz;  	vec3 dlight = calcDirectionalLight(normal, l);  	     dlight = dlight * vary_directional.rgb * vary_pointlight_col; @@ -220,9 +219,9 @@ void main()  	vec4 color = diff * col;  	color.rgb = atmosLighting(color.rgb); -  	color.rgb = scaleSoftClip(color.rgb); -	col = vec4(0,0,0,0); + +	col = vec4(0.0f,0.0f,0.0f,0.0f);    #define LIGHT_LOOP(i) \  		col.rgb += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, normal, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index 46fd8da4f8..127c1709b8 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -23,10 +23,6 @@   * $/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; @@ -34,25 +30,31 @@ uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix;  ATTRIBUTE vec3 position; -#if INDEX_MODE == INDEXED + +#ifdef USE_INDEXED_TEX  void passTextureIndex();  #endif +  ATTRIBUTE vec3 normal; -#if INDEX_MODE != NON_INDEXED_NO_COLOR + +#ifdef USE_VERTEX_COLOR  ATTRIBUTE vec4 diffuse_color;  #endif +  ATTRIBUTE vec2 texcoord0; -#if HAS_SKIN +#ifdef HAS_SKIN  mat4 getObjectSkinnedTransform(); -#elif IS_AVATAR_SKIN +#else +#ifdef IS_AVATAR_SKIN  mat4 getSkinnedTransform();  #endif +#endif  vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);  void calcAtmospherics(vec3 inPositionEye); -float calcDirectionalLight(vec3 n, vec3 l); +vec3 calcDirectionalLight(vec3 n, vec3 l);  vec3 atmosAmbient(vec3 light);  vec3 atmosAffectDirectionalLight(float lightIntensity); @@ -65,12 +67,11 @@ VARYING vec3 vary_fragcoord;  VARYING vec3 vary_position;  VARYING vec3 vary_pointlight_col; -#if INDEX_MODE != NON_INDEXED_NO_COLOR +#ifdef USE_VERTEX_COLOR  VARYING vec4 vertex_color;  #endif  VARYING vec2 vary_texcoord0; -  VARYING vec3 vary_norm;  uniform float near_clip; @@ -82,13 +83,13 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; -float calcDirectionalLight(vec3 n, vec3 l) +vec3 calcDirectionalLight(vec3 n, vec3 l)  {          float a = max(dot(n,l),0.0); -        return a; +        return vec3(a,a,a);  } -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)  {  	//get light vector  	vec3 lv = lp.xyz-v; @@ -115,7 +116,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= max(dot(n, lv), 0.0);		  	} -	return da;	 +	return vec3(da,da,da);	  }  void main() @@ -124,7 +125,7 @@ void main()  	vec3 norm;  	//transform vertex -#if HAS_SKIN +#ifdef HAS_SKIN  	mat4 trans = getObjectSkinnedTransform();  	trans = modelview_matrix * trans; @@ -134,7 +135,9 @@ void main()  	norm = normalize((trans * vec4(norm, 1.0)).xyz - pos.xyz);  	vec4 frag_pos = projection_matrix * pos;  	gl_Position = frag_pos; -#elif IS_AVATAR_SKIN +#else + +#ifdef IS_AVATAR_SKIN  	mat4 trans = getSkinnedTransform();  	vec4 pos_in = vec4(position.xyz, 1.0);  	pos.x = dot(trans[0], pos_in); @@ -156,7 +159,9 @@ void main()  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  #endif -#if INDEX_MODE == INDEXED +#endif + +#ifdef USE_INDEXED_TEX  	passTextureIndex();  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;  #else @@ -169,37 +174,42 @@ void main()  	calcAtmospherics(pos.xyz); -#if INDEX_MODE == NON_INDEXED_NO_COLOR +#ifndef USE_VERTEX_COLOR  	vec4 diffuse_color = vec4(1,1,1,1);  #endif  	//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));  	vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); -	vec3 dff = pow(diffuse_color.rgb, vec3(2.2)); +	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(vec3(0.)); +	col.rgb = atmosAmbient(col.rgb); -	vary_directional.rgb = atmosAffectDirectionalLight(1); +	vary_directional.rgb = atmosAffectDirectionalLight(1.0f);  	vary_ambient = col.rgb*dff;  	col.rgb = col.rgb*dff; -#if INDEX_MODE != NON_INDEXED_NO_COLOR +#ifdef USE_VERTEX_COLOR  	vertex_color = col;  #endif -#if HAS_SKIN +#ifdef HAS_SKIN  	vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); -#elif IS_AVATAR_SKIN +#else + +#ifdef IS_AVATAR_SKIN  	vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);  #else  	pos = modelview_projection_matrix * vert;  	vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);  #endif + +#endif +  } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index edd1546263..850bf9677c 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -792,9 +792,6 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  	// Load basic dependency shaders first  	// All of these have to load for any shaders to function -#if LL_DARWIN // Mac can't currently handle all 8 lights,  -	S32 sum_lights_class = 2; -#else   	S32 sum_lights_class = 3;  	// class one cards will get the lower sum lights @@ -805,7 +802,6 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  	{  		sum_lights_class = 2;  	} -#endif  	// If we have sun and moon only checked, then only sum those lights.  	if (gPipeline.getLightingDetail() == 0) @@ -813,6 +809,14 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  		sum_lights_class = 1;  	} +#if LL_DARWIN +	// Work around driver crashes on older Macs when using deferred rendering +	// NORSPEC-59 +	// +	if (gGLManager.mIsMobileGF) +		sum_lights_class = 3; +#endif +	  	// Use the feature table to mask out the max light level to use.  Also make sure it's at least 1.  	S32 max_light_class = gSavedSettings.getS32("RenderShaderLightingMaxLevel");  	sum_lights_class = llclamp(sum_lights_class, 1, max_light_class); @@ -1218,9 +1222,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", "2"); +		gDeferredSkinnedAlphaProgram.addPermutation("USE_DIFFUSE_TEX", "1"); +		gDeferredSkinnedAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1");  		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 @@ -1265,6 +1269,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  			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 LL_DARWIN +			// include spec exp clamp to fix older mac rendering artifacts +			// +			if (gGLManager.mIsMobileGF) +			{ +				gDeferredMaterialProgram[i].addPermutation("UGLY_MAC_HACK","1"); +			} +		#endif +  			if (has_skin)  			{  				gDeferredMaterialProgram[i].mFeatures.hasObjectSkinning = true; @@ -1414,9 +1428,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAlphaProgram.mShaderFiles.clear();  		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); -		gDeferredAlphaProgram.addPermutation("INDEX_MODE", "1"); -		gDeferredAlphaProgram.addPermutation("HAS_SKIN", "0"); -		gDeferredAlphaProgram.addPermutation("IS_AVATAR_SKIN", "0"); +		gDeferredAlphaProgram.addPermutation("USE_INDEXED_TEX", "1"); +		gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1");  		gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];  		success = gDeferredAlphaProgram.createShader(NULL, NULL); @@ -1592,8 +1605,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAvatarAlphaProgram.mShaderFiles.clear();  		gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); -		gDeferredAvatarAlphaProgram.addPermutation("INDEX_MODE", "3"); -		gDeferredAvatarAlphaProgram.addPermutation("HAS_SKIN", "0"); +		gDeferredAvatarAlphaProgram.addPermutation("USE_DIFFUSE_TEX", "1");  		gDeferredAvatarAlphaProgram.addPermutation("IS_AVATAR_SKIN", "1");  		gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f861f49296..f5b8244509 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -4336,6 +4336,15 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)  		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	} +#if LL_DARWIN +    // blatant hack to avoid driver crash on rendering mMeshLODs for eyelashes and baked hair below +    // NORSPEC-59 +    if (gGLManager.mIsMobileGF) +    { +        return num_indices; +    } +#endif +  	if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender)  	{  		if (LLPipeline::sImpostorRender) | 
