我正在使用运行 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()
没有它,我的着色器的结果都应该是相同的。
另外,我现在无法测试不同的实现,会不会是我的错误?有什么我可以尝试查明这个问题的吗?