View Frustum culling for mesh shading

This commit is contained in:
Dynamitos
2023-12-15 11:57:13 +01:00
parent 462999858f
commit b24635e848
17 changed files with 71 additions and 40 deletions
+3 -3
View File
@@ -18,8 +18,8 @@ ParameterBlock<LightCullingData> pLightCullingData;
float4 fragmentMain(in FragmentParameter params) : SV_Target
{
LightingParameter lightingParams = params.getLightingParameter();
let brdf = pMaterial.prepare(params.getMaterialParameter());
MaterialParameter materialParams = params.getMaterialParameter();
let brdf = pMaterial.prepare(materialParams);
float3 result = float3(0, 0, 0);
for(int i = 0; i < pLightEnv.numDirectionalLights; ++i)
{
@@ -29,5 +29,5 @@ float4 fragmentMain(in FragmentParameter params) : SV_Target
{
result += pLightEnv.pointLights[i].illuminate(lightingParams, brdf);
}
return float4(result, 1.0f);
return float4(materialParams.vertexColor, 1.0f);
}
+10 -8
View File
@@ -29,19 +29,19 @@ void taskMain(
localToClip = mul(pViewParams.projectionMatrix, mul(pViewParams.viewMatrix, instance.transformMatrix));
// Left
viewFrustum.sides[0].n = float3(1, 0, 0);
viewFrustum.sides[0].d = -0.8;
viewFrustum.sides[0].d = 0.7;
// Right
viewFrustum.sides[1].n = float3(-1, 0, 0);
viewFrustum.sides[1].d = 0.8;
viewFrustum.sides[1].d = 0.7;
// Top
viewFrustum.sides[2].n = float3(0, -1, 0);
viewFrustum.sides[2].d = 0.8;
viewFrustum.sides[2].d = 0.7;
// Bottom
viewFrustum.sides[1].n = float3(0, 1, 0);
viewFrustum.sides[1].d = -0.8;
viewFrustum.sides[3].n = float3(0, 1, 0);
viewFrustum.sides[3].d = 0.7;
// Base
viewFrustum.basePlane.n = float3(0, 0, 1);
viewFrustum.basePlane.d = 0;
viewFrustum.basePlane.d = 0.2;
}
GroupMemoryBarrierWithGroupSync();
MeshData mesh = pScene.meshData[groupID];
@@ -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);
@@ -119,7 +119,9 @@ void meshMain(
uint v = min(i, m.vertexCount - 1);
{
uint vertexIndex = pScene.vertexIndices[m.vertexOffset + v];
vertices[v] = pVertexData.getAttributes(md.indicesOffset + vertexIndex).getParameter(inst.transformMatrix);
VertexAttributes attr = pVertexData.getAttributes(md.indicesOffset + vertexIndex);
attr.vertexColor = m.color;
vertices[v] = attr.getParameter(inst.transformMatrix);
}
}
}
+10 -10
View File
@@ -8,18 +8,18 @@ struct AABB
float pad1;
bool insideFrustum(float4x4 transform, Frustum frustum)
{
float3 corners[8];
corners[0] = mul(transform, float4(min.x, min.y, min.z, 1.0f)).xyz;
corners[1] = mul(transform, float4(min.x, min.y, max.z, 1.0f)).xyz;
corners[2] = mul(transform, float4(min.x, max.y, min.z, 1.0f)).xyz;
corners[3] = mul(transform, float4(min.x, max.y, max.z, 1.0f)).xyz;
corners[4] = mul(transform, float4(max.x, min.y, min.z, 1.0f)).xyz;
corners[5] = mul(transform, float4(max.x, min.y, max.z, 1.0f)).xyz;
corners[6] = mul(transform, float4(max.x, max.y, min.z, 1.0f)).xyz;
corners[7] = mul(transform, float4(max.x, max.y, max.z, 1.0f)).xyz;
float4 corners[8];
corners[0] = mul(transform, float4(min.x, min.y, min.z, 1.0f));
corners[1] = mul(transform, float4(min.x, min.y, max.z, 1.0f));
corners[2] = mul(transform, float4(min.x, max.y, min.z, 1.0f));
corners[3] = mul(transform, float4(min.x, max.y, max.z, 1.0f));
corners[4] = mul(transform, float4(max.x, min.y, min.z, 1.0f));
corners[5] = mul(transform, float4(max.x, min.y, max.z, 1.0f));
corners[6] = mul(transform, float4(max.x, max.y, min.z, 1.0f));
corners[7] = mul(transform, float4(max.x, max.y, max.z, 1.0f));
for(int i = 0; i < 8; ++i)
{
if(frustum.pointInside(corners[i]))
if(frustum.pointInside(corners[i].xyz / corners[i].w))
{
return true;
}
+2 -4
View File
@@ -35,15 +35,13 @@ struct Frustum
Plane basePlane;
bool pointInside(float3 point)
{
float result = dot(basePlane.n, point) + basePlane.d;
if (0.0f > result)
if (dot(basePlane.n, point) + basePlane.d < 0.0f)
{
return false;
}
for(int p = 0; p < 4; ++p)
{
result = dot(sides[p].n, point) + sides[p].d;
if(0.0f > result)
if(dot(sides[p].n, point) + sides[p].d < 0.0f)
{
return false;
}
+3
View File
@@ -7,10 +7,13 @@ struct MeshletDescription
uint32_t primitiveCount;
uint32_t vertexOffset;
uint32_t primitiveOffset;
float3 color;
float pad;
};
struct MeshData
{
AABB boundingBox;
uint32_t numMeshlets;
uint32_t meshletOffset;
uint32_t firstIndex;