我正在尝试构建一个简单的passthrough 几何着色器,但我无法使其工作
glDrawElements(GL_TRIANGLES, fooSize, GL_UNSIGNED_INT, NULL);
Run Code Online (Sandbox Code Playgroud)
但它确实有效
glDrawArrays(GL_TRIANGLES, 0, foo_INDEX);.
Run Code Online (Sandbox Code Playgroud)
几何着色器是..
#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();
}
Run Code Online (Sandbox Code Playgroud)
所以,有人知道为什么这个几何着色器与drawArrays一起工作并且不能使用drawElements?请.
您编写了一个非常混乱且令人困惑的几何着色器.
您的第一行表示您使用的是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;
Run Code Online (Sandbox Code Playgroud)
这些是纯核心几何着色器; 在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();
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否可以解决您的问题,但这些都是您的着色器的问题.