diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 48 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl | 32 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 14 | 
3 files changed, 89 insertions, 5 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index ef1a7b670f..c25fba8a1c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6469,6 +6469,54 @@      <real>0.01</real>    </map> +  <key>RenderShadowBiasError</key> +  <map> +    <key>Comment</key> +    <string>Error scale for shadow bias (based on altitude).</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>0</real> +  </map> +  <key>RenderShadowOffsetError</key> +  <map> +    <key>Comment</key> +    <string>Error scale for shadow offset (based on altitude).</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>0</real> +  </map> +   +  <key>RenderSpotShadowBias</key> +  <map> +    <key>Comment</key> +    <string>Bias value for shadows (prevent shadow acne).</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>-0.008</real> +  </map> +  <key>RenderSpotShadowOffset</key> +  <map> +    <key>Comment</key> +    <string>Offset value for shadows (prevent shadow acne).</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>0.01</real> +  </map> + +   +      <key>RenderShadowResolutionScale</key>    <map>      <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 04c9a4d19a..4974bbef9e 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -41,6 +41,9 @@ uniform vec2 proj_shadow_res;  uniform float shadow_bias;  uniform float shadow_offset; +uniform float spot_shadow_bias; +uniform float spot_shadow_offset; +  vec4 getPosition(vec2 pos_screen)  {  	float depth = texture2DRect(depthMap, pos_screen.xy).a; @@ -72,6 +75,24 @@ float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)  	//return shadow;  } +float pcfSpotShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +{ +	stc.xyz /= stc.w; +	stc.z += spot_shadow_bias*scl; +	 +	float cs = shadow2DRect(shadowMap, stc.xyz).x; +	float shadow = cs; + +	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs); +	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs); +	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs); +	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs); +			 +	return shadow/5.0; +	 +	//return shadow; +} +  float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)  {  	stc.xyz /= stc.w; @@ -114,7 +135,10 @@ void main()  	float shadow = 1.0;  	float dp_directional_light = max(0.0, dot(norm, vary_light.xyz)); -	vec4 spos = vec4(pos.xyz + displace*norm + vary_light.xyz * (1.0-dp_directional_light)*shadow_offset, 1.0); +	vec3 shadow_pos = pos.xyz + displace*norm; +	vec3 offset = vary_light.xyz * (1.0-dp_directional_light); +	 +	vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);  	if (spos.z > -shadow_clip.w)  	{	 @@ -176,13 +200,15 @@ void main()  	gl_FragColor[0] = shadow;  	gl_FragColor[1] = 1.0; +	spos.xyz = shadow_pos*offset*spot_shadow_offset; +	  	//spotlight shadow 1  	vec4 lpos = shadow_matrix[4]*spos; -	gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.8).x;  +	gl_FragColor[2] = pcfSpotShadow(shadowMap4, lpos, 0.8).x;   	//spotlight shadow 2  	lpos = shadow_matrix[5]*spos; -	gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.8).x;  +	gl_FragColor[3] = pcfSpotShadow(shadowMap5, lpos, 0.8).x;   	//gl_FragColor.rgb = pos.xyz;  	//gl_FragColor.b = shadow; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index efb99061ab..432b0c86b2 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -5839,8 +5839,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  } +static LLFastTimer::DeclareTimer FTM_BIND_DEFERRED("Bind Deferred"); +  void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRenderTarget* gi_source, LLRenderTarget* last_gi_post, U32 noise_map)  { +	LLFastTimer t(FTM_BIND_DEFERRED); +  	if (noise_map == 0xFFFFFFFF)  	{  		noise_map = mNoiseMap; @@ -6178,10 +6182,16 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen  								matrix_nondiag, matrix_nondiag, matrix_diag};  	shader.uniformMatrix3fv("ssao_effect_mat", 1, GL_FALSE, ssao_effect_mat); +	F32 shadow_offset_error = 1.f + gSavedSettings.getF32("RenderShadowOffsetError") * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]); +	F32 shadow_bias_error = 1.f + gSavedSettings.getF32("RenderShadowBiasError") * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]); +  	shader.uniform2f("screen_res", mDeferredScreen.getWidth(), mDeferredScreen.getHeight());  	shader.uniform1f("near_clip", LLViewerCamera::getInstance()->getNear()*2.f); -	shader.uniform1f ("shadow_offset", gSavedSettings.getF32("RenderShadowOffset")); -	shader.uniform1f("shadow_bias", gSavedSettings.getF32("RenderShadowBias")); +	shader.uniform1f ("shadow_offset", gSavedSettings.getF32("RenderShadowOffset")*shadow_offset_error); +	shader.uniform1f("shadow_bias", gSavedSettings.getF32("RenderShadowBias")*shadow_bias_error); +	shader.uniform1f ("spot_shadow_offset", gSavedSettings.getF32("RenderSpotShadowOffset")); +	shader.uniform1f("spot_shadow_bias", gSavedSettings.getF32("RenderSpotShadowBias"));	 +  	shader.uniform1f("lum_scale", gSavedSettings.getF32("RenderLuminanceScale"));  	shader.uniform1f("sun_lum_scale", gSavedSettings.getF32("RenderSunLuminanceScale"));  	shader.uniform1f("sun_lum_offset", gSavedSettings.getF32("RenderSunLuminanceOffset")); | 
