2012-07-20 94 views
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(); 
} 

所以,有人有一个y想法为什么这个几何着色器与drawArrays一起工作,并且不能和drawElements一起工作?请。

+1

如果没有一些关于它的*“无效”的想法,你的问题就没有意义了。 – 2012-07-20 18:46:36

回答

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

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

+0

谢谢。 (我很喜欢几何着色器。)现在我只使用纯粹的核心语法, 但我的问题依然存在。 它与** glDrawArray **一起工作正常,并且**不能**与** glDrawElements一起工作**它返回“无效操作”,就好像着色器模式与绘制模式不兼容(都是三角形)=/ – 2012-07-23 12:53:46

+1

@ LennaMaule你确定它确实是由着色引起的。你没有使用几何着色器来尝试吗? – 2012-07-23 14:38:40