2023-10-24 15:01:09 +02:00
|
|
|
import Common;
|
2023-11-26 09:40:48 +01:00
|
|
|
import Scene;
|
2023-11-05 10:36:01 +01:00
|
|
|
import VertexData;
|
2024-08-28 17:54:14 +02:00
|
|
|
import StaticMeshVertexData;
|
2023-11-22 13:18:54 +01:00
|
|
|
import MaterialParameter;
|
2023-10-24 15:01:09 +02:00
|
|
|
|
|
|
|
|
struct PrimitiveAttributes
|
|
|
|
|
{
|
2024-05-31 14:21:32 +02:00
|
|
|
#ifdef VISIBILITY
|
|
|
|
|
uint32_t prim : SV_PrimitiveID;
|
|
|
|
|
#endif
|
2023-10-24 15:01:09 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
[numthreads(MESH_GROUP_SIZE, 1, 1)]
|
|
|
|
|
[outputtopology("triangle")]
|
|
|
|
|
[shader("mesh")]
|
|
|
|
|
void meshMain(
|
2024-06-07 09:19:47 +02:00
|
|
|
in uint threadID: SV_GroupThreadID,
|
2024-05-30 21:24:21 +02:00
|
|
|
in uint groupID: SV_GroupID,
|
|
|
|
|
in payload MeshPayload meshPayload,
|
|
|
|
|
out vertices FragmentParameter vertices[MAX_VERTICES],
|
|
|
|
|
out indices uint3 indices[MAX_PRIMITIVES],
|
|
|
|
|
out primitives PrimitiveAttributes prim[MAX_PRIMITIVES]
|
|
|
|
|
) {
|
|
|
|
|
// meshlet number relative to start for this instance
|
|
|
|
|
uint meshletNumber = meshPayload.culledMeshlets[groupID];
|
2024-06-04 21:34:14 +02:00
|
|
|
uint meshletId = meshPayload.cullingOffset + meshletNumber;
|
|
|
|
|
InstanceData inst = pScene.instances[meshPayload.instanceId];
|
2024-05-30 21:24:21 +02:00
|
|
|
MeshletDescription m = pScene.meshletInfos[meshPayload.meshletOffset + meshletNumber];
|
2024-06-07 09:19:47 +02:00
|
|
|
MeshletCullingInfo cull = pScene.cullingInfos[meshletId];
|
2025-04-15 00:33:49 +02:00
|
|
|
SetMeshOutputCounts(m.vertexIndices.size, m.primitiveIndices.size);
|
2023-11-27 21:08:27 +01:00
|
|
|
|
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
|
|
|
{
|
2025-04-15 00:33:49 +02:00
|
|
|
uint p = min(i, m.primitiveIndices.size - 1);
|
2024-04-04 08:30:59 +02:00
|
|
|
{
|
2025-04-15 00:33:49 +02:00
|
|
|
uint baseIndex = m.primitiveIndices.offset + (p * 3);
|
2024-10-02 15:59:52 +02:00
|
|
|
uint local_idx0 = pScene.primitiveIndices[baseIndex + 0];
|
|
|
|
|
uint local_idx1 = pScene.primitiveIndices[baseIndex + 1];
|
|
|
|
|
uint local_idx2 = pScene.primitiveIndices[baseIndex + 2];
|
|
|
|
|
indices[p] = uint3(local_idx0, local_idx1, local_idx2);
|
|
|
|
|
PrimitiveAttributes primAttr;
|
2024-05-31 14:21:32 +02:00
|
|
|
#ifdef VISIBILITY
|
2024-10-02 15:59:52 +02:00
|
|
|
primAttr.prim = encodePrimitive(meshletId);
|
2024-05-31 14:21:32 +02:00
|
|
|
#endif
|
2024-10-02 15:59:52 +02:00
|
|
|
prim[p] = primAttr;
|
2024-04-04 08:30:59 +02:00
|
|
|
}
|
2023-11-27 21:08:27 +01:00
|
|
|
}
|
2024-05-22 10:30:45 +02:00
|
|
|
for(uint i = threadID; i < MAX_VERTICES; i += MESH_GROUP_SIZE)
|
2023-10-24 15:01:09 +02:00
|
|
|
{
|
2025-04-15 00:33:49 +02:00
|
|
|
uint v = min(i, m.vertexIndices.size - 1);
|
2023-10-24 15:01:09 +02:00
|
|
|
{
|
2025-04-15 00:33:49 +02:00
|
|
|
uint vertexIndex = pScene.vertexIndices[m.vertexIndices.offset + v];
|
2024-05-09 08:41:46 +02:00
|
|
|
VertexAttributes attr = pVertexData.getAttributes(m.indicesOffset + vertexIndex);
|
2024-12-27 17:06:43 +01:00
|
|
|
vertices[v] = attr.getParameter(inst.transformMatrix, inst.inverseTransformMatrix);
|
2023-10-24 15:01:09 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|