diff options
| author | Rye Mutt <rye@alchemyviewer.org> | 2024-04-21 20:40:13 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-21 19:40:13 -0500 | 
| commit | f1b7e806eb30a343876036eff5caef7c03309aa6 (patch) | |
| tree | 7c84e5e1d44e4df2fb3ebf1dfa28ceb54c78390d /indra/newview/app_settings/shaders/class3/deferred | |
| parent | e361671018068000a8b63b3cdc2ad87468def9a3 (diff) | |
Fix sampling normals from gbuffer and cleanup redundant gbuffer samples (#1294)
* Fix sampling normals from gbuffer and cleanup redundant gbuffer samples
* Allow negative normals in gbuffer to fix broken material rendering
Diffstat (limited to 'indra/newview/app_settings/shaders/class3/deferred')
8 files changed, 23 insertions, 31 deletions
| diff --git a/indra/newview/app_settings/shaders/class3/deferred/hazeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/hazeF.glsl index 0b154e82ad..4af57e3b80 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/hazeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/hazeF.glsl @@ -33,7 +33,7 @@ uniform vec3 moon_dir;  uniform int  sun_up_factor;  in vec2 vary_fragcoord; -vec3 getNorm(vec2 pos_screen); +vec4 getNorm(vec2 pos_screen);  vec4 getPositionWithDepth(vec2 pos_screen, float depth);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); @@ -53,8 +53,7 @@ void main()      vec2  tc           = vary_fragcoord.xy;      float depth        = getDepth(tc.xy);      vec4  pos          = getPositionWithDepth(tc, depth); -    vec4  norm         = texture(normalMap, tc); -    norm.xyz           = getNorm(tc); +    vec4  norm         = getNorm(tc);      vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir;      vec3  color = vec3(0); diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index d49db4b74d..2a20eb79d2 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -415,7 +415,7 @@ void main()      frag_data[0] = max(vec4(diffcol.rgb, emissive), vec4(0));        // gbuffer is sRGB for legacy materials      frag_data[1] = max(vec4(spec.rgb, glossiness), vec4(0));           // XYZ = Specular color. W = Specular exponent. -    frag_data[2] = max(vec4(norm, flag), vec4(0));   // XY = Normal.  Z = Env. intensity. W = 1 skip atmos (mask off fog) +    frag_data[2] = vec4(norm, flag);   // XY = Normal.  Z = Env. intensity. W = 1 skip atmos (mask off fog)      frag_data[3] = vec4(env, 0, 0, 0);  #endif diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl index ec8168465e..edfd6cbced 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl @@ -48,7 +48,7 @@ in vec4 vary_fragcoord;  void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist);  float calcLegacyDistanceAttenuation(float distance, float falloff);  vec4 getPosition(vec2 pos_screen); -vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity); +vec4 getNorm(vec2 screenpos);  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip);  vec3 srgb_to_linear(vec3 c); @@ -74,9 +74,8 @@ void main()          discard;      } -    float envIntensity; // not used for this shader -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG() +    vec4 norm = getNorm(tc); // need `norm.w` for GET_GBUFFER_FLAG() +    vec3 n = norm.xyz;      vec4 spec    = texture(specularRect, tc);      vec3 diffuse = texture(diffuseRect, tc).rgb; diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl index 31af1208bd..60be9f4407 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl @@ -52,7 +52,7 @@ uniform vec4 viewport;  void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist);  float calcLegacyDistanceAttenuation(float distance, float falloff); -vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity); +vec4 getNorm(vec2 screenpos);  vec4 getPosition(vec2 pos_screen);  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip); @@ -72,9 +72,8 @@ void main()      vec2 tc          = getScreenCoord(vary_fragcoord);      vec3 pos         = getPosition(tc).xyz; -    float envIntensity; -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG() +    vec4 norm = getNorm(tc); // need `norm.w` for GET_GBUFFER_FLAG() +    vec3 n = norm.xyz;      vec3 diffuse = texture(diffuseRect, tc).rgb;      vec4 spec    = texture(specularRect, tc); diff --git a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl index dbf20fe2d8..deb276ef9d 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflPostF.glsl @@ -40,14 +40,13 @@ uniform sampler2D specularRect;  uniform sampler2D diffuseRect;  uniform sampler2D diffuseMap; -vec3 getNorm(vec2 screenpos); +vec4 getNorm(vec2 screenpos);  float getDepth(vec2 pos_screen);  float linearDepth(float d, float znear, float zfar);  float linearDepth01(float d, float znear, float zfar);  vec4 getPositionWithDepth(vec2 pos_screen, float depth);  vec4 getPosition(vec2 pos_screen); -vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity);  float random (vec2 uv); @@ -57,9 +56,7 @@ void main()  {      vec2  tc = vary_fragcoord.xy;      float depth = linearDepth01(getDepth(tc), zNear, zFar); -    float envIntensity; -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG() +    vec4 norm = getNorm(tc); // need `norm.w` for GET_GBUFFER_FLAG()      vec3 pos = getPositionWithDepth(tc, getDepth(tc)).xyz;      vec4 spec    = texture(specularRect, tc);      vec2 hitpixel; @@ -84,7 +81,7 @@ void main()      vec4 collectedColor = vec4(0); -    float w = tapScreenSpaceReflection(4, tc, pos, n, collectedColor, diffuseMap, 0); +    float w = tapScreenSpaceReflection(4, tc, pos, norm.xyz, collectedColor, diffuseMap, 0);      collectedColor.rgb *= specCol.rgb; diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index f71f8a028f..96c32734e4 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -61,7 +61,7 @@ in vec2 vary_fragcoord;  uniform mat4 inv_proj;  uniform vec2 screen_res; -vec3 getNorm(vec2 pos_screen); +vec4 getNorm(vec2 pos_screen);  vec4 getPositionWithDepth(vec2 pos_screen, float depth);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); @@ -128,14 +128,13 @@ void main()      vec2  tc           = vary_fragcoord.xy;      float depth        = getDepth(tc.xy);      vec4  pos          = getPositionWithDepth(tc, depth); -    vec4  norm         = texture(normalMap, tc); +    vec4  norm         = getNorm(tc);      vec3 colorEmissive = texture(emissiveRect, tc).rgb;      float envIntensity = colorEmissive.r; -    norm.xyz           = getNorm(tc);      vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir;      vec4 baseColor     = texture(diffuseRect, tc); -    vec4 spec        = texture(specularRect, vary_fragcoord.xy); // NOTE: PBR linear Emissive +    vec4 spec        = texture(specularRect, tc); // NOTE: PBR linear Emissive  #if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)      vec2 scol_ambocc = texture(lightMap, vary_fragcoord.xy).rg; @@ -170,7 +169,7 @@ void main()      if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))      { -        vec3 orm = texture(specularRect, tc).rgb;  +        vec3 orm = spec.rgb;           float perceptualRoughness = orm.g;          float metallic = orm.b;          float ao = orm.r; @@ -193,12 +192,12 @@ void main()      else if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_HDRI))      {          // actual HDRI sky, just copy color value -        color = texture(emissiveRect, tc).rgb; +        color = colorEmissive.rgb;      }      else if (GET_GBUFFER_FLAG(GBUFFER_FLAG_SKIP_ATMOS))      {          //should only be true of WL sky, port over base color value and scale for fake HDR -        color = texture(emissiveRect, tc).rgb; +        color = colorEmissive.rgb;          color = srgb_to_linear(color);          color *= sky_hdr_scale;      } diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl index d31b37fb60..319fa86148 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl @@ -72,7 +72,7 @@ uniform mat4 inv_proj;  void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist);  float calcLegacyDistanceAttenuation(float distance, float falloff);  bool clipProjectedLightVars(vec3 center, vec3 pos, out float dist, out float l_dist, out vec3 lv, out vec4 proj_tc ); -vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity); +vec4 getNorm(vec2 screenpos);  vec3 getProjectedLightAmbiance(float amb_da, float attenuation, float lit, float nl, float noise, vec2 projected_uv);  vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv );  vec2 getScreenCoord(vec4 clip); @@ -121,9 +121,8 @@ void main()          shadow = clamp(shadow, 0.0, 1.0);              } -    float envIntensity; -    vec3 n; -    vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); +    vec4 norm = getNorm(tc); +    vec3 n = norm.xyz;      float dist_atten = calcLegacyDistanceAttenuation(dist, falloff);      if (dist_atten <= 0.0) @@ -145,7 +144,6 @@ void main()      if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))      { -        vec3 colorEmissive = texture(emissiveRect, tc).rgb;           vec3 orm = spec.rgb;          float perceptualRoughness = orm.g;          float metallic = orm.b; @@ -182,6 +180,8 @@ void main()      }      else      { +        float envIntensity = texture(emissiveRect, tc).r; +          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); diff --git a/indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl index f6b8299f91..f6bef1e498 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/waterHazeF.glsl @@ -56,7 +56,6 @@ void main()      }      vec4  pos          = getPositionWithDepth(tc, depth); -    vec4  norm         = texture(normalMap, tc);      vec4 fogged = getWaterFogView(pos.xyz); | 
