'gl_VerticesIn':未声明的标识符

KTC*_*KTC 2 opengl glsl geometry-shader

为什么编译GLSL几何着色器会出现此错误?

错误:0:15:'gl_VerticesIn':未声明的标识符

这是着色器:

// makes wireframe triangles.


#version 330
#extension GL_ARB_geometry_shader4 : enable


layout(triangles) in;
layout(line_strip, max_vertices = 4) out;


void main(void)
{
    for (int i = 0; i < gl_VerticesIn; i++)
    {
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }

    gl_Position = gl_in[0].gl_Position;
    EmitVertex();

    EndPrimitive();
}
Run Code Online (Sandbox Code Playgroud)

对我来说似乎很简单,但我找不到关于"gl_VerticesIn"的更多信息,我认为这应该是内置的.如果我只用"3"替换"gl_VerticesIn",一切正常.

我正在使用GeForce GTX 765M和OpenGL 3.3核心配置文件.我没有使用任何其他GPU的此错误.我的司机是最新的.

And*_*man 8

首先,gl_VerticesIn仅在声明中声明GL_ARB_geometry_shader4几何着色器是GLSL 3.30 中的核心.在给定着色器版本的情况下,甚至没有理由使用几何着色器的扩展形式,这样做只会使GLSL编译器和链接器的工作更加混乱.

现在,要真正解决您的问题:

    而不是使用gl_VerticesIn,使用gl_in.length ().真的很简单.  

当然,删除冗余扩展指令也是一个好主意.

  • @KTC:Google并不总是找到OpenGL问题答案的最佳方式.http://www.opengl.org/registry/对已发布的每个OpenGL版本都有正式的规范.如果你看一下[GLSL 3.30规范](http://www.opengl.org/registry/doc/GLSLangSpec.3.30.6.clean.pdf),请参阅第9页.36它以比谷歌给你的更权威的格式提供了大量关于这个主题的有用信息. (3认同)