1

我正在尝试构建一个简单的直通几何着色器,但我无法使其与

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 吗?请。

4

1 回答 1

12

您编写了一个非常混乱和令人困惑的几何着色器。

您的第一行表明您使用的是 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();
}

我不知道这是否会解决您的问题,但这些您的着色器的问题。

于 2012-07-20T18:58:23.417 回答