diff options
| author | Graham Linden <graham@lindenlab.com> | 2018-12-03 15:33:15 -0800 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2018-12-03 15:33:15 -0800 | 
| commit | b6fa72d3c4d02527f6d118eadc9ba1ac48a297f5 (patch) | |
| tree | 8b2025afc4049f0b8238ba994852082675ab25d1 /indra/newview/app_settings/shaders/class2 | |
| parent | 79049c49bd34d58c3a3140d4fc50f586e45f3047 (diff) | |
SL-10055
Modify handling of directional light to prefer sun when it is up but use moon dir/color when it is alone in the sky.
Modify handling of shader in shaders to get some shadowing of ambient and nighttime shadowing.
Diffstat (limited to 'indra/newview/app_settings/shaders/class2')
3 files changed, 115 insertions, 103 deletions
| diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 541122fb18..184ac13b27 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -39,7 +39,7 @@ uniform sampler2DRect normalMap;  uniform sampler2DRect lightMap;  uniform sampler2DRect depthMap;  uniform samplerCube environmentMap; -uniform sampler2D	  lightFunc; +uniform sampler2D     lightFunc;  uniform float blur_size;  uniform float blur_fidelity; @@ -68,13 +68,12 @@ uniform vec4 shadow_clip;  uniform mat3 ssao_effect_mat;  uniform vec3 sun_dir; +uniform vec3 moon_dir;  VARYING vec2 vary_fragcoord;  uniform mat4 inv_proj;  uniform vec2 screen_res; -uniform int no_atmo; -  vec3 srgb_to_linear(vec3 cs);  vec3 linear_to_srgb(vec3 cl);  vec3 decode_normal (vec2 enc); @@ -90,20 +89,20 @@ vec3 fullbrightShinyAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);  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; +    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;  }  vec4 getPosition(vec2 pos_screen)  { //get position in screen space (world units) given window coordinate and depth map -	float depth = texture2DRect(depthMap, pos_screen.xy).r; -	return getPosition_d(pos_screen, depth); +    float depth = texture2DRect(depthMap, pos_screen.xy).r; +    return getPosition_d(pos_screen, depth);  } @@ -113,92 +112,93 @@ vec4 applyWaterFogView(vec3 pos, vec4 color);  void main()   { -	vec2 tc = vary_fragcoord.xy; -	float depth = texture2DRect(depthMap, tc.xy).r; -	vec3 pos = getPosition_d(tc, depth).xyz; -	vec4 norm = texture2DRect(normalMap, tc); -	float envIntensity = norm.z; -	norm.xyz = decode_normal(norm.xy); // unpack norm -		 -	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); - -	float light_gamma = 1.0/1.3; -	da = pow(da, light_gamma); - -	vec4 diffuse = texture2DRect(diffuseRect, tc); - -	//convert to gamma space -	diffuse.rgb = linear_to_srgb(diffuse.rgb); -	 -	vec3 col; -	float bloom = 0.0; -	{ -		vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -		 -		vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; -		scol_ambocc = pow(scol_ambocc, vec2(light_gamma)); - -		float scol = max(scol_ambocc.r, diffuse.a);  -		float ambocc = scol_ambocc.g; +    vec2 tc = vary_fragcoord.xy; +    float depth = texture2DRect(depthMap, tc.xy).r; +    vec3 pos = getPosition_d(tc, depth).xyz; +    vec4 norm = texture2DRect(normalMap, tc); +    float envIntensity = norm.z; +    norm.xyz = decode_normal(norm.xy); // unpack norm +         +    float da_sun  = dot(norm.xyz, normalize(sun_dir.xyz)); +    float da_moon = dot(norm.xyz, normalize(moon_dir.xyz)); +    float da = max(da_sun, da_moon); +          da = clamp(da, 0.0, 1.0); + +    da = pow(da, global_gamma); + +    vec4 diffuse = texture2DRect(diffuseRect, tc); + +    //convert to gamma space +	//diffuse.rgb = linear_to_srgb(diffuse.rgb); + +    vec3 col; +    float bloom = 0.0; +    { +        vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); +         +        vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; +        scol_ambocc = pow(scol_ambocc, vec2(global_gamma)); + +        float scol = max(scol_ambocc.r, diffuse.a);  +        float ambocc = scol_ambocc.g;          vec3 sunlit;          vec3 amblit;          vec3 additive;          vec3 atten; -	 -		calcFragAtmospherics(pos.xyz, ambocc, sunlit, amblit, additive, atten); - -		float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); -		ambient *= 0.5; -		ambient *= ambient; -		ambient = (1.0-ambient); - -		col.rgb = amblit; -		col.rgb *= ambient; -		col += sunlit * min(da, scol); -		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 = sunlit*scol_ambocc.r*(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; -		} -		 -		col = mix(col, diffuse.rgb, diffuse.a); - -		if (envIntensity > 0.0) -		{ //add environmentmap -			vec3 env_vec = env_mat * refnormpersp; -			vec3 refcol = textureCube(environmentMap, env_vec).rgb; -			col = mix(col.rgb, refcol, envIntensity);  -		} -						 -		if (norm.w < 0.5) -		{ -			col = mix(atmosFragLighting(col, additive, atten), fullbrightAtmosTransportFrag(col, additive, atten), diffuse.a); -			col = mix(scaleSoftClipFrag(col), fullbrightScaleSoftClipFrag(col), diffuse.a); -		} - -		#ifdef WATER_FOG -			vec4 fogged = applyWaterFogView(pos.xyz,vec4(col, bloom)); -			col = fogged.rgb; -			bloom = fogged.a; -		#endif - -		col = srgb_to_linear(col); - -		//col = vec3(1,0,1); -		//col.g = envIntensity; -	} -	 -	frag_color.rgb = col; -	frag_color.a = bloom; +     +        calcFragAtmospherics(pos.xyz, ambocc, sunlit, amblit, additive, atten); + +        float ambient = dot(norm.xyz, sun_dir.xyz); +        ambient *= 0.5; +        ambient *= ambient; +        ambient = (1.0-ambient); + +        col.rgb = amblit; +        col.rgb *= min(ambient, max(scol, 0.5)); + +        col += (sunlit * da) * scol; + +        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 = sunlit*scol_ambocc.r*(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; +        } +         +        col = mix(col, diffuse.rgb, diffuse.a); + +        if (envIntensity > 0.0) +        { //add environmentmap +            vec3 env_vec = env_mat * refnormpersp; +            vec3 refcol = textureCube(environmentMap, env_vec).rgb; +            col = mix(col.rgb, refcol, envIntensity);  +        } +                         +        if (norm.w < 0.5) +        { +            col = mix(atmosFragLighting(col, additive, atten), fullbrightAtmosTransportFrag(col, additive, atten), diffuse.a); +            col = mix(scaleSoftClipFrag(col), fullbrightScaleSoftClipFrag(col), diffuse.a); +        } + +        #ifdef WATER_FOG +            vec4 fogged = applyWaterFogView(pos.xyz,vec4(col, bloom)); +            col = fogged.rgb; +            bloom = fogged.a; +        #endif + +        //col = srgb_to_linear(col); + +    } +    frag_color.rgb = col; +    frag_color.a = bloom;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index aa5e99a2f7..f2d04c95fe 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -59,6 +59,7 @@ uniform mat4 inv_proj;  uniform vec2 screen_res;  uniform vec2 proj_shadow_res;  uniform vec3 sun_dir; +uniform vec3 moon_dir;  uniform vec2 shadow_res;  uniform float shadow_bias; @@ -138,11 +139,16 @@ void main()  		return;  	}*/ -	float shadow = 0.0; -	float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz)); -	 +	float shadow  = 0.0; +	float dp_sun  = dot(norm, normalize(sun_dir.xyz)); +	float dp_moon = dot(norm, normalize(moon_dir.xyz)); +	float dp_directional_light = max(dp_sun, dp_moon); +        dp_directional_light = clamp(dp_directional_light, 0.0, 1.0); + +        vec3 light_direction = (dp_moon > dp_sun) ? moon_dir : sun_dir;	 +  	vec3 shadow_pos = pos.xyz; -	vec3 offset = sun_dir.xyz * (1.0-dp_directional_light); +	vec3 offset = light_direction.xyz * (1.0-dp_directional_light);  	vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 58f3f2f91e..fd3256e9c8 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -59,6 +59,7 @@ uniform mat4 inv_proj;  uniform vec2 screen_res;  uniform vec2 proj_shadow_res;  uniform vec3 sun_dir; +uniform vec3 moon_dir;  uniform vec2 shadow_res; @@ -200,10 +201,15 @@ void main()  	}*/  	float shadow = 0.0; -	float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz)); -	 +	float dp_sun = dot(norm, normalize(sun_dir.xyz)); +	float dp_moon = dot(norm, normalize(moon_dir.xyz)); +	float dp_directional_light = max(dp_sun, dp_moon); +	dp_directional_light = max(0.0, dp_directional_light); + +        vec3 light_direction = (dp_moon > dp_sun) ? moon_dir : sun_dir;	 +  	vec3 shadow_pos = pos.xyz; -	vec3 offset = sun_dir.xyz * (1.0-dp_directional_light); +	vec3 offset = light_direction.xyz * (1.0-dp_directional_light);  	vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); | 
