diff options
| author | Dave Parks <davep@lindenlab.com> | 2022-09-17 15:48:55 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2022-09-17 15:48:55 -0500 | 
| commit | b2553fc8b46e44dd74b2840e041b3cf46d2b39fc (patch) | |
| tree | ad6846532a3fc9707e59354d48ecbe3cf8a21885 /indra | |
| parent | 48eea4de0a9304cd25af46defb52cb0adeeb87c4 (diff) | |
Fix for spotlights in background not matching foreground.  Remove some unused functions.
Diffstat (limited to 'indra')
4 files changed, 15 insertions, 147 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index d1c476792a..0b97ee43e3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -494,88 +494,9 @@ vec3 BRDFSpecularGGX( vec3 reflect0, vec3 reflect90, float alphaRough, float spe      return fresnel * vis * d;  } -// Based omn http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ -float random(vec2 co) -{ -	float a = 12.9898; -	float b = 78.233; -	float c = 43758.5453; -	float dt= dot(co.xy ,vec2(a,b)); -	float sn= mod(dt,3.14); -	return fract(sin(sn) * c); -} - -vec2 hammersley2d(uint i, uint N)  -{ -	// Radical inverse based on http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html -	uint bits = (i << 16u) | (i >> 16u); -	bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); -	bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); -	bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); -	bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); -	float rdi = float(bits) * 2.3283064365386963e-10; -	return vec2(float(i) /float(N), rdi); -} - -// Based on http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_slides.pdf -vec3 importanceSample_GGX(vec2 Xi, float roughness, vec3 normal)  -{ -	// Maps a 2D point to a hemisphere with spread based on roughness -	float alpha = roughness * roughness; -	float phi = 2.0 * M_PI * Xi.x + random(normal.xz) * 0.1; -	float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (alpha*alpha - 1.0) * Xi.y)); -	float sinTheta = sqrt(1.0 - cosTheta * cosTheta); -	vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); - -	// Tangent space -	vec3 up = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); -	vec3 tangentX = normalize(cross(up, normal)); -	vec3 tangentY = normalize(cross(normal, tangentX)); - -	// Convert to world Space -	return normalize(tangentX * H.x + tangentY * H.y + normal * H.z); -} - -// Geometric Shadowing function -float G_SchlicksmithGGX(float dotNL, float dotNV, float roughness) -{ -	float k = (roughness * roughness) / 2.0; -	float GL = dotNL / (dotNL * (1.0 - k) + k); -	float GV = dotNV / (dotNV * (1.0 - k) + k); -	return GL * GV; -} - -#define NUM_SAMPLES 16 -  vec2 BRDF(float NoV, float roughness)  { -#if 0 -	// Normal always points along z-axis for the 2D lookup  -	const vec3 N = vec3(0.0, 0.0, 1.0); -	vec3 V = vec3(sqrt(1.0 - NoV*NoV), 0.0, NoV); - -	vec2 LUT = vec2(0.0); -	for(uint i = 0u; i < NUM_SAMPLES; i++) { -		vec2 Xi = hammersley2d(i, NUM_SAMPLES); -		vec3 H = importanceSample_GGX(Xi, roughness, N); -		vec3 L = 2.0 * dot(V, H) * H - V; - -		float dotNL = max(dot(N, L), 0.0); -		float dotNV = max(dot(N, V), 0.0); -		float dotVH = max(dot(V, H), 0.0);  -		float dotNH = max(dot(H, N), 0.0); - -		if (dotNL > 0.0) { -			float G = G_SchlicksmithGGX(dotNL, dotNV, roughness); -			float G_Vis = (G * dotVH) / (dotNH * dotNV); -			float Fc = pow(1.0 - dotVH, 5.0); -			LUT += vec2((1.0 - Fc) * G_Vis, Fc * G_Vis); -		} -	} -	return LUT / float(NUM_SAMPLES); -#else      return texture(brdfLut, vec2(NoV, roughness)).rg; -#endif  }  // set colorDiffuse and colorSpec to the results of GLTF PBR style IBL @@ -720,28 +641,3 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,      return color;  } - -void pbrDirectionalLight(inout vec3 colorDiffuse, -    inout vec3 colorSpec, -    vec3 sunlit, -    float scol, -    vec3 reflect0, -    vec3 reflect90, -    vec3 c_diff, -    float alphaRough, -    float vh, -    float nl, -    float nv, -    float nh) -{ -    float scale = 32.0; -    vec3 sunColor = sunlit * scale; - -    // scol = sun shadow -    vec3 intensity  = sunColor * nl * scol; -    vec3 sunDiffuse = intensity * BRDFLambertian (reflect0, reflect90, c_diff    , 1.0, vh); -    vec3 sunSpec    = intensity * BRDFSpecularGGX(reflect0, reflect90, alphaRough, 1.0, vh, nl, nv, nh); - -    colorDiffuse += sunDiffuse; -    colorSpec    += sunSpec; -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl index 88ff4f0c96..077c985092 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl @@ -92,8 +92,6 @@ vec3 srgb_to_linear(vec3 c);  vec3 linear_to_srgb(vec3 c);  // These are in deferredUtil.glsl but we can't set: mFeatures.isDeferred to include it -vec3 BRDFLambertian( vec3 reflect0, vec3 reflect90, vec3 c_diff, float specWeight, float vh ); -vec3 BRDFSpecularGGX( vec3 reflect0, vec3 reflect90, float alphaRoughness, float specWeight, float vh, float nl, float nv, float nh );  void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);  vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);  vec3 scaleSoftClipFrag(vec3 l); diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl index 2294418e8a..bcacc44d0b 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl @@ -74,7 +74,6 @@ uniform vec2 screen_res;  uniform mat4 inv_proj;  vec3 BRDFLambertian( vec3 reflect0, vec3 reflect90, vec3 c_diff, float specWeight, float vh ); -vec3 BRDFSpecularGGX( vec3 reflect0, vec3 reflect90, float alphaRoughness, float specWeight, float vh, float nl, float nv, float nh );  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);  vec3 colorized_dot(float x); diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl index f23e9db040..787da799a5 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl @@ -83,7 +83,6 @@ uniform vec2 screen_res;  uniform mat4 inv_proj;  vec3 BRDFLambertian( vec3 reflect0, vec3 reflect90, vec3 c_diff, float specWeight, float vh ); -vec3 BRDFSpecularGGX( vec3 reflect0, vec3 reflect90, float alphaRoughness, float specWeight, float vh, float nl, float nv, float nh );  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 ); @@ -150,11 +149,17 @@ void main()      if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))      { -        vec3 colorDiffuse  = vec3(0); -        vec3 colorSpec     = vec3(0);          vec3 colorEmissive = spec.rgb; // PBR sRGB Emissive.  See: pbropaqueF.glsl -        vec3 packedORM     = texture2DRect(emissiveRect, tc).rgb; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl -        float metal        = packedORM.b; +        vec3 orm = texture2DRect(emissiveRect, tc).rgb; //orm is packed into "emissiveRect" to keep the data in linear color space +        float perceptualRoughness = orm.g; +        float metallic = orm.b; +        vec3 f0 = vec3(0.04); +        vec3 baseColor = diffuse.rgb; +         +        vec3 diffuseColor = baseColor.rgb*(vec3(1.0)-f0); +        diffuseColor *= 1.0 - metallic; + +        vec3 specularColor = mix(f0, baseColor.rgb, metallic);          // We need this additional test inside a light's frustum since a spotlight's ambiance can be applied          if (proj_tc.x > 0.0 && proj_tc.x < 1.0 @@ -166,46 +171,16 @@ void main()              if (nl > 0.0)              {                  amb_da += (nl*0.5 + 0.5) * proj_ambiance; -                lit = nl * dist_atten; - -                vec3 c_diff, reflect0, reflect90; -                float alphaRough, specWeight; -                initMaterial( diffuse, packedORM, alphaRough, c_diff, reflect0, reflect90, specWeight ); - +                                  dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy ); -                slit = getProjectedLightSpecularColor( pos, n ); -                float exposure = M_PI; -                dlit *= exposure; -                slit *= exposure; - -                colorDiffuse = shadow * lit * dlit * BRDFLambertian ( reflect0, reflect90, c_diff    , specWeight, vh ); -                colorSpec    = shadow * lit * slit * BRDFSpecularGGX( reflect0, reflect90, alphaRough, specWeight, vh, nl, nv, nh ); -                colorSpec   += shadow * lit *        BRDFSpecularGGX( reflect0, reflect90, alphaRough, specWeight, vh, nl, nv, nh ); - -  #if DEBUG_PBR_SPOT_DIFFUSE -                colorDiffuse = dlit.rgb; colorSpec = vec3(0); -  #endif -  #if DEBUG_PBR_SPOT_SPECULAR -                colorDiffuse = vec3(0); colorSpec = slit.rgb; -  #endif -  #if DEBUG_PBR_SPOT -                colorDiffuse = dlit; colorSpec = vec3(0); -                colorDiffuse *= nl; -                colorDiffuse *= shadow; -  #endif +                vec3 intensity = dist_atten * dlit * 3.0 * shadow; // Legacy attenuation +                final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, normalize(lv));              } -            vec3 amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ); -            colorDiffuse += diffuse.rgb * amb_rgb; - +            amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ); +            final_color += diffuse.rgb * amb_rgb;          } - -  #if DEBUG_PBR_LIGHT_TYPE -        colorDiffuse = vec3(0.5,0,0); colorSpec = vec3(0.0); -  #endif - -        final_color = colorDiffuse + colorSpec;      }      else      {  | 
