diff options
| author | Dave Parks <davep@lindenlab.com> | 2013-04-17 01:51:39 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2013-04-17 01:51:39 -0500 | 
| commit | 67af268b785e8a47d7db10aa3a566c269b0f16e3 (patch) | |
| tree | 91ca41223c659e6004352dc5bd9b407aa2b02c13 | |
| parent | c72c3691ecf83875d4ee3e0784b3e76cb4b4633a (diff) | |
NORSPEC-90 Alpha pool hookups for materials.
| -rw-r--r-- | indra/llprimitive/llmaterial.h | 5 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/materialF.glsl | 538 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/materialV.glsl | 25 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl | 3 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl | 15 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolalpha.cpp | 47 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolavatar.cpp | 84 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolavatar.h | 4 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 85 | 
9 files changed, 721 insertions, 85 deletions
| diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h index c2e49985a4..3145891393 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/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 35b176b457..79a06bed2c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -29,11 +29,362 @@  #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 = pow(max(dot(n,l),0.0), 0.7); +	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); +	 +		lit = pow(lit, 0.7); + +		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,11 +425,11 @@ 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;  	} @@ -103,7 +454,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 +472,186 @@ 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; +	 +			if (spec.a > 0.0) // specular reflection +			{ +				// the old infinite-sky shiny reflection +				// +				vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); +				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; + +				//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 6475d8d003..f578795abe 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl @@ -23,6 +23,11 @@   * $/LicenseInfo$   */ +#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; @@ -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; @@ -71,6 +84,10 @@ void main()  	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 @@ -116,4 +133,10 @@ vary_normal  = n;  #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/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 63c819f941..d2b4da89ce 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -339,5 +339,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/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 486e806434..111e88c6e9 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -39,7 +39,6 @@ uniform sampler2DShadow shadowMap0;  uniform sampler2DShadow shadowMap1;  uniform sampler2DShadow shadowMap2;  uniform sampler2DShadow shadowMap3; -uniform sampler2DRect depthMap;  #if INDEX_MODE != INDEXED  uniform sampler2D diffuseMap; @@ -77,10 +76,6 @@ 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) @@ -210,7 +205,6 @@ void main()  	}  #if INDEX_MODE == INDEXED -	  	vec4 diff = diffuseLookup(vary_texcoord0.xy);  #else  	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); @@ -223,11 +217,7 @@ void main()  #endif  	vec3 normal = vary_norm; -	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 l = light_position[0].xyz;  	vec3 dlight = calcDirectionalLight(normal, l);  	     dlight = dlight * vary_directional.rgb * vary_pointlight_col; @@ -260,6 +250,7 @@ void main()  	color.rgb += diff.rgb * vary_pointlight_col * light_col; -	frag_color = color; +	frag_color = vec4(1,0,1,1); +	//frag_color = color;  } diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 31b84bb258..3ce2d4fb1c 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -441,6 +441,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,10 +480,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  				{ +					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).  					llassert(target_shader != NULL);  					current_shader = target_shader;  					current_shader->bind(); @@ -487,7 +514,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  					current_shader = NULL;  				} -				if (params.mMaterial.notNull() && current_shader == simple_shader) +				if (mat && !params.mFullbright)  				{  					// I apologize in advance for not giving this its own shader.  					// We have a material.  Supply the appropriate data here. @@ -549,12 +576,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 0ceb7c6c45..0518c3ac79 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;  	}  } @@ -284,11 +286,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;  } @@ -314,6 +339,9 @@ void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)  	case 5:  		endRiggedGlow();  		break; +	default: +		endDeferredRiggedAlpha(); +		break;  	}  } @@ -337,7 +365,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]; @@ -1019,6 +1051,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); @@ -1028,6 +1067,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); @@ -1215,11 +1262,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); @@ -1232,7 +1289,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  		return;  	} -	if (pass >= 7 && pass < 9) +	if (pass >= 7 && pass < 13)  	{  		if (pass == 7)  		{ @@ -1245,9 +1302,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); @@ -1547,7 +1619,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 eb43141c9b..40027672cc 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; @@ -277,11 +274,16 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gUnderWaterProgram);  	mShaderList.push_back(&gDeferredSunProgram);  	mShaderList.push_back(&gDeferredSoftenProgram); +	mShaderList.push_back(&gDeferredMaterialProgram[1]); +	mShaderList.push_back(&gDeferredMaterialProgram[5]); +	mShaderList.push_back(&gDeferredMaterialProgram[9]); +	mShaderList.push_back(&gDeferredMaterialProgram[13]); +	mShaderList.push_back(&gDeferredMaterialProgram[1+LLMaterial::SHADER_COUNT]); +	mShaderList.push_back(&gDeferredMaterialProgram[5+LLMaterial::SHADER_COUNT]); +	mShaderList.push_back(&gDeferredMaterialProgram[9+LLMaterial::SHADER_COUNT]); +	mShaderList.push_back(&gDeferredMaterialProgram[13+LLMaterial::SHADER_COUNT]);	  	mShaderList.push_back(&gDeferredAlphaProgram);  	mShaderList.push_back(&gDeferredSkinnedAlphaProgram); -#if LL_DARWIN -	mShaderList.push_back(&gDeferredSkinnedAlphaProgramMac); -#endif  	mShaderList.push_back(&gDeferredFullbrightProgram);  	mShaderList.push_back(&gDeferredEmissiveProgram);  	mShaderList.push_back(&gDeferredAvatarEyesProgram); @@ -789,6 +791,9 @@ 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 @@ -799,21 +804,14 @@ 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)  	{  		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); @@ -1088,9 +1086,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSkinnedDiffuseProgram.unload();  		gDeferredSkinnedBumpProgram.unload();  		gDeferredSkinnedAlphaProgram.unload(); -#if LL_DARWIN -		gDeferredSkinnedAlphaProgramMac.unload(); -#endif  		gDeferredBumpProgram.unload();  		gDeferredImpostorProgram.unload();  		gDeferredTerrainProgram.unload(); @@ -1224,8 +1219,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSkinnedAlphaProgram.addPermutation("INDEX_MODE", "2");  		gDeferredSkinnedAlphaProgram.addPermutation("HAS_SKIN", "1");  		gDeferredSkinnedAlphaProgram.addPermutation("IS_AVATAR_SKIN", "0"); -		gDeferredSkinnedAlphaProgram.addPermutation("MAC_GEFORCE_HACK","0"); -		  		success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);  		// Hack to include uniforms for lighting without linking in lighting file @@ -1233,36 +1226,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;  	} -#if LL_DARWIN -	if (success) -	{ -		gDeferredSkinnedAlphaProgramMac.mName = "Deferred Skinned Alpha Shader"; -		gDeferredSkinnedAlphaProgramMac.mFeatures.atmosphericHelpers = true; -		gDeferredSkinnedAlphaProgramMac.mFeatures.hasObjectSkinning = true; -		gDeferredSkinnedAlphaProgramMac.mFeatures.calculatesAtmospherics = true; -		gDeferredSkinnedAlphaProgramMac.mFeatures.hasGamma = true; -		gDeferredSkinnedAlphaProgramMac.mFeatures.hasAtmospherics = true; -		gDeferredSkinnedAlphaProgramMac.mFeatures.calculatesLighting = false; -		gDeferredSkinnedAlphaProgramMac.mFeatures.hasLighting = false; -		gDeferredSkinnedAlphaProgramMac.mFeatures.isAlphaLighting = true; -		gDeferredSkinnedAlphaProgramMac.mFeatures.disableTextureIndex = true; -		gDeferredSkinnedAlphaProgramMac.mShaderFiles.clear(); -		gDeferredSkinnedAlphaProgramMac.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB)); -		gDeferredSkinnedAlphaProgramMac.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); -		gDeferredSkinnedAlphaProgramMac.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; -		gDeferredSkinnedAlphaProgramMac.addPermutation("INDEX_MODE", "2"); -		gDeferredSkinnedAlphaProgramMac.addPermutation("HAS_SKIN", "1"); -		gDeferredSkinnedAlphaProgramMac.addPermutation("IS_AVATAR_SKIN", "0"); -		gDeferredSkinnedAlphaProgramMac.addPermutation("MAC_GEFORCE_HACK","1"); -		 -		success = gDeferredSkinnedAlphaProgramMac.createShader(NULL, NULL); -		 -		// Hack to include uniforms for lighting without linking in lighting file -		gDeferredSkinnedAlphaProgramMac.mFeatures.calculatesLighting = true; -		gDeferredSkinnedAlphaProgramMac.mFeatures.hasLighting = true; -	} -#endif -  	if (success)  	{  		gDeferredBumpProgram.mName = "Deferred Bump Shader"; @@ -1273,6 +1236,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)  	{ @@ -1289,7 +1260,7 @@ 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) @@ -1301,6 +1272,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)  	{ @@ -1435,7 +1416,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAlphaProgram.addPermutation("INDEX_MODE", "1");  		gDeferredAlphaProgram.addPermutation("HAS_SKIN", "0");  		gDeferredAlphaProgram.addPermutation("IS_AVATAR_SKIN", "0"); -		gDeferredAlphaProgram.addPermutation("MAC_GEFORCE_HACK","0");  		success = gDeferredAlphaProgram.createShader(NULL, NULL);  		// Hack @@ -1609,7 +1589,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAvatarAlphaProgram.addPermutation("INDEX_MODE", "3");  		gDeferredAvatarAlphaProgram.addPermutation("HAS_SKIN", "0");  		gDeferredAvatarAlphaProgram.addPermutation("IS_AVATAR_SKIN", "1"); -		gDeferredAvatarAlphaProgram.addPermutation("MAC_GEFORCE_HACK","0");  		success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms); | 
