From 3382a35c3fff97c3897b4e39eff413eb6abff96a Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Tue, 16 Jan 2018 12:13:45 +0100 Subject: [PATCH] Fixed bug due to incorrect discard of fragments with no local lights --- .../render-utils/src/DeferredGlobalLight.slh | 15 +++++--- .../render-utils/src/LightClusterGrid.slh | 38 ++++++++++++------- libraries/render-utils/src/LightLocal.slh | 31 +++++++++------ .../src/local_lights_drawOutline.slf | 3 ++ .../render-utils/src/local_lights_shading.slf | 5 ++- .../render-utils/src/model_translucent.slf | 17 +++++---- .../src/model_translucent_fade.slf | 17 +++++---- .../src/overlay3D_model_translucent.slf | 2 +- .../src/simple_transparent_textured.slf | 2 +- .../src/simple_transparent_textured_fade.slf | 2 +- 10 files changed, 81 insertions(+), 51 deletions(-) diff --git a/libraries/render-utils/src/DeferredGlobalLight.slh b/libraries/render-utils/src/DeferredGlobalLight.slh index 8406e4a0c5..02ab97b825 100644 --- a/libraries/render-utils/src/DeferredGlobalLight.slh +++ b/libraries/render-utils/src/DeferredGlobalLight.slh @@ -171,9 +171,11 @@ vec3 evalLightmappedColor(mat4 invViewMat, float shadowAttenuation, float obscur <$declareLightingAmbient(1, 1, 1)$> <$declareLightingDirectional()$> -vec3 evalGlobalLightingAlphaBlended(mat4 invViewMat, float shadowAttenuation, float obscurance, vec3 position, vec3 normal, vec3 albedo, vec3 fresnel, float metallic, vec3 emissive, float roughness, float opacity) { +vec3 evalGlobalLightingAlphaBlended(mat4 invViewMat, float shadowAttenuation, float obscurance, vec3 position, vec3 normal, vec3 albedo, vec3 fresnel, float metallic, vec3 emissive, float roughness, float opacity, vec3 prevLighting) { <$prepareGlobalLight()$> + color = prevLighting; + color += emissive * isEmissiveEnabled(); // Ambient @@ -195,25 +197,26 @@ vec3 evalGlobalLightingAlphaBlended(mat4 invViewMat, float shadowAttenuation, fl vec3 evalGlobalLightingAlphaBlendedWithHaze( mat4 invViewMat, float shadowAttenuation, float obscurance, vec3 position, vec3 normal, - vec3 albedo, vec3 fresnel, float metallic, vec3 emissive, float roughness, float opacity) + vec3 albedo, vec3 fresnel, float metallic, vec3 emissive, float roughness, float opacity, vec3 prevLighting) { <$prepareGlobalLight()$> + color = prevLighting; + color += emissive * isEmissiveEnabled(); // Ambient vec3 ambientDiffuse; vec3 ambientSpecular; evalLightingAmbient(ambientDiffuse, ambientSpecular, lightAmbient, fragEyeDir, fragNormal, roughness, metallic, fresnel, albedo, obscurance); - color += ambientDiffuse; - color += ambientSpecular / opacity; // Directional vec3 directionalDiffuse; vec3 directionalSpecular; evalLightingDirectional(directionalDiffuse, directionalSpecular, lightDirection, lightIrradiance, fragEyeDir, fragNormal, roughness, metallic, fresnel, albedo, shadowAttenuation); - color += directionalDiffuse; - color += directionalSpecular / opacity; + + color += ambientDiffuse + directionalDiffuse; + color += (ambientSpecular + directionalSpecular) / opacity; // Haze if ((hazeParams.hazeMode & HAZE_MODE_IS_ACTIVE) == HAZE_MODE_IS_ACTIVE) { diff --git a/libraries/render-utils/src/LightClusterGrid.slh b/libraries/render-utils/src/LightClusterGrid.slh index d2eb213c71..60daa520a3 100644 --- a/libraries/render-utils/src/LightClusterGrid.slh +++ b/libraries/render-utils/src/LightClusterGrid.slh @@ -95,22 +95,32 @@ int clusterGrid_getClusterLightId(int index, int offset) { ivec3 cluster = clusterGrid_getCluster(frustumGrid_clusterToIndex(clusterPos)); int numLights = cluster.x + cluster.y; - if (numLights <= 0) { - discard; - } - ivec3 dims = frustumGrid.dims.xyz; - if (clusterPos.x < 0 || clusterPos.x >= dims.x) { - discard; - } - - if (clusterPos.y < 0 || clusterPos.y >= dims.y) { - discard; - } - if (clusterPos.z < 0 || clusterPos.z > dims.z) { - discard; - } <@endfunc@> +bool hasLocalLights(int numLights, ivec3 clusterPos, ivec3 dims) { +/* + if (numLights <= 0) { + return false; + } + + if (clusterPos.x < 0 || clusterPos.x >= dims.x) { + return false; + } + + if (clusterPos.y < 0 || clusterPos.y >= dims.y) { + return false; + } + if (clusterPos.z < 0 || clusterPos.z > dims.z) { + return false; + } + return true; +*/ + return numLights>0 + && all(greaterThanEqual(clusterPos, ivec3(0))) + && all(lessThan(clusterPos.xy, dims.xy)) + && clusterPos.z <= dims.z; +} + <@endif@> diff --git a/libraries/render-utils/src/LightLocal.slh b/libraries/render-utils/src/LightLocal.slh index d9980b1fa6..895955269d 100644 --- a/libraries/render-utils/src/LightLocal.slh +++ b/libraries/render-utils/src/LightLocal.slh @@ -22,8 +22,11 @@ vec4 evalLocalLighting(ivec3 cluster, int numLights, vec3 fragWorldPos, vec3 fragNormal, vec3 fragEyeDir, vec4 midNormalCurvature, vec4 lowNormalCurvature, - float fragRoughness, float fragScattering, float fragMetallic, vec3 fragFresnel, vec3 fragAlbedo) { - vec4 _fragColor = vec4(0.0); + float fragRoughness, float fragScattering, float fragMetallic, vec3 fragFresnel, vec3 fragAlbedo, + float opacity) { + vec4 fragColor = vec4(0.0); + vec3 fragSpecular = vec3(0.0); + vec3 fragDiffuse = vec3(0.0); int lightClusterOffset = cluster.z; // Compute the rougness into gloss2 once: @@ -72,11 +75,11 @@ vec4 evalLocalLighting(ivec3 cluster, int numLights, vec3 fragWorldPos, vec3 fra evalFragShadingGloss(diffuse, specular, fragNormal, fragLightDir, fragEyeDir, fragMetallic, fragFresnel, fragGloss2, fragAlbedo); } - diffuse *= lightEnergy * isDiffuseEnabled(); - specular *= lightEnergy * isSpecularEnabled(); + diffuse *= lightEnergy; + specular *= lightEnergy; - _fragColor.rgb += diffuse; - _fragColor.rgb += specular; + fragDiffuse.rgb += diffuse; + fragSpecular.rgb += specular; } for (int i = cluster.x; i < numLights; i++) { @@ -127,11 +130,17 @@ vec4 evalLocalLighting(ivec3 cluster, int numLights, vec3 fragWorldPos, vec3 fra evalFragShadingGloss(diffuse, specular, fragNormal, fragLightDir, fragEyeDir, fragMetallic, fragFresnel, fragGloss2, fragAlbedo); } - diffuse *= lightEnergy * isDiffuseEnabled(); - specular *= lightEnergy * isSpecularEnabled(); + diffuse *= lightEnergy; + specular *= lightEnergy; - _fragColor.rgb += diffuse; - _fragColor.rgb += specular; + fragDiffuse.rgb += diffuse; + fragSpecular.rgb += specular; } - return _fragColor; + + fragDiffuse *= isDiffuseEnabled(); + fragSpecular *= isSpecularEnabled(); + + fragColor.rgb += fragDiffuse; + fragColor.rgb += fragSpecular / opacity; + return fragColor; } \ No newline at end of file diff --git a/libraries/render-utils/src/local_lights_drawOutline.slf b/libraries/render-utils/src/local_lights_drawOutline.slf index f7527d0542..de49478eba 100644 --- a/libraries/render-utils/src/local_lights_drawOutline.slf +++ b/libraries/render-utils/src/local_lights_drawOutline.slf @@ -55,6 +55,9 @@ void main(void) { vec4 fragPos = invViewMat * fragPosition; <$fetchClusterInfo(fragPos)$>; + if (!hasLocalLights(numLights, clusterPos, dims)) { + discard; + } // Frag to eye vec vec4 fragEyeVector = invViewMat * vec4(-frag.position.xyz, 0.0); diff --git a/libraries/render-utils/src/local_lights_shading.slf b/libraries/render-utils/src/local_lights_shading.slf index f302c6daba..b9c57b82cb 100644 --- a/libraries/render-utils/src/local_lights_shading.slf +++ b/libraries/render-utils/src/local_lights_shading.slf @@ -41,6 +41,9 @@ void main(void) { vec4 fragWorldPos = invViewMat * fragPosition; <$fetchClusterInfo(fragWorldPos)$>; + if (!hasLocalLights(numLights, clusterPos, dims)) { + discard; + } vec4 midNormalCurvature; vec4 lowNormalCurvature; @@ -55,7 +58,7 @@ void main(void) { _fragColor = evalLocalLighting(cluster, numLights, fragWorldPos.xyz, frag.normal, fragEyeDir, midNormalCurvature, lowNormalCurvature, frag.roughness, frag.scattering, - frag.metallic, frag.fresnel, frag.albedo); + frag.metallic, frag.fresnel, frag.albedo, 1.0); } diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index 5f61aea889..c054a5c096 100644 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -68,16 +68,17 @@ void main(void) { vec3 fragNormal = normalize(_normal); TransformCamera cam = getTransformCamera(); + vec4 localLighting = vec4(0.0); <$fetchClusterInfo(_worldPosition)$>; + if (hasLocalLights(numLights, clusterPos, dims)) { + vec3 fragEyeVector = vec3(cam._viewInverse * vec4(-fragPosition, 0.0)); + vec3 fragEyeDir = normalize(fragEyeVector); - vec3 fragEyeVector = vec3(cam._viewInverse * vec4(-fragPosition, 0.0)); - vec3 fragEyeDir = normalize(fragEyeVector); - - vec4 localLighting = evalLocalLighting(cluster, numLights, _worldPosition.xyz, fragNormal, fragEyeDir, - vec4(0), vec4(0), roughness, 0.0, - metallic, fresnel, albedo); - emissive += localLighting.rgb; + localLighting = evalLocalLighting(cluster, numLights, _worldPosition.xyz, fragNormal, fragEyeDir, + vec4(0), vec4(0), roughness, 0.0, + metallic, fresnel, albedo, opacity); + } _fragColor = vec4(evalGlobalLightingAlphaBlendedWithHaze( cam._viewInverse, @@ -89,6 +90,6 @@ void main(void) { fresnel, metallic, emissive, - roughness, opacity), + roughness, opacity, localLighting.rgb), opacity); } diff --git a/libraries/render-utils/src/model_translucent_fade.slf b/libraries/render-utils/src/model_translucent_fade.slf index e07730a07e..c6bfd1659d 100644 --- a/libraries/render-utils/src/model_translucent_fade.slf +++ b/libraries/render-utils/src/model_translucent_fade.slf @@ -77,16 +77,17 @@ void main(void) { vec3 fragNormal = normalize(_normal); TransformCamera cam = getTransformCamera(); + vec4 localLighting = vec4(0.0); <$fetchClusterInfo(_worldPosition)$>; + if (hasLocalLights(numLights, clusterPos, dims)) { + vec3 fragEyeVector = vec3(cam._viewInverse * vec4(-fragPosition, 0.0)); + vec3 fragEyeDir = normalize(fragEyeVector); - vec3 fragEyeVector = vec3(cam._viewInverse * vec4(-fragPosition, 0.0)); - vec3 fragEyeDir = normalize(fragEyeVector); - - vec4 localLighting = evalLocalLighting(cluster, numLights, _worldPosition.xyz, fragNormal, fragEyeDir, - vec4(0), vec4(0), roughness, 0.0, - metallic, fresnel, albedo); - emissive += localLighting.rgb; + localLighting = evalLocalLighting(cluster, numLights, _worldPosition.xyz, fragNormal, fragEyeDir, + vec4(0), vec4(0), roughness, 0.0, + metallic, fresnel, albedo, opacity); + } _fragColor = vec4(evalGlobalLightingAlphaBlendedWithHaze( cam._viewInverse, @@ -98,6 +99,6 @@ void main(void) { fresnel, metallic, emissive+fadeEmissive, - roughness, opacity), + roughness, opacity, localLighting.rgb), opacity); } diff --git a/libraries/render-utils/src/overlay3D_model_translucent.slf b/libraries/render-utils/src/overlay3D_model_translucent.slf index b26e70f465..18f40a37b4 100644 --- a/libraries/render-utils/src/overlay3D_model_translucent.slf +++ b/libraries/render-utils/src/overlay3D_model_translucent.slf @@ -75,7 +75,7 @@ void main(void) { fresnel, metallic, emissive, - roughness, opacity), + roughness, opacity, vec3(0)), opacity); // Apply standard tone mapping diff --git a/libraries/render-utils/src/simple_transparent_textured.slf b/libraries/render-utils/src/simple_transparent_textured.slf index b16b19c8b4..5068b59e89 100644 --- a/libraries/render-utils/src/simple_transparent_textured.slf +++ b/libraries/render-utils/src/simple_transparent_textured.slf @@ -56,7 +56,7 @@ void main(void) { 0.0, vec3(0.0f), DEFAULT_ROUGHNESS, - opacity), + opacity, vec3(0)), opacity); } \ No newline at end of file diff --git a/libraries/render-utils/src/simple_transparent_textured_fade.slf b/libraries/render-utils/src/simple_transparent_textured_fade.slf index ad260210a7..2fff00849f 100644 --- a/libraries/render-utils/src/simple_transparent_textured_fade.slf +++ b/libraries/render-utils/src/simple_transparent_textured_fade.slf @@ -68,7 +68,7 @@ void main(void) { 0.0f, fadeEmissive, DEFAULT_ROUGHNESS, - opacity), + opacity, vec3(0)), opacity); } \ No newline at end of file