diff options
author | Dave Parks <davep@lindenlab.com> | 2022-10-06 18:40:01 -0500 |
---|---|---|
committer | Dave Parks <davep@lindenlab.com> | 2022-10-06 18:40:01 -0500 |
commit | 9448db5d4af7bba094e5bc51f85e5c2491d3f5a1 (patch) | |
tree | 98e3c28316a892512ecf26661a564c8a81832a39 /indra/newview/app_settings/shaders/class1 | |
parent | 2b28fecf4893e103e99328e5b4a13c607498396d (diff) |
SL-18190 Water shader WIP. Better parallax correction for sphere probes. Reduce probe memory footprint. Remove framebuffer copies and move to deprecate stencil buffer usage.
Diffstat (limited to 'indra/newview/app_settings/shaders/class1')
4 files changed, 41 insertions, 16 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 1c2034de69..2ec859fdae 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -179,6 +179,13 @@ vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensi return packedNormalEnvIntensityFlags; } +// get linear depth value given a depth buffer sample d and znear and zfar values +float linearDepth(float d, float znear, float zfar) +{ + d = d * 2.0 - 1.0; + return znear * 2.0 * zfar / (zfar + znear - d * (zfar - znear)); +} + float getDepth(vec2 pos_screen) { float depth = texture2DRect(depthMap, pos_screen).r; diff --git a/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl b/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl index 63e2fce40f..b633813819 100644 --- a/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl @@ -177,10 +177,10 @@ float computeLod(float pdf) return lod; } -vec3 filterColor(vec3 N) +vec4 filterColor(vec3 N) { //return textureLod(uCubeMap, N, 3.0).rgb; - vec3 color = vec3(0.f); + vec4 color = vec4(0.f); float weight = 0.0f; for(int i = 0; i < u_sampleCount; ++i) @@ -198,7 +198,7 @@ vec3 filterColor(vec3 N) lod = clamp(lod, 0, 7); // sample lambertian at a lower resolution to avoid fireflies - vec3 lambertian = textureLod(reflectionProbes, vec4(H, sourceIdx), lod).rgb; + vec4 lambertian = textureLod(reflectionProbes, vec4(H, sourceIdx), lod); color += lambertian; } @@ -212,16 +212,16 @@ vec3 filterColor(vec3 N) color /= float(u_sampleCount); } - return color.rgb ; + return color; } // entry point void main() { - vec3 color = vec3(0); + vec4 color = vec4(0); color = filterColor(vary_dir); - frag_color = vec4(color,1.0); + frag_color = color; } diff --git a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl index bb4a79247d..f4879b52de 100644 --- a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl @@ -26,11 +26,7 @@ /*[EXTRA_CODE_HERE]*/ -#ifdef DEFINE_GL_FRAGCOLOR out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif uniform samplerCubeArray reflectionProbes; uniform int sourceIdx; @@ -122,11 +118,11 @@ float D_GGX(float dotNH, float roughness) return (alpha2)/(PI * denom*denom); } -vec3 prefilterEnvMap(vec3 R) +vec4 prefilterEnvMap(vec3 R) { vec3 N = R; vec3 V = R; - vec3 color = vec3(0.0); + vec4 color = vec4(0.0); float totalWeight = 0.0; float envMapDim = 256.0; int numSamples = 4; @@ -157,7 +153,7 @@ vec3 prefilterEnvMap(vec3 R) // Biased (+1.0) mip level for better result float mip = roughness == 0.0 ? 0.0 : clamp(0.5 * log2(omegaS / omegaP) + 1.0, 0.0f, 7.f); //float mip = clamp(0.5 * log2(omegaS / omegaP) + 1.0, 0.0f, 7.f); - color += textureLod(reflectionProbes, vec4(L,sourceIdx), mip).rgb * dotNL; + color += textureLod(reflectionProbes, vec4(L,sourceIdx), mip) * dotNL; totalWeight += dotNL; } @@ -168,6 +164,6 @@ vec3 prefilterEnvMap(vec3 R) void main() { vec3 N = normalize(vary_dir); - frag_color = vec4(prefilterEnvMap(N), 1.0); + frag_color = prefilterEnvMap(N); } // ============================================================================================================= diff --git a/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl b/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl index e8452a9c14..9dd97a80b2 100644 --- a/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl @@ -33,10 +33,20 @@ out vec4 frag_color; #define frag_color gl_FragColor #endif -uniform sampler2DRect screenMap; +// NOTE screenMap should always be texture channel 0 and +// depthmap should always be channel 1 +uniform sampler2DRect diffuseRect; +uniform sampler2DRect depthMap; + +uniform float resScale; +uniform float znear; +uniform float zfar; VARYING vec2 vary_texcoord0; +// get linear depth value given a depth buffer sample d and znear and zfar values +float linearDepth(float d, float znear, float zfar); + void main() { #if 0 @@ -74,6 +84,18 @@ void main() frag_color = vec4(color, 1.0); #else - frag_color = vec4(texture2DRect(screenMap, vary_texcoord0.xy).rgb, 1.0); + vec2 depth_tc = vary_texcoord0.xy * resScale; + float depth = texture(depthMap, depth_tc).r; + float dist = linearDepth(depth, znear, zfar); + + // convert linear depth to distance + vec3 v; + v.xy = depth_tc / 512.0 * 2.0 - 1.0; + v.z = 1.0; + v = normalize(v); + dist /= v.z; + + vec3 col = texture2DRect(diffuseRect, vary_texcoord0.xy).rgb; + frag_color = vec4(col, dist/256.0); #endif } |