GLSL EndPrimitive()打破了三角形条带

时间:2014-09-22 20:51:11

标签: opengl glsl geometry-shader

我在使用运行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]绘制一个顶点,我的目标是最终让我的几何着色器输出一个由多个三角形条带组成的正方形网格。着色器按原样输出单行网格。结果如下:

apparently correct output

此时我想结束当前三角形条带原语并为下一行开始一个新原语。但是,只需取消注释上面着色器中的EndPrimitive()调用就会搞砸结果:

broken output

我误解了EndPrimitive()的某些内容吗?我的理解是它应该结束当前的三角形条并开始一个新的。由于我在循环后没有做任何事情,因此我的着色器的结果应与EndPrimitive()相同或不相同。

另外,我现在无法对不同的实施进行测试,可能是我的错误吗?有什么我可以试着找出这个问题吗?

1 个答案:

答案 0 :(得分:1)

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