diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 03df4c4ee..265f0c0b9 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -123,6 +123,7 @@ public: DEFERRED_SSAO_FACTOR, DEFERRED_SSAO_FACTOR_INV, DEFERRED_SSAO_EFFECT, + DEFERRED_SSAO_SCALE, DEFERRED_KERN_SCALE, DEFERRED_NOISE_SCALE, DEFERRED_NEAR_CLIP, diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 6c4b437b6..d8a92ccbd 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -52,6 +52,7 @@ uniform float ssao_factor; uniform float ssao_factor_inv; VARYING vec2 vary_fragcoord; +uniform vec2 kern_scale; uniform mat4 inv_proj; uniform vec2 proj_shadow_res; @@ -93,46 +94,37 @@ vec4 getPosition(vec2 pos_screen) return pos; } +float calcShadow( sampler2DShadow shadowMap, vec4 stc, vec2 res, vec2 pos_screen ) +{ + //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/shadow_res.x); //Random dither. + + vec2 off = vec2(1,1.5)/res; + stc.x = floor(stc.x*res.x + fract(pos_screen.y*(1.0/kern_scale.y)*0.5))*off.x; + + + float shadow = shadow2D(shadowMap, stc.xyz).x; // cs + 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*2.0, off.y, 0.0)).x; + shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x; + + return shadow; +} + float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) { stc.xyz /= stc.w; stc.z += shadow_bias; - //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/shadow_res.x); //Random dither. - stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/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; + return calcShadow(shadowMap, stc, shadow_res, pos_screen)*0.2; } float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) { stc.xyz /= stc.w; stc.z += spot_shadow_bias*scl; - //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/proj_shadow_res.x); //Random dither. - 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; + return calcShadow(shadowMap, stc, proj_shadow_res, pos_screen)*0.2; } void main() diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 151ce67e7..e95f1b975 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -50,6 +50,7 @@ uniform vec4 shadow_clip; VARYING vec2 vary_fragcoord; +uniform vec2 ssao_scale; uniform vec2 kern_scale; uniform mat4 inv_proj; @@ -94,47 +95,40 @@ vec4 getPosition(vec2 pos_screen) return pos; } +float calcShadow( sampler2DShadow shadowMap, vec4 stc, vec2 res, vec2 pos_screen ) +{ + //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/shadow_res.x); //Random dither. + + vec2 off = vec2(1,1.5)/res; + stc.x = floor(stc.x*res.x + fract(pos_screen.y*(1.0/kern_scale.y)*0.5))*off.x; + + + float shadow = shadow2D(shadowMap, stc.xyz).x; // cs + 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*2.0, off.y, 0.0)).x; + shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x; + + return shadow; +} + float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) { stc.xyz /= stc.w; stc.z += shadow_bias; - //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/shadow_res.x); //Random dither. - 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; + return calcShadow(shadowMap, stc, shadow_res, pos_screen)*0.2; } float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) { stc.xyz /= stc.w; stc.z += spot_shadow_bias*scl; - //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/proj_shadow_res.x); //Random dither. - 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; + return calcShadow(shadowMap, stc, proj_shadow_res, pos_screen)*0.2; } + void main() { vec2 pos_screen = vary_fragcoord.xy; @@ -244,7 +238,7 @@ void main() } frag_color[0] = shadow; - frag_color[1] = texture2D(diffuseRect,vary_fragcoord.xy * kern_scale).r; + frag_color[1] = texture2D(diffuseRect,vary_fragcoord.xy * ssao_scale).r; spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 6d651267b..8dddfbebe 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7741,7 +7741,7 @@ void LLPipeline::renderDeferredLighting() glClearColor(0,0,0,0); F32 ssao_scale = llclamp(RenderSSAOResolutionScale.get(), .01f, 1.f); - gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_KERN_SCALE, ssao_scale, ssao_scale); + gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SSAO_SCALE, ssao_scale, ssao_scale); //Enable bilinear filtering, as the screen tex resolution may not match current framebuffer resolution. Eg, half-res SSAO // diffuse map should only be found if the sun shader is the SSAO variant. @@ -8320,7 +8320,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) bindDeferredShader(gDeferredSunProgram); F32 ssao_scale = llclamp(RenderSSAOResolutionScale.get(), .01f, 1.f); - gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_KERN_SCALE, ssao_scale, ssao_scale); + gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SSAO_SCALE, ssao_scale, ssao_scale); glClearColor(1,1,1,1); mDeferredLight.clear(GL_COLOR_BUFFER_BIT);