Passthrough几何着色器

1 shader geometry glsl

我正在尝试构建一个简单的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?请.

Nic*_*las 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;
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)

我不知道这是否可以解决您的问题,但这些都是您的着色器的问题.