Skip to content

Commit b11e947

Browse files
outline for fixing the instance ID
1 parent 8840392 commit b11e947

File tree

4 files changed

+191
-197
lines changed

4 files changed

+191
-197
lines changed

examples_tests/22.RaytracedAO/cull.comp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,15 @@ layout(local_size_x = WORKGROUP_SIZE) in;
66

77

88
#include <nbl/builtin/glsl/utils/indirect_commands.glsl>
9-
layout(set=1, binding=0, std430, row_major) restrict readonly buffer PerInstanceStatic
10-
{
11-
ObjectStaticData_t staticData[];
12-
};
13-
layout(set=1, binding=1, row_major) writeonly restrict buffer PerInstancePerCamera
9+
layout(set=1, binding=0, row_major) writeonly restrict buffer PerInstancePerCamera
1410
{
1511
DrawData_t data[];
1612
} instanceDataPerCamera;
17-
layout(set=1, binding=2, std430, row_major) restrict readonly buffer PerInstanceCull
13+
layout(set=1, binding=1, std430, row_major) restrict readonly buffer PerInstanceCull
1814
{
1915
CullData_t cullData[];
2016
};
21-
layout(set=1, binding=3, std430) restrict coherent buffer IndirectDraws
17+
layout(set=1, binding=2, std430) restrict coherent buffer IndirectDraws
2218
{
2319
nbl_glsl_DrawElementsIndirectCommand_t draws[];
2420
} commandBuff[2];
@@ -40,33 +36,37 @@ layout(push_constant, row_major) uniform PushConstants
4036
// we just do atomic add on the instance count
4137
void main()
4238
{
43-
uint globalObjectID = gl_GlobalInvocationID.x;
44-
if (globalObjectID>=pc.data.maxObjectCount)
39+
if (gl_GlobalInvocationID.x<pc.data.maxDrawCount)
40+
commandBuff[pc.data.currentCommandBufferIx^0x1u].draws[gl_GlobalInvocationID.x].instanceCount = 0u;
41+
42+
uint instanceMeshBufferID = gl_GlobalInvocationID.x;
43+
if (instanceMeshBufferID>=pc.data.maxObjectCount)
4544
return;
4645

47-
const mat4x3 worldMatrix = cullData[globalObjectID].worldMatrix;
48-
const uint drawID = cullData[globalObjectID].drawID;
46+
// fetch instance data
47+
const CullData_t instanceMeshBufferData = cullData[instanceMeshBufferID];
48+
const uint globalObjectID = instanceMeshBufferData.globalObjectID;
4949

50-
// clear drawcount for next buffer
51-
commandBuff[pc.data.currentCommandBufferIx^0x1u].draws[drawID].instanceCount = 0u;
50+
const mat4x3 worldMatrix = InstData.data[globalObjectID].tform;
51+
const mat4 MVP = nbl_glsl_pseudoMul4x4with4x3(pc.data.viewProjMatrix,worldMatrix);
5252

5353
// cull
54-
const mat4 MVP = nbl_glsl_pseudoMul4x4with4x3(pc.data.viewProjMatrix,worldMatrix);
5554
bool notCulled = true;
5655
if (false)
5756
{
58-
mat2x3 bbox;
59-
bbox[0] = cullData[globalObjectID].aabbMinEdge;
60-
bbox[1] = cullData[globalObjectID].aabbMaxEdge;
57+
const mat2x3 bbox = mat2x3(instanceMeshBufferData.aabbMinEdge,instanceMeshBufferData.aabbMaxEdge);
6158
notCulled = nbl_glsl_couldBeVisible(MVP,bbox);
6259
}
6360

61+
// set up MDI
6462
if (notCulled)
6563
{
66-
const uint instanceID = atomicAdd(commandBuff[pc.data.currentCommandBufferIx].draws[drawID].instanceCount,1u)+cullData[globalObjectID].baseInstance;
64+
const uint drawID = instanceMeshBufferData.drawID;
65+
const uint drawInstanceID = atomicAdd(commandBuff[pc.data.currentCommandBufferIx].draws[drawID].instanceCount,1u)
66+
+commandBuff[pc.data.currentCommandBufferIx].draws[drawID].baseInstance;
6767

68-
instanceDataPerCamera.data[instanceID].MVP = MVP;
69-
instanceDataPerCamera.data[instanceID].detMVP = pc.data.viewProjDeterminant*staticData[globalObjectID].detWorldMatrix;
70-
instanceDataPerCamera.data[instanceID].objectID = globalObjectID;
68+
instanceDataPerCamera.data[drawInstanceID].MVP = MVP;
69+
float detMVP = pc.data.viewProjDeterminant*InstData.data[globalObjectID].determinant;
70+
instanceDataPerCamera.data[drawInstanceID].backfacingBit_objectID = globalObjectID|(floatBitsToUint(detMVP)&0x80000000u); // use MSB to denote if face orientation should be flipped
7171
}
7272
}

0 commit comments

Comments
 (0)