我正在构建一个着色器程序和GL宿主环境,该环境将执行相对简单的任务:
(triangle1, vert1)
,(triangle1, vert2)
,(triangle1, vert3)
,(triangle2, vert1)
,(triangle2, vert2)
,(triangle2, vert3)
等为了索引我的SSBO,我需要以某种方式推断“ triangleID”。我仔细阅读了GS / Tess规格并做了一些实验。似乎GS内置输入没有它。 gl_PrimitiveIDIn似乎是指三角形的原始索引,如在顶点着色器中看到的那样,并且在细分期间不会递增。
最后,我想到了另一个SSBO的想法/解决方法,该SSBO的“原始计数器”每次执行GS时都会以atomicAdd(primCount, 1)
递增:
layout ( triangles ) in;
layout ( triangle_strip, max_vertices = 3 ) out;
layout(std140, binding = 1) buffer AuxSSBO {
int primCount;
int lock;
int pad2;
int pad3;
};
layout(std140, binding = 2) writeonly buffer TrianglesSSBO {
writeonly vec4 pos[];
};
void main() {
int idx = atomicAdd(primCount, 1);
for (int i = 0; i < 3; ++i) {
gl_Position = gl_in[i].gl_Position;
gl_PrimitiveID = gl_PrimitiveIDIn;
pos[3 * idx + i] = vec4(gl_Position.xyz, 1.0);
EmitVertex();
}
EndPrimitive();
}
昨天我花了很多时间来完善上面的代码,因为当时我正在遇到各种各样的比赛条件。现在,看来,它可以解决我的GPU /驱动程序上的问题,但我不确定它是否100%正确。
所以我的第一个问题是:
我的第二个问题是关于性能的:
P.S。完整的代码在这里:https://pastebin.com/SagKZEyi
P.S.S使用DrawArraysIndirect()更新的代码在这里:https://gist.github.com/lhog/432af74ba41259e062f18910b5904684
谢谢!