Files
Seele/res/shaders/MeshletBasePass.slang
T

102 lines
3.3 KiB
Plaintext
Raw Normal View History

2023-10-24 15:01:09 +02:00
import Common;
import BRDF;
2023-11-26 09:40:48 +01:00
import Scene;
2023-11-05 10:36:01 +01:00
import VertexData;
2023-11-22 13:18:54 +01:00
import MaterialParameter;
2023-10-24 15:01:09 +02:00
struct MeshPayload
{
uint instanceId[MAX_MESHLETS_PER_MESH];
uint meshletId[MAX_MESHLETS_PER_MESH];
};
groupshared MeshPayload p;
groupshared uint head;
groupshared Frustum viewFrustum;
[numthreads(TASK_GROUP_SIZE, 1, 1)]
[outputtopology("triangle")]
[shader("amplification")]
void taskMain(
uint threadID: SV_GroupIndex,
uint groupID: SV_GroupID
){
2023-11-08 23:27:21 +01:00
InstanceData instance = pScene.instances[groupID];
2023-10-24 15:01:09 +02:00
if(threadID == 0)
{
head = 0;
2024-03-31 10:21:09 +02:00
float3 origin = float3(0, 0, 0);
const float offset = 0.0f;
2024-03-31 10:21:09 +02:00
float3 corners[4] = {
screenToModel(instance.inverseTransformMatrix, float4(offset, offset, -1.0f, 1.0f)).xyz,
screenToModel(instance.inverseTransformMatrix, float4(pViewParams.screenDimensions.x - offset, offset, -1.0f, 1.0f)).xyz,
screenToModel(instance.inverseTransformMatrix, float4(offset, pViewParams.screenDimensions.y - offset, -1.0f, 1.0f)).xyz,
screenToModel(instance.inverseTransformMatrix, float4(pViewParams.screenDimensions - float2(offset, offset), -1.0f, 1.0f)).xyz
2024-03-31 10:21:09 +02:00
};
viewFrustum.sides[0] = computePlane(origin, corners[2], corners[0]);
viewFrustum.sides[1] = computePlane(origin, corners[1], corners[3]);
viewFrustum.sides[2] = computePlane(origin, corners[0], corners[1]);
viewFrustum.sides[3] = computePlane(origin, corners[3], corners[2]);
2023-10-24 15:01:09 +02:00
}
GroupMemoryBarrierWithGroupSync();
2023-11-08 23:27:21 +01:00
MeshData mesh = pScene.meshData[groupID];
2023-10-24 15:01:09 +02:00
for(uint i = threadID; i < MAX_MESHLETS_PER_MESH; i += TASK_GROUP_SIZE)
{
2023-11-22 13:18:54 +01:00
if(i < mesh.numMeshlets)
2023-10-24 15:01:09 +02:00
{
2023-11-22 13:18:54 +01:00
uint m = mesh.meshletOffset + i;
MeshletDescription meshlet = pScene.meshletInfos[m];
//if(meshlet.bounding.insideFrustum(viewFrustum))
2023-11-22 13:18:54 +01:00
{
uint index;
InterlockedAdd(head, 1, index);
p.meshletId[index] = m;
2024-04-26 20:24:43 +02:00
p.instanceId[index] = groupID;
2023-11-22 13:18:54 +01:00
}
2023-10-24 15:01:09 +02:00
}
}
GroupMemoryBarrierWithGroupSync();
DispatchMesh(head, 1, 1, p);
}
struct PrimitiveAttributes
{
uint cull: SV_CullPrimitive;
};
[numthreads(MESH_GROUP_SIZE, 1, 1)]
[outputtopology("triangle")]
[shader("mesh")]
void meshMain(
in uint threadID: SV_GroupIndex,
in uint groupID: SV_GroupID,
2023-12-11 14:45:37 +01:00
in payload MeshPayload meshPayload,
2024-04-23 17:08:39 +02:00
out vertices FragmentParameter vertices[MAX_VERTICES],
out indices uint3 indices[MAX_PRIMITIVES]
2023-10-24 15:01:09 +02:00
){
2023-12-11 14:45:37 +01:00
InstanceData inst = pScene.instances[meshPayload.instanceId[groupID]];
MeshData md = pScene.meshData[meshPayload.instanceId[groupID]];
MeshletDescription m = pScene.meshletInfos[meshPayload.meshletId[groupID]];
2023-11-27 21:08:27 +01:00
SetMeshOutputCounts(m.vertexCount, m.primitiveCount);
2024-04-04 08:30:59 +02:00
for(uint i = threadID; i < MAX_PRIMITIVES; i += MESH_GROUP_SIZE)
2023-11-27 21:08:27 +01:00
{
2024-04-04 08:30:59 +02:00
uint p = min(i, m.primitiveCount - 1);
{
2024-04-20 21:35:43 +02:00
uint local_idx0 = pScene.primitiveIndices[m.primitiveOffset + (p * 3) + 0];
uint local_idx1 = pScene.primitiveIndices[m.primitiveOffset + (p * 3) + 1];
uint local_idx2 = pScene.primitiveIndices[m.primitiveOffset + (p * 3) + 2];
2024-04-04 08:30:59 +02:00
indices[p] = uint3(local_idx0, local_idx1, local_idx2);
}
2023-11-27 21:08:27 +01:00
}
for(uint i = threadID; i < MAX_VERTICES; i+=MESH_GROUP_SIZE)
2023-10-24 15:01:09 +02:00
{
2023-11-26 12:47:48 +01:00
uint v = min(i, m.vertexCount - 1);
2023-10-24 15:01:09 +02:00
{
2023-12-11 13:04:58 +01:00
uint vertexIndex = pScene.vertexIndices[m.vertexOffset + v];
2023-12-15 11:57:13 +01:00
VertexAttributes attr = pVertexData.getAttributes(md.indicesOffset + vertexIndex);
vertices[v] = attr.getParameter(inst.transformMatrix);
2024-04-26 20:24:43 +02:00
//vertices[v].vertexColor = m.color;
2023-10-24 15:01:09 +02:00
}
}
}