1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| TaskData taskData = taskDatas[pc.primitiveType*MAX_FRAMES_IN_FLIGHT+pc.currentFrame].taskData[payload.taskId];
SubMesh subMesh = SubMeshDatas[pc.primitiveType*MAX_FRAMES_IN_FLIGHT+pc.currentFrame].subMeshData[payload.taskId];
Cluster cluster = clusterDatas.clusters[taskDatas[pc.primitiveType*MAX_FRAMES_IN_FLIGHT+pc.currentFrame].taskData[payload.taskId].clusterOffset+gl_WorkGroupID.y];
uint id = gl_WorkGroupID.z;
if (id >= cluster.meshletCount) {
return;
}
//Instance id = taskId (base instance) + workGroupId.x (instance id).
uint instanceId = taskDatas[pc.primitiveType*MAX_FRAMES_IN_FLIGHT+pc.currentFrame].taskData[payload.taskId].baseInstance + gl_WorkGroupID.x;
//debugPrintfEXT("Instance id : %i", gl_WorkGroupID.x);
mat4 modelMatrix = modelDataBuffer[pc.primitiveType*MAX_FRAMES_IN_FLIGHT+pc.currentFrame].modelData[instanceId].modelMatrix;
MeshLet meshlet = meshletDatas.meshlet[cluster.meshletOffset+id];
/*if (gl_WorkGroupID.y >= lodLevelData.lodLevel[subMesh.lodOffset+subMesh.lodLevel].meshletCount)
debugPrintfEXT("meshlet offets : %i, %i", lodLevelData.lodLevel[subMesh.lodOffset+subMesh.lodLevel].meshletCount, gl_WorkGroupID.y);*/
uint firstIndex = subMesh.indexOffset + lodLevelData.lodLevel[subMesh.lodOffset+subMesh.lodLevel].index_offset + meshlet.indexOffset;
//debugPrintfEXT("First index : %i,%i", firstIndex, meshlet.vertexOffset);
//3 = Triangles.
uint maxVerts = 255u;
uint maxPrims = 85u;
uint vertexCount = min(meshlet.nbVertices, maxVerts);
uint primitiveCount = min(meshlet.nbIndexes / 3u, maxPrims);
/*if (vertexCount > 0)
debugPrintfEXT("submesh vertex count : %i, %i", meshlet.nbVertices, meshlet.nbIndexes);*/
SetMeshOutputsEXT(vertexCount, primitiveCount);
for (uint i = 0; i < vertexCount; i++) {
uint v = subMesh.vertexOffset + meshlet.vertexOffset + i;
gl_MeshVerticesEXT[i].gl_Position = pc.projMatrix * pc.viewMatrix * modelMatrix * vec4(vertexData[pc.primitiveType].vertices[v].position, 1.0);
fragColor[i] = unpackColor(vertexData[pc.primitiveType].vertices[v].color);
fragTexCoord[i] = vertexData[pc.primitiveType].vertices[v].texCoords;
normal[i] = mat3(transpose(inverse(modelMatrix))) * vertexData[pc.primitiveType].vertices[v].normal;
materialID[i] = subMesh.materialId;
primitiveType[i] = pc.primitiveType;
currentFrame[i] = pc.currentFrame;
//debugPrintfEXT("position : %i", i);
}
for (uint tri = 0; tri < primitiveCount; tri++) {
//debugPrintfEXT("gen tri : %i", tri);
uint g0 = indexData[pc.primitiveType].indexes[firstIndex + tri * 3 + 0];
uint g1 = indexData[pc.primitiveType].indexes[firstIndex + tri * 3 + 1];
uint g2 = indexData[pc.primitiveType].indexes[firstIndex + tri * 3 + 2];
uint i0 = g0 - meshlet.vertexOffset;
uint i1 = g1 - meshlet.vertexOffset;
uint i2 = g2 - meshlet.vertexOffset;
/*if ((i0 >= vertexCount || i1 >= vertexCount || i2 >= vertexCount) && pc.currentFrame == 1)
debugPrintfEXT("meshlet : %i,%i, %i, %i, %i, %i, %i",lodLevelData.lodLevel[subMesh.lodOffset+subMesh.lodLevel].meshletCount, subMesh.meshletOffset, subMesh.indexOffset, meshlet.nbIndexes, meshlet.nbVertices, meshlet.indexOffset, meshlet.vertexOffset);*/
gl_PrimitiveTriangleIndicesEXT[tri] = uvec3(i0, i1, i2);
}
} |
Partager