Passthrough几何着色器

时间:2012-07-20 17:54:18

标签: geometry glsl shader

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

1 个答案:

答案 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();
}

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