From a6d6652ff34953c83436643c9dec7f83e9e4142f Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Wed, 10 Aug 2022 14:42:23 -0700 Subject: SL-17763: PBR: Add common spotlight ambiance calcs to deferred utilities --- .../shaders/class1/deferred/deferredUtil.glsl | 31 +++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index ad3a93128d..8ebf09e7da 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -34,6 +34,7 @@ uniform vec3 proj_p; //plane projection is emitting from (in screen space) uniform float proj_focus; // distance from plane to begin blurring uniform float proj_lod ; // (number of mips in proj map) uniform float proj_range; // range between near clip and far clip plane of projection +uniform float proj_ambiance; // light params uniform vec3 color; // light_color @@ -146,6 +147,18 @@ float getDepth(vec2 pos_screen) return depth; } +vec4 getTexture2DLodAmbient(vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + ret.rgb = srgb_to_linear(ret.rgb); + + vec2 dist = tc-vec2(0.5); + float d = dot(dist,dist); + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); + + return ret; +} + vec4 getTexture2DLodDiffuse(vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); @@ -160,8 +173,24 @@ vec4 getTexture2DLodDiffuse(vec2 tc, float lod) return ret; } -// Returns projected light in Linear +// lit This is set by the caller: if (nl > 0.0) { lit = attenuation * nl * noise; } // Uses: +// color Projected spotlight color +vec3 getProjectedLightAmbiance(float amb_da, float attenuation, float lit, float nl, float noise, vec2 projected_uv) +{ + vec4 amb_plcol = getTexture2DLodAmbient(projected_uv, proj_lod); + vec3 amb_rgb = amb_plcol.rgb * amb_plcol.a; + + amb_da += proj_ambiance; + amb_da += (nl*nl*0.5+0.5) * proj_ambiance; + amb_da *= attenuation * noise; + amb_da = min(amb_da, 1.0-lit); + + return (amb_da * color.rgb * amb_rgb); +} + +// Returns projected light in Linear +// Uses global spotlight color: // color // NOTE: projected.a will be pre-multiplied with projected.rgb vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv) -- cgit v1.2.3 From 291350e00f40fab1072a78ea92d5ea5aafcf5d32 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Wed, 10 Aug 2022 16:46:40 -0700 Subject: SL-17763: Cleanup debug infor for lights --- indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl index e6f2c9d02b..87c1ff5517 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl @@ -31,6 +31,7 @@ #define DEBUG_VERTEX 0 #define DEBUG_NORMAL_MAP 0 // Output packed normal map "as is" to diffuse #define DEBUG_NORMAL_OUT 0 // Output unpacked normal to diffuse +#define DEBUG_ORM 0 // Output Occlusion Roughness Metal "as is" to diffuse #define DEBUG_POSITION 0 uniform sampler2D diffuseMap; //always in sRGB space @@ -139,6 +140,9 @@ void main() #if DEBUG_NORMAL_OUT col.rgb = vary_normal; #endif +#if DEBUG_ORM + col.rgb = linear_to_srgb(spec); +#endif #if DEBUG_POSITION col.rgb = vary_position.xyz; #endif -- cgit v1.2.3 From 90bdeddb8f62560e0982e7e4c9917f1a62c7d88f Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Mon, 15 Aug 2022 13:15:25 -0500 Subject: SL-17940 Fix for rigged attachments with PBR materials not rendering. --- indra/newview/app_settings/shaders/class1/deferred/materialV.glsl | 2 +- indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl index 7e29ada205..a1cab87092 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialV.glsl @@ -1,5 +1,5 @@ /** - * @file bumpV.glsl + * @file materialV.glsl * * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl index 82338069a8..a2606ed771 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl @@ -78,24 +78,23 @@ VARYING vec2 vary_texcoord0; void main() { - vec4 pos4 = vec4(position,1.0); #ifdef HAS_SKIN mat4 mat = getObjectSkinnedTransform(); mat = modelview_matrix * mat; - vec3 pos = (mat*pos4).xyz; + vec3 pos = (mat*vec4(position.xyz,1.0)).xyz; #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) vary_position = pos; #endif - gl_Position = projection_matrix*pos4; + gl_Position = projection_matrix*vec4(pos,1.0); #else //transform vertex + gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); - gl_Position = modelview_projection_matrix * pos4; #endif vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -- cgit v1.2.3 From e6171a8d097b2ac0242a29dcd78e297da27d7c97 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Mon, 22 Aug 2022 15:52:43 -0700 Subject: SL-17975: PBR: Add light debugging --- .../shaders/class1/deferred/deferredUtil.glsl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 8ebf09e7da..bb1265802a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -280,6 +280,22 @@ vec2 getScreenXY(vec4 clip) return screen; } +// Color utils + +vec3 colorized_dot(float x) +{ + if (x > 0.0) return vec3( 0, x, 0 ); + if (x < 0.0) return vec3(-x, 0, 0 ); + return vec3( 0, 0, 1 ); +} + +vec3 hue_to_rgb(float hue) +{ + if (hue > 1.0) return vec3(0.5); + vec3 rgb = abs(hue * 6. - vec3(3, 2, 4)) * vec3(1, -1, -1) + vec3(-1, 2, 2); + return clamp(rgb, 0.0, 1.0); +} + // PBR Utils vec3 fresnelSchlick( vec3 reflect0, vec3 reflect90, float vh) -- cgit v1.2.3 From 5e41024b9c02176ccfe292f067fb34f0607e59d5 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Tue, 23 Aug 2022 02:22:03 -0700 Subject: SL-17703: PBR: Move IOR calcF0() to deferred utils --- .../shaders/class1/deferred/deferredUtil.glsl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index bb1265802a..8a3eb39ae7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -298,6 +298,23 @@ vec3 hue_to_rgb(float hue) // PBR Utils +// ior Index of Refraction, normally 1.5 +// returns reflect0 +float calcF0(float ior) +{ + float f0 = (1.0 - ior) / (1.0 + ior); + return f0 * f0; +} + +vec3 fresnel(float vh, vec3 f0, vec3 f90 ) +{ + float x = 1.0 - abs(vh); + float x2 = x*x; + float x5 = x2*x2*x; + vec3 fr = f0 + (f90 - f0)*x5; + return fr; +} + vec3 fresnelSchlick( vec3 reflect0, vec3 reflect90, float vh) { return reflect0 + (reflect90 - reflect0) * pow(clamp(1.0 - vh, 0.0, 1.0), 5.0); -- cgit v1.2.3 From 459faa8f7f93b4a0f83b8862eb6b4679ed3635e6 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Tue, 23 Aug 2022 04:15:36 -0700 Subject: SL-17703: PBR: Clamp roughness to minimum to match Blender, etc. --- .../shaders/class1/deferred/deferredUtil.glsl | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 8a3eb39ae7..46463818f8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -405,23 +405,31 @@ float V_GGX( float nl, float nv, float alphaRough ) return 0.0; } +// NOTE: Assumes a hard-coded IOR = 1.5 void initMaterial( vec3 diffuse, vec3 packedORM, out float alphaRough, out vec3 c_diff, out vec3 reflect0, out vec3 reflect90, out float specWeight ) { float metal = packedORM.b; - c_diff = mix(diffuse.rgb, vec3(0), metal); + c_diff = mix(diffuse, vec3(0), metal); float IOR = 1.5; // default Index Of Refraction 1.5 (dielectrics) reflect0 = vec3(0.04); // -> incidence reflectance 0.04 - reflect0 = mix( reflect0, diffuse.rgb, metal); // reflect at 0 degrees +// reflect0 = vec3(calcF0(IOR)); + reflect0 = mix(reflect0, diffuse, metal); // reflect at 0 degrees reflect90 = vec3(1); // reflect at 90 degrees specWeight = 1.0; - float perceptualRough = packedORM.g; - alphaRough = perceptualRough * perceptualRough; + // When roughness is zero blender shows a tiny specular + float perceptualRough = max(packedORM.g, 0.1); + alphaRough = perceptualRough * perceptualRough; +} + +vec3 BRDFDiffuse(vec3 color) +{ + return color / M_PI; } vec3 BRDFLambertian( vec3 reflect0, vec3 reflect90, vec3 c_diff, float specWeight, float vh ) { - return (1.0 - specWeight * fresnelSchlick( reflect0, reflect90, vh)) * (c_diff / M_PI); + return (1.0 - specWeight * fresnelSchlick( reflect0, reflect90, vh)) * BRDFDiffuse(c_diff); } vec3 BRDFSpecularGGX( vec3 reflect0, vec3 reflect90, float alphaRough, float specWeight, float vh, float nl, float nv, float nh ) -- cgit v1.2.3 From 0079dcd6a451bb356e9197d40181913ddad63e72 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Tue, 23 Aug 2022 04:17:12 -0700 Subject: SL-17766: PBR: Add V_GGX references --- .../shaders/class1/deferred/deferredUtil.glsl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 46463818f8..8ecdafa167 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -392,17 +392,35 @@ float D_GGX( float nh, float alphaRough ) } // NOTE: This is different from the GGX texture +// See: +// Real Time Rendering, 4th Edition +// Page 341 +// Equation 9.43 +// Also see: +// https://google.github.io/filament/Filament.md.html#materialsystem/specularbrdf/geometricshadowing(specularg) +// 4.4.2 Geometric Shadowing (specular G) float V_GGX( float nl, float nv, float alphaRough ) { +#if 1 + // Note: When roughness is zero, has discontuinity in the bottom hemisphere float rough2 = alphaRough * alphaRough; float ggxv = nl * sqrt(nv * nv * (1.0 - rough2) + rough2); float ggxl = nv * sqrt(nl * nl * (1.0 - rough2) + rough2); + float ggx = ggxv + ggxl; if (ggx > 0.0) { return 0.5 / ggx; } return 0.0; +#else + // See: smithVisibility_GGXCorrelated, V_SmithCorrelated, etc. + float rough2 = alphaRough * alphaRough; + float ggxv = nl * sqrt(nv * (nv - rough2 * nv) + rough2); + float ggxl = nv * sqrt(nl * (nl - rough2 * nl) + rough2); + return 0.5 / (ggxv + ggxl); +#endif + } // NOTE: Assumes a hard-coded IOR = 1.5 -- cgit v1.2.3 From 5b7d8b61e0720aee1ef6c7d6e44ada87ca556d54 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Wed, 24 Aug 2022 16:08:36 -0700 Subject: SL-17702: PBR: Optimize BRDF diffuse --- indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 8ecdafa167..d1b9418ee9 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -44,6 +44,7 @@ uniform mat4 inv_proj; uniform vec2 screen_res; const float M_PI = 3.14159265; +const float ONE_OVER_PI = 0.3183098861; vec3 srgb_to_linear(vec3 cs); @@ -442,7 +443,7 @@ void initMaterial( vec3 diffuse, vec3 packedORM, out float alphaRough, out vec3 vec3 BRDFDiffuse(vec3 color) { - return color / M_PI; + return color * ONE_OVER_PI; } vec3 BRDFLambertian( vec3 reflect0, vec3 reflect90, vec3 c_diff, float specWeight, float vh ) -- cgit v1.2.3 From becdf08d0f79a1a676fdc51d5c889dbab5954832 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Wed, 24 Aug 2022 17:21:32 -0700 Subject: SL-17702: PBR: Use legacy attenuation for point lights --- .../app_settings/shaders/class1/deferred/deferredUtil.glsl | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index d1b9418ee9..a49713afce 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -48,6 +48,14 @@ const float ONE_OVER_PI = 0.3183098861; vec3 srgb_to_linear(vec3 cs); +float calcLegacyDistanceAttenuation(float distance, float falloff) +{ + float dist_atten = 1.0 - clamp((distance + falloff)/(1.0 + falloff), 0.0, 1.0); + dist_atten *= dist_atten; + dist_atten *= 2.0; + return dist_atten; +} + // In: // lv unnormalized surface to light vector // n normal of the surface -- cgit v1.2.3 From 980e8c0a396291dab00fce148a3c7e304a541f10 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Wed, 24 Aug 2022 17:26:23 -0700 Subject: DRTVWR-559: Cleanup --- .../app_settings/shaders/class1/deferred/deferredUtil.glsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index a49713afce..777021cd53 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -446,7 +446,7 @@ void initMaterial( vec3 diffuse, vec3 packedORM, out float alphaRough, out vec3 // When roughness is zero blender shows a tiny specular float perceptualRough = max(packedORM.g, 0.1); - alphaRough = perceptualRough * perceptualRough; + alphaRough = perceptualRough * perceptualRough; } vec3 BRDFDiffuse(vec3 color) @@ -461,8 +461,8 @@ vec3 BRDFLambertian( vec3 reflect0, vec3 reflect90, vec3 c_diff, float specWeigh vec3 BRDFSpecularGGX( vec3 reflect0, vec3 reflect90, float alphaRough, float specWeight, float vh, float nl, float nv, float nh ) { - vec3 fresnel = fresnelSchlick( reflect0, reflect90, vh ); - float vis = V_GGX( nl, nv, alphaRough ); - float d = D_GGX( nh, alphaRough ); + vec3 fresnel = fresnelSchlick( reflect0, reflect90, vh ); // Fresnel + float vis = V_GGX( nl, nv, alphaRough ); // Visibility + float d = D_GGX( nh, alphaRough ); // Distribution return specWeight * fresnel * vis * d; } -- cgit v1.2.3 From 8b45dfd477f6aedbf2c835fa276733ce6eba8e9f Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Fri, 26 Aug 2022 15:19:03 -0700 Subject: DRTVWR-559: PBR: Cleanup debug --- indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 777021cd53..833f5d51b6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -291,7 +291,7 @@ vec2 getScreenXY(vec4 clip) // Color utils -vec3 colorized_dot(float x) +vec3 colorize_dot(float x) { if (x > 0.0) return vec3( 0, x, 0 ); if (x < 0.0) return vec3(-x, 0, 0 ); -- cgit v1.2.3 From 55b071dcd7d9f00dd3f489a333ffc6ad48a0bbc9 Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Fri, 26 Aug 2022 15:19:48 -0700 Subject: DRTVWR-559: Cleanup: Preserve note about legacy dist_atten magic number --- indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl | 3 +++ 1 file changed, 3 insertions(+) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 833f5d51b6..68a57d12f0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -52,6 +52,9 @@ float calcLegacyDistanceAttenuation(float distance, float falloff) { float dist_atten = 1.0 - clamp((distance + falloff)/(1.0 + falloff), 0.0, 1.0); dist_atten *= dist_atten; + + // Tweak falloff slightly to match pre-EEP attenuation + // NOTE: this magic number also shows up in a great many other places, search for dist_atten *= to audit dist_atten *= 2.0; return dist_atten; } -- cgit v1.2.3 From 826bd47cc1355844dea7cfc838ba5f685b91251e Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Mon, 29 Aug 2022 14:08:27 -0700 Subject: SL-17703: PBR: Fix default OMR if pbr shader compiled sans HAS_SPECULAR_MAP --- .../app_settings/shaders/class1/deferred/pbropaqueF.glsl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1') diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl index 87c1ff5517..b5c38bba04 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl @@ -104,15 +104,16 @@ void main() tnorm = normalize(tnorm.xyz); norm.xyz = normalize(tnorm.xyz); + // RGB = Occlusion, Roughness, Metal - // default values - // occlusion ? - // roughness 1.0 - // metal 1.0 + // default values, see LLViewerTexture::sDefaultPBRORMImagep + // occlusion 1.0 + // roughness 0.0 + // metal 0.0 #ifdef HAS_SPECULAR_MAP vec3 spec = texture2D(specularMap, vary_texcoord2.xy).rgb; #else - vec3 spec = vec3(1,1,1); + vec3 spec = vec3(1,0,0); #endif spec.g *= roughnessFactor; -- cgit v1.2.3