diff options
| author | Graham Linden <graham@lindenlab.com> | 2019-01-04 13:26:47 -0800 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2019-01-04 13:26:47 -0800 | 
| commit | c007e1197c521a1b48736cbba29e7c7dadf39c20 (patch) | |
| tree | 331dd4eeefc52461d104353c0a17e6d999c945cd /indra/newview/app_settings/shaders/class2/deferred | |
| parent | c55fa2cf13aa8841296d6c3f6441d165875c65b6 (diff) | |
Convert to using shared shadow sampling function (reduce duplicated code blocks in several shaders).
Diffstat (limited to 'indra/newview/app_settings/shaders/class2/deferred')
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl | 203 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl | 201 | 
2 files changed, 23 insertions, 381 deletions
| diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 5f8f3114a1..fc5756beef 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -35,208 +35,27 @@ out vec4 frag_color;  //class 2, shadows, no SSAO -uniform sampler2DRect depthMap; -uniform sampler2DRect normalMap; -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; -uniform sampler2DShadow shadowMap4; -uniform sampler2DShadow shadowMap5; - -  // Inputs -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform float ssao_radius; -uniform float ssao_max_radius; -uniform float ssao_factor; -uniform float ssao_factor_inv; -  VARYING vec2 vary_fragcoord; -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; -uniform float shadow_offset; - -uniform float spot_shadow_bias; -uniform float spot_shadow_offset;  vec3 getNorm(vec2 pos_screen); +vec3 decode_normal (vec2 enc);  vec4 getPosition(vec2 pos_screen); -float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen); -float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen); - -float pcfShadowLegacy(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) -{ -	stc.xyz /= stc.w; -	stc.z += shadow_bias; - -	stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/shadow_res.x; // add some 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(-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; - -			 -    return shadow*0.2; -} - -float pcfSpotShadowLegacy(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) -{ -	stc.xyz /= stc.w; -	stc.z += spot_shadow_bias*scl; -	stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap - -	float cs = shadow2D(shadowMap, stc.xyz).x; -	float shadow = cs; - -	vec2 off = 1.0/proj_shadow_res; -	off.y *= 1.5; -	 -	shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x; -	shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x; -	shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x; -	shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, -off.y, 0.0)).x; - -        return shadow*0.2; -} +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); +float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen);  void main()   { -	vec2 pos_screen = vary_fragcoord.xy; -	 -	//try doing an unproject here -	 -	vec4 pos  = getPosition(pos_screen);	 -	vec3 norm = getNorm(pos_screen); -		 -	/*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL -	{ -		frag_color = vec4(0.0); // doesn't matter -		return; -	}*/ -	 -	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 = light_direction.xyz * (1.0-dp_directional_light); -	 -	vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); -	 -	if (spos.z > -shadow_clip.w) -	{	 -		if (dp_directional_light == 0.0) -		{ -			// if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup -			shadow = 0.0; -		} -		else -		{ -			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 += pcfShadowLegacy(shadowMap3, lpos, 0.25, pos_screen)*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 += pcfShadowLegacy(shadowMap2, lpos, 0.5, pos_screen)*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 += pcfShadowLegacy(shadowMap1, lpos, 0.75, pos_screen)*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 += pcfShadowLegacy(shadowMap0, lpos, 1.0, pos_screen)*w; -				weight += w; -			} -		 - -			shadow /= weight; - -			// take the most-shadowed value out of these two: -			//  * the blurred sun shadow in the light (shadow) map -			//  * an unblurred dot product between the sun and this norm -			// the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting -			shadow = min(shadow, dp_directional_light); -			 -			//lpos.xy /= lpos.w*32.0; -			//if (fract(lpos.x) < 0.1 || fract(lpos.y) < 0.1) -			//{ -			//	shadow = 0.0; -			//} -			 -		} -	} -	else -	{ -		// more distant than the shadow map covers -		shadow = 1.0; -	} -	 -	frag_color[0] = shadow; -	frag_color[1] = 1.0; -	 -	spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0); -	 -	//spotlight shadow 1 -	vec4 lpos = shadow_matrix[4]*spos; -	frag_color[2] = pcfSpotShadowLegacy(shadowMap4, lpos, 0.8, pos_screen);  -	 -	//spotlight shadow 2 -	lpos = shadow_matrix[5]*spos; -	frag_color[3] = pcfSpotShadowLegacy(shadowMap5, lpos, 0.8, pos_screen);  - -	//frag_color.rgb = pos.xyz; -	//frag_color.b = shadow; +    vec2 pos_screen = vary_fragcoord.xy; +    vec4 pos        = getPosition(pos_screen); +    vec3 norm       = getNorm(pos_screen); + +    frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen); +    frag_color.g = 1.0f; +    frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);  +    frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 10ef1785da..390f9fc947 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -34,202 +34,25 @@ out vec4 frag_color;  //class 2 -- shadows and SSAO -uniform sampler2DRect depthMap; -uniform sampler2DRect normalMap; -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; -uniform sampler2DShadow shadowMap4; -uniform sampler2DShadow shadowMap5; - +// Inputs  VARYING vec2 vary_fragcoord; -uniform mat4 inv_proj; -uniform vec2 screen_res; -uniform vec2 proj_shadow_res; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform vec2 shadow_res; -uniform float shadow_bias; -uniform float shadow_offset; -uniform float spot_shadow_bias; -uniform float spot_shadow_offset; - -uniform vec3 sun_dir; -uniform vec3 moon_dir; - +vec3 decode_normal (vec2 enc);  vec4 getPosition(vec2 pos_screen);  vec3 getNorm(vec2 pos_screen); +float sampleDirectionalShadow(vec3 shadow_pos, vec3 norm, vec2 pos_screen); +float sampleSpotShadow(vec3 shadow_pos, vec3 norm, int index, vec2 pos_screen);  float calcAmbientOcclusion(vec4 pos, vec3 norm, vec2 pos_screen); -float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen); -float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen); - - -float pcfShadowLegacy(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) -{ -	stc.xyz /= stc.w; -	stc.z += shadow_bias; - -	stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/shadow_res.x; -	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; -} - -float pcfSpotShadowLegacy(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) -{ -	stc.xyz /= stc.w; -	stc.z += spot_shadow_bias*scl; -	stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap -		 -	float cs = shadow2D(shadowMap, stc.xyz).x; -	float shadow = cs; - -	vec2 off = 1.0/proj_shadow_res; -	off.y *= 1.5; -	 -	shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x; -	shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x; -	shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x; -	shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, -off.y, 0.0)).x; - -        return shadow*0.2; -}  void main()   { -	vec2 pos_screen = vary_fragcoord.xy; -	 -	//try doing an unproject here -	 -	vec4 pos  = getPosition(pos_screen); -	vec3 norm = getNorm(pos_screen); -		 -	/*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL -	{ -		frag_color = vec4(0.0); // doesn't matter -		return; -	}*/ -	 -	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 = max(0.0, dp_directional_light); - -        vec3 light_direction = (dp_moon > dp_sun) ? moon_dir : sun_dir;	 - -	vec3 shadow_pos = pos.xyz; -	vec3 offset = light_direction.xyz * (1.0-dp_directional_light); -	 -	vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); -	 -	if (spos.z > -shadow_clip.w) -	{	 -		if (dp_directional_light == 0.0) -		{ -			// if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup -			shadow = 0.0; -		} -		else -		{ -			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 += pcfShadowLegacy(shadowMap3, lpos, 0.25, pos_screen)*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 += pcfShadowLegacy(shadowMap2, lpos, 0.5, pos_screen)*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 += pcfShadowLegacy(shadowMap1, lpos, 0.75, pos_screen)*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 += pcfShadowLegacy(shadowMap0, lpos, 1.0, pos_screen)*w; -				weight += w; -			} -		 - -			shadow /= weight; - -			// take the most-shadowed value out of these two: -			//  * the blurred sun shadow in the light (shadow) map -			//  * an unblurred dot product between the sun and this norm -			// the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting -			shadow = min(shadow, dp_directional_light); -			 -			//lpos.xy /= lpos.w*32.0; -			//if (fract(lpos.x) < 0.1 || fract(lpos.y) < 0.1) -			//{ -			//	shadow = 0.0; -			//} -			 -		} -	} -	else -	{ -		// more distant than the shadow map covers -		shadow = 1.0; -	} -	 -	frag_color[0] = shadow; -	frag_color[1] = calcAmbientOcclusion(pos, norm, pos_screen); -	 -	spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0); -	 -	//spotlight shadow 1 -	vec4 lpos = shadow_matrix[4]*spos; -	frag_color[2] = pcfSpotShadow(shadowMap4, lpos, 0.8, pos_screen); -	 -	//spotlight shadow 2 -	lpos = shadow_matrix[5]*spos; -	frag_color[3] = pcfSpotShadow(shadowMap5, lpos, 0.8, pos_screen); - -	//frag_color.rgb = pos.xyz; -	//frag_color.b = shadow; +    vec2 pos_screen = vary_fragcoord.xy; +    vec4 pos  = getPosition(pos_screen); +    vec3 norm = getNorm(pos_screen); + +    frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen); +    frag_color.g = calcAmbientOcclusion(pos, norm, pos_screen); +    frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen); +    frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);  } | 
