diff --git a/res/shaders/LightCulling.slang b/res/shaders/LightCulling.slang index c234675..58c3899 100644 --- a/res/shaders/LightCulling.slang +++ b/res/shaders/LightCulling.slang @@ -99,7 +99,7 @@ void cullLights(ComputeShaderInput in) { PointLight light = pLightEnv.pointLights[i]; //TODO: why doesn't this check go through? - if(light.insideFrustum(groupFrustum, nearClipVS, maxDepthVS)) + if(light.insideFrustum(groupFrustum, nearClipVS)) { tAppendLight(i); if(!light.insidePlane(minPlane)) diff --git a/res/shaders/MeshletBasePass.slang b/res/shaders/MeshletBasePass.slang index 825d6b5..7cf3122 100644 --- a/res/shaders/MeshletBasePass.slang +++ b/res/shaders/MeshletBasePass.slang @@ -51,7 +51,7 @@ void taskMain( { uint m = mesh.meshletOffset + i; MeshletDescription meshlet = pScene.meshletInfos[m]; - //if(meshlet.boundingBox.insideFrustum(localToClip, viewFrustum)) + if(meshlet.boundingBox.insideFrustum(localToClip, viewFrustum)) { uint index; InterlockedAdd(head, 1, index); diff --git a/res/shaders/lib/Common.slang b/res/shaders/lib/Common.slang index 65a24f2..7048fb7 100644 --- a/res/shaders/lib/Common.slang +++ b/res/shaders/lib/Common.slang @@ -39,13 +39,13 @@ struct Frustum Plane basePlane; bool pointInside(float3 point) { - if (basePlane.pointInside(point)) + if (!basePlane.pointInside(point)) { return false; } for(int p = 0; p < 4; ++p) { - if(sides[p].pointInside(point)) + if(!sides[p].pointInside(point)) { return false; } diff --git a/res/shaders/lib/LightEnv.slang b/res/shaders/lib/LightEnv.slang index 8c45199..756e626 100644 --- a/res/shaders/lib/LightEnv.slang +++ b/res/shaders/lib/LightEnv.slang @@ -33,21 +33,29 @@ struct PointLight : ILightEnv return illuminance * brdf.evaluate(params.tbn, params.viewDir_TS, normalize(lightDir_TS), colorRange.xyz); } - bool insidePlane(Plane plane, float3 position_CS) + bool insidePlane(Plane plane, float3 center_CS) { + float3 position_CS = center_CS + plane.n * colorRange.w; return plane.pointInside(position_CS); } - bool insideFrustum(Frustum frustum) + bool insideFrustum(Frustum frustum, float nearClipVS, float maxDepthVS) { - bool result = true; float4 clipPos = mul(pViewParams.projectionMatrix, mul(pViewParams.viewMatrix, position_WS)); - float3 position_CS = clipPos.xyz / clipPos.w; + float3 center_CS = clipPos.xyz / clipPos.w; + if(insidePlane(frustum.basePlane, center_CS)) + { + return true; + } + uint result = 0; for(int i = 0; i < 4; ++i) { - + if(insidePlane(frustum.sides[i], center_CS)) + { + result++; + } } - return result; + return result > 0; } };