4
4
#include "drawCommon.glsl"
5
5
layout(local_size_x = WORKGROUP_SIZE) in;
6
6
7
+ #include <nbl/builtin/glsl/ext/MitsubaLoader/instance_data_descriptor.glsl>
7
8
8
9
#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
10
+ layout(set=1, binding=0, row_major) writeonly restrict buffer PerInstancePerCamera
14
11
{
15
12
DrawData_t data[];
16
13
} instanceDataPerCamera;
17
- layout(set=1, binding=2 , std430, row_major) restrict readonly buffer PerInstanceCull
14
+ layout(set=1, binding=1 , std430, row_major) restrict readonly buffer PerInstanceCull
18
15
{
19
16
CullData_t cullData[];
20
17
};
21
- layout(set=1, binding=3 , std430) restrict coherent buffer IndirectDraws
18
+ layout(set=1, binding=2 , std430) restrict coherent buffer IndirectDraws
22
19
{
23
20
nbl_glsl_DrawElementsIndirectCommand_t draws[];
24
21
} commandBuff[2];
@@ -40,33 +37,36 @@ layout(push_constant, row_major) uniform PushConstants
40
37
// we just do atomic add on the instance count
41
38
void main()
42
39
{
43
- uint globalObjectID = gl_GlobalInvocationID.x;
44
- if (globalObjectID>=pc.data.maxObjectCount)
40
+ if (gl_GlobalInvocationID.x<pc.data.maxDrawCount)
41
+ commandBuff[pc.data.currentCommandBufferIx^0x1u].draws[gl_GlobalInvocationID.x].instanceCount = 0u;
42
+
43
+ uint instanceMeshBufferID = gl_GlobalInvocationID.x;
44
+ if (instanceMeshBufferID>=pc.data.maxObjectCount)
45
45
return;
46
46
47
- const mat4x3 worldMatrix = cullData[globalObjectID].worldMatrix;
48
- const uint drawID = cullData[globalObjectID].drawID;
47
+ // fetch instance data
48
+ const CullData_t instanceMeshBufferData = cullData[instanceMeshBufferID];
49
+ const uint globalObjectID = instanceMeshBufferData.globalObjectID;
49
50
50
- // clear drawcount for next buffer
51
- commandBuff[ pc.data.currentCommandBufferIx^0x1u].draws[drawID].instanceCount = 0u ;
51
+ const mat4x3 worldMatrix = InstData.data[globalObjectID].tform;
52
+ const mat4 MVP = nbl_glsl_pseudoMul4x4with4x3( pc.data.viewProjMatrix,worldMatrix) ;
52
53
53
54
// cull
54
- const mat4 MVP = nbl_glsl_pseudoMul4x4with4x3(pc.data.viewProjMatrix,worldMatrix);
55
- bool notCulled = true;
56
- if (false)
55
+ bool notCulled;
57
56
{
58
- mat2x3 bbox;
59
- bbox[0] = cullData[globalObjectID].aabbMinEdge;
60
- bbox[1] = cullData[globalObjectID].aabbMaxEdge;
57
+ const mat2x3 bbox = mat2x3(instanceMeshBufferData.aabbMinEdge,instanceMeshBufferData.aabbMaxEdge);
61
58
notCulled = nbl_glsl_couldBeVisible(MVP,bbox);
62
59
}
63
60
61
+ // set up MDI
64
62
if (notCulled)
65
63
{
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;
67
67
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
71
71
}
72
72
}
0 commit comments