顶点在几何着色器中的索引和SSBO性能

时间:2020-03-22 21:18:35

标签: performance opengl opengl-4 transform-feedback ssbo

我正在构建一个着色器程序和GL宿主环境,该环境将执行相对简单的任务:

  1. 运行VS-> TCS-> TES-> GS着色器阶段集 三角形(补丁)。 TES / TCS确实会产生其他镶嵌化的 三角形。
  2. 创建一个简单的SSBO,其中包含足够数量的vec4 元素。 SSBO将保存镶嵌的结果,即坐标 网格的顶点
  3. 在GS运行期间,GS会将三角形顶点写入SSBO 这样,各个三角形的顶点就可以进入 三个,即(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%正确。

所以我的第一个问题是:

  • 在我的情况下,最好的推断三角形索引的方法是什么?

我的第二个问题是关于性能的:

  • 我有另一个基于变换反馈对象和缓冲区的任务实现,我必须说它的工作速度提高了4倍(每帧2.0毫秒与0.5毫秒)。我想知道为什么SSBO后端要比TF后端慢得多,并且有什么我可以做的才能使其运行得更快?

P.S。完整的代码在这里:https://pastebin.com/SagKZEyi

P.S.S使用DrawArraysIndirect()更新的代码在这里:https://gist.github.com/lhog/432af74ba41259e062f18910b5904684

谢谢!

0 个答案:

没有答案