diff options
| author | Graham Linden <graham@lindenlab.com> | 2019-05-23 09:58:33 -0700 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2019-05-23 09:58:33 -0700 | 
| commit | d0a0eede63fdbd4ba597b86cbfbeb5b394ed2395 (patch) | |
| tree | b84761e659eb528695b781cd973192c4b43634f1 /indra/newview/app_settings/shaders/class1/deferred | |
| parent | 360b3230bbfbda7988eee84a8ed04fa1696ca70a (diff) | |
Add render debug controls for forcing disable of ambient, sun, and local light contributions
(engages AMBIENT_KILL, SUNLIGHT_KILL, and LOCAL_LIGHT_KILL defines in shaders to accomplish
  those tasks as required by each render mode).
Diffstat (limited to 'indra/newview/app_settings/shaders/class1/deferred')
6 files changed, 127 insertions, 128 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 1c826790fb..4a12659d56 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -88,64 +88,49 @@ float getAmbientClamp();  vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, float ambiance)  { -    //get light vector -    vec3 lv = lp.xyz-v; - -    vec4 proj_tc = proj_mat * lp; - -    //get distance -    float d = length(lv); -    float da = 1.0; -    vec3 col = vec3(0); -    if (proj_tc.z < 0 -     || proj_tc.z > 1 -     || proj_tc.x < 0 -     || proj_tc.x > 1 -     || proj_tc.y < 0 -     || proj_tc.y > 1) -    { -        return col; -    } +	//get light vector +	vec3 lv = lp.xyz-v; -    if (d > 0.0 && la > 0.0 && fa > 0.0) -    { -        //normalize light vector -        lv = normalize(lv); -        vec3 norm = normalize(n); +la /= 20.0f; -        da = dot(norm, lv); -        da = clamp(da, 0.0, 1.0); +	//get distance +	float d = length(lv); +	 +	float da = 1.0; -la /= 20.0f; -  -        //distance attenuation -        float dist = d/la; -         -        float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); -        dist_atten *= dist_atten; +	vec3 col = vec3(0); -        if (dist_atten < 0.0) -        { -            return col; -        } +	if (d > 0.0 && la > 0.0 && fa > 0.0) +	{ +		//normalize light vector +		lv = normalize(lv); +	 +		//distance attenuation +		float dist = d/la; +		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +		dist_atten *= dist_atten; +        dist_atten *= 2.0f; + +		// spotlight coefficient. +		float spot = max(dot(-ln, lv), is_pointlight); +		da *= spot*spot; // GL_SPOT_EXPONENT=2 -        // 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);		 -        // to match spotLight (but not multiSpotLight) *sigh* -        float lit = max(da * dist_atten,0.0); +		float lit = max(da * dist_atten,0.0); +ambiance = 0.0f;          float amb_da = ambiance;          if (lit > 0)          {              col = lit * light_col * diffuse;              amb_da += (da*0.5+0.5) * ambiance; -            amb_da += (da*da*0.5 + 0.5) * ambiance;          } +        amb_da += (da*da*0.5 + 0.5) * ambiance;          amb_da *= dist_atten;          amb_da = min(amb_da, 1.0f - lit); -        col.rgb += amb_da * 0.5 * light_col * diffuse; +        col.rgb += amb_da * light_col * diffuse;          // no spec for alpha shader...      } @@ -223,7 +208,6 @@ void main()      vec4 color = vec4(0.0); -    color.rgb = amblit;      color.a   = final_alpha;      float ambient = da; @@ -235,11 +219,16 @@ void main()      vec3 sun_contrib = min(final_da, shadow) * sunlit; +#if !defined(AMBIENT_KILL) +    color.rgb = amblit;      color.rgb *= ambient; +#endif  vec3 post_ambient = color.rgb; +#if !defined(SUNLIGHT_KILL)      color.rgb += sun_contrib; +#endif  vec3 post_sunlight = color.rgb; @@ -257,7 +246,7 @@ vec3 post_atmo = color.rgb;      // to linear!      color.rgb = srgb_to_linear(color.rgb); -   #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_linear.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w * 0.5); +   #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_linear.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w);      LIGHT_LOOP(1)      LIGHT_LOOP(2) @@ -268,7 +257,9 @@ vec3 post_atmo = color.rgb;      LIGHT_LOOP(7)      // sum local light contrib in linear colorspace +#if !defined(LOCAL_LIGHT_KILL)      color.rgb += light.rgb; +#endif      // back to sRGB as we're going directly to the final RT post-deferred gamma correction      color.rgb = linear_to_srgb(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 373727f572..1c0516923e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -88,17 +88,19 @@ float getAmbientClamp();  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, inout float glare, float ambiance)  { -    //get light vector -    vec3 lv = lp.xyz-v; -     -    //get distance -    float d = length(lv); -     -    float da = 1.0; +	vec3 col = vec3(0); + +la /= 20.0f; -    vec3 col = vec3(0,0,0); +	//get light vector +	vec3 lv = lp.xyz-v; +	 +	//get distance +	float d = length(lv); +	 +	float da = 1.0; -    vec4 proj_tc = proj_mat * lp; +    /*vec4 proj_tc = proj_mat * lp;      if (proj_tc.z < 0       || proj_tc.z > 1 @@ -108,77 +110,68 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe       || proj_tc.y > 1)      {          return col; -    } +    }*/ -    if (d > 0.0 && la > 0.0 && fa > 0.0) +	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{ -        //normalize light vector -        lv = normalize(lv); -    -la /= 20.0f; -  -        //distance attenuation -        float dist = d/la; -         -        float dist_atten = (fa > 0) ? clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0) : 1.0f; -        dist_atten *= dist_atten; - -        if (dist_atten <= 0) -        { -            return col; -        } - -        // spotlight coefficient. -        float spot = max(dot(-ln, lv), is_pointlight); - -        //angular attenuation -        da = dot(n, lv); -        da = clamp(da, 0.0, 1.0); - -        da *= spot*spot; // GL_SPOT_EXPONENT=2 - -        float lit = max(da * dist_atten, 0.0); +		//normalize light vector +		lv = normalize(lv); +	 +		//distance attenuation +		float dist = d/la; +		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +		dist_atten *= dist_atten; +        dist_atten *= 2.0f; + +		// 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);          float amb_da = ambiance;          if (lit > 0)          {                          col = light_col*lit*diffuse;              amb_da += (da*0.5 + 0.5) * ambiance; -            amb_da += (da*da*0.5+0.5) * ambiance;          } +        amb_da += (da*da*0.5+0.5) * ambiance;          amb_da *= dist_atten;          amb_da = min(amb_da, 1.0f - lit); -        col.rgb += amb_da * 0.5 * light_col * 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); -                vec3 speccol = lit*scol*light_col.rgb*spec.rgb; +        col.rgb += amb_da * light_col * 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); +				vec3 speccol = lit*scol*light_col.rgb*spec.rgb;                  speccol = clamp(speccol, vec3(0), vec3(1)); -                col += speccol; +				col += speccol; -                float cur_glare = max(speccol.r, speccol.g); -                cur_glare = max(cur_glare, speccol.b); -                glare = max(glare, speccol.r); -                glare += max(cur_glare, 0.0); -            } -        } -    } +				float cur_glare = max(speccol.r, speccol.g); +				cur_glare = max(cur_glare, speccol.b); +				glare = max(glare, speccol.r); +				glare += max(cur_glare, 0.0); +			} +		} +	} -    return max(col, vec3(0.0,0.0,0.0));  +	return max(col, vec3(0.0,0.0,0.0));	  }  #else @@ -321,18 +314,22 @@ void main()      float ambient = da;      ambient *= 0.5;      ambient *= ambient; -  +      float ambient_clamp = getAmbientClamp() + 0.1;      ambient = (1.0 - ambient) * ambient_clamp;      vec3 sun_contrib = min(final_da, shadow) * sunlit; +#if !defined(AMBIENT_KILL)      color.rgb = amblit;      color.rgb *= ambient; +#endif  vec3 post_ambient = color.rgb; +#if !defined(SUNLIGHT_KILL)      color.rgb += sun_contrib; +#endif  vec3 post_sunlight = color.rgb; @@ -398,7 +395,7 @@ vec3 post_atmo = color.rgb;      vec3 light = vec3(0,0,0); - #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w); + #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );          LIGHT_LOOP(1)          LIGHT_LOOP(2) @@ -408,11 +405,12 @@ vec3 post_atmo = color.rgb;          LIGHT_LOOP(6)          LIGHT_LOOP(7) -      glare = min(glare, 1.0);      float al = max(diffuse_linear.a,glare)*vertex_color.a; +#if !defined(LOCAL_LIGHT_KILL)      color.rgb += light.rgb; +#endif      // (only) post-deferred needs inline gamma correction      color.rgb = linear_to_srgb(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 29298d7c07..367680556a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -61,6 +61,11 @@ vec3 getNorm(vec2 pos_screen);  void main()   { +	vec3 out_col = vec3(0,0,0); + +#if defined(LOCAL_LIGHT_KILL) +    discard; +#else  	vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;  	vec3 pos = getPosition(frag.xy).xyz;  	if (pos.z < far_z) @@ -74,7 +79,6 @@ void main()  	vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;  	float noise = texture2D(noiseMap, frag.xy/128.0).b; -	vec3 out_col = vec3(0,0,0);  	vec3 npos = normalize(-pos);  	// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop @@ -130,7 +134,7 @@ void main()  		}  	}  	} -	 +#endif  	frag_color.rgb = out_col;  	frag_color.a = 0.0; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 2dd9c1f057..c81d633880 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -130,6 +130,11 @@ vec4 getPosition(vec2 pos_screen);  void main()   { +	vec3 col = vec3(0,0,0); + +#if defined(LOCAL_LIGHT_KILL) +    discard; +#else  	vec4 frag = vary_fragcoord;  	frag.xyz /= frag.w;  	frag.xyz = frag.xyz*0.5+0.5; @@ -171,7 +176,6 @@ void main()  	lv = normalize(lv);  	float da = dot(norm, lv); -	vec3 col = vec3(0,0,0);  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb;  	vec3 dlit = vec3(0, 0, 0); @@ -267,7 +271,8 @@ void main()  			}  		}  	} -//col.rgb = vec3(0); +#endif +  	frag_color.rgb = col;	  	frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 4ab68eaf3b..c7426788c4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -113,12 +113,16 @@ void main()          vec3 sun_contrib = final_da * sunlit; +#if !defined(AMBIENT_KILL)          color.rgb = amblit;          color.rgb *= ambient; +#endif  vec3 post_ambient = color.rgb; +#if !defined(SUNLIGHT_KILL)          color.rgb += sun_contrib; +#endif  vec3 post_sunlight = color.rgb; diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index c6417fa532..55c740d100 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -129,6 +129,11 @@ vec4 getPosition(vec2 pos_screen);  void main()   { +	vec3 col = vec3(0,0,0); + +#if defined(LOCAL_LIGHT_KILL) +    discard; +#else  	vec4 frag = vary_fragcoord;  	frag.xyz /= frag.w;  	frag.xyz = frag.xyz*0.5+0.5; @@ -142,12 +147,10 @@ void main()  	{  		discard;  	} -	  	vec3 norm = texture2DRect(normalMap, frag.xy).xyz;  	float envIntensity = norm.z;  	norm = getNorm(frag.xy); -	  	norm = normalize(norm);  	float l_dist = -dot(lv, proj_n); @@ -173,14 +176,9 @@ void main()  	lv = normalize(lv);  	float da = dot(norm, lv); -	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;  	vec3 dlit = vec3(0, 0, 0); @@ -216,7 +214,6 @@ void main()  		amb_da = min(amb_da, 1.0-lit);  		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a*diff_tex.rgb;  	} -	  	if (spec.a > 0.0)  	{ @@ -243,7 +240,6 @@ void main()  		}  	}	 -  	if (envIntensity > 0.0)  	{  		vec3 ref = reflect(normalize(pos), norm); @@ -272,7 +268,8 @@ void main()  			}  		}  	} -//col.rgb = vec3(0);	 +#endif +  	frag_color.rgb = col;	  	frag_color.a = 0.0;  } | 
