我正在尝试构建一个简单的passthrough 几何着色器,但是 我无法使用它
glDrawElements(GL_TRIANGLES, fooSize, GL_UNSIGNED_INT, NULL);
但它可以与
一起使用glDrawArrays(GL_TRIANGLES, 0, foo_INDEX);.
几何着色器是..
#version 400
#extension GL_EXT_geometry_shader4 : enable
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
void main() {
for(int i = 0; i < gl_VerticesIn; i++) {
gl_Position = gl_PositionIn[i];
EmitVertex();
}
EndPrimitive();
}
所以,有人知道为什么这个几何着色器适用于drawArrays并且不能使用drawElements?请。
答案 0 :(得分:9)
您编写了一个非常混乱且令人困惑的几何着色器。
您的第一行表示您使用的是GLSL版本4.00。这种语言将几何着色器作为核心功能;不需要扩展。然后,您的第二行启用EXT_geometry_shader4 扩展名。
问题来自于核心几何着色器和EXT_geometry_shader4 非常不同的事物。
例如,核心几何着色器中没有gl_VerticesIn
。您获得的顶点数由layout() in;
语句定义。您使用了triangles
,因此答案是3.您也可以使用gl_in.length()
找到它,其中gl_in
是包含默认顶点输入值的接口块数组。同样,核心几何着色器中不存在gl_PositionIn
;你使用gl_in[index].gl_Position
。
因此,您的几何着色器代码似乎是为EXT_geometry_shader4设计的......除了这些行:
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
这些是纯核心几何着色器;在EXT_geometry_shader4中,这些参数在OpenGL代码的链接时指定,而不是在着色器本身中指定。
所以你已经彻底混淆了编译器的一半使用EXT版本,一半使用核心版本。
您正在尝试做的正确核心版本是:
#version 400
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
void main() {
for(int i = 0; i < 3; i++) { // You used triangles, so it's always 3
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}
我不知道这是否能解决您的问题,但这些 是您的着色器的问题。