0

我正在使用运行 Mavericks 的 Intel HD 4000 图形的 Macbook Pro 上试验几何着色器。我注意到EndPrimitive()通话中有一些奇怪的行为。这是我的几何着色器:

#version 150 core

layout(points) in;
layout(triangle_strip, max_vertices = 512) out;

void main() {
    vec4 start_pos = gl_in[0].gl_Position + vec4(-0.5, -0.5, 0.0, 0.0);
    vec4 bottom_vertex = start_pos;

    for (int i = 0; i < 17; ++i) {
        bottom_vertex = start_pos + vec4(float(i) * float(1.0 / 16.0), 0.0, 0.0, 0.0);
        gl_Position = bottom_vertex;
        EmitVertex();

        gl_Position = bottom_vertex + vec4(0.0, 1.0/16.0, 0.0, 0.0);
        EmitVertex();
    }
    //EndPrimitive();
}

该程序使用glfw并请求 OpenGL 3.2 核心上下文。我只画了一个顶点,[0, 0]我的目标是最终让我的几何着色器输出一个由多个三角形条带组成的方形网格。着色器按原样输出网格的单行。结果如下:

显然正确的输出

那时我想结束当前的三角形带原语并为下一行开始一个新的。然而,简单地取消注释EndPrimitive()上面着色器中的调用会破坏结果:

输出中断

我误解了什么EndPrimitive()吗?我的理解是它应该结束当前的三角形带并开始一个新的。由于在循环之后我没有做任何事情,因此无论有EndPrimitive()没有它,我的着色器的结果都应该是相同的。

另外,我现在无法测试不同的实现,会不会是我的错误?有什么我可以尝试查明这个问题的吗?

4

1 回答 1

1

原来错误出在我的主机代码中。我glDrawArrays()用错误的值作为最后一个参数调用。这可能是未定义的行为,因为我发出调用以绘制比我的数组缓冲区包含的更多的点。解决该问题可以EndPrimitive()按预期工作。

于 2014-09-22T21:43:06.957 回答