Geometry 穿透几何体着色器

Geometry 穿透几何体着色器,geometry,glsl,shader,Geometry,Glsl,Shader,我正在尝试构建一个简单的穿透几何体着色器,但是 我不能和你一起工作 glDrawElements(GL_TRIANGLES, fooSize, GL_UNSIGNED_INT, NULL); glDrawArrays(GL_TRIANGLES, 0, foo_INDEX);. 但它确实与 glDrawElements(GL_TRIANGLES, fooSize, GL_UNSIGNED_INT, NULL); glDrawArrays(GL_TRIANGLES, 0, foo_INDEX)

我正在尝试构建一个简单的穿透几何体着色器,但是 我不能和你一起工作

glDrawElements(GL_TRIANGLES, fooSize, GL_UNSIGNED_INT, NULL);
glDrawArrays(GL_TRIANGLES, 0, foo_INDEX);.
但它确实与

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();
}
#版本400
#扩展GL\U EXT\U几何图形\U着色器4:启用
平面布置图(三角形);
布局(三角形带,最大顶点=3)输出;
void main(){
对于(int i=0;i

那么,有人知道为什么这个几何体着色器与DrawArray一起工作,而与drawElements不一起工作吗?请。

您编写了一个非常混乱的几何体着色器

第一行表示您正在使用GLSL版本4.00。该语言的核心功能是几何体着色器;不需要扩展。然后,第二行启用EXT_geometry_shader4扩展

问题来自这样一个事实:核心几何体着色器和EXT_geometry_着色器4是非常不同的东西

例如,核心几何体着色器中没有
gl_VerticesIn
。得到的顶点数由中的
layout()定义语句。您使用了
三角形
,因此答案是3。也可以使用
gl\u in.length()
找到它,其中
gl\u in
是包含默认顶点输入值的接口块数组。类似地,
gl_PositionIn
在核心几何体着色器中不存在;在[index].gl\u位置中使用
gl\u

因此,您的几何体着色器代码似乎是为EXT_geometry_shader4设计的。。。除此之外:

layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
这些是纯核心几何体着色器;在EXT_geometry_shader4中,这些参数在OpenGL代码的链接时指定,而不是在着色器本身中指定

因此,一半使用EXT版本,一半使用core版本,这完全混淆了编译器

对于您尝试执行的操作,正确的核心版本是:

#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();
}
#版本400
平面布置图(三角形);
布局(三角形带,最大顶点=3)输出;
void main(){
对于(inti=0;i<3;i++){//您使用了三角形,所以它总是3
gl_Position=gl_in[i]。gl_Position;
发射顶点();
}
EndPrimitive();
}

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

您编写了一个非常混乱的几何体着色器

第一行表示您正在使用GLSL版本4.00。该语言的核心功能是几何体着色器;不需要扩展。然后,第二行启用EXT_geometry_shader4扩展

问题来自这样一个事实:核心几何体着色器和EXT_geometry_着色器4是非常不同的东西

例如,核心几何体着色器中没有
gl_VerticesIn
。得到的顶点数由中的
layout()定义语句。您使用了
三角形
,因此答案是3。也可以使用
gl\u in.length()
找到它,其中
gl\u in
是包含默认顶点输入值的接口块数组。类似地,
gl_PositionIn
在核心几何体着色器中不存在;在[index].gl\u位置中使用
gl\u

因此,您的几何体着色器代码似乎是为EXT_geometry_shader4设计的。。。除此之外:

layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
这些是纯核心几何体着色器;在EXT_geometry_shader4中,这些参数在OpenGL代码的链接时指定,而不是在着色器本身中指定

因此,一半使用EXT版本,一半使用core版本,这完全混淆了编译器

对于您尝试执行的操作,正确的核心版本是:

#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();
}
#版本400
平面布置图(三角形);
布局(三角形带,最大顶点=3)输出;
void main(){
对于(inti=0;i<3;i++){//您使用了三角形,所以它总是3
gl_Position=gl_in[i]。gl_Position;
发射顶点();
}
EndPrimitive();
}

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

如果不知道什么“不起作用”,您的问题就没有意义。如果不知道什么“不起作用”,您的问题就没有意义。谢谢。(我不熟悉几何体着色器。)现在我只使用纯核心语法,但我的问题仍然存在。它可以与glDrawArray配合使用,但与glDrawElements不配合。它返回“无效操作”,就好像着色器模式与绘制模式不兼容(两者都是三角形)=/@LennaMaule,并且您确定它确实是由着色器引起的。你在没有几何体着色器的情况下尝试过吗?谢谢。(我不熟悉几何体着色器。)现在我只使用纯核心语法,但我的问题仍然存在。它可以与glDrawArray配合使用,但与glDrawElements不配合。它返回“无效操作”,就好像着色器模式与绘制模式不兼容(两者都是三角形)=/@LennaMaule,并且您确定它确实是由着色器引起的。你有没有在没有几何体着色器的情况下尝试过?