如何使用GLSLshader :: operator []

Fra*_*cis -1 c++ opengl

我一直在阅读一本关于OpenGL的书,上面写着你可以使用GLSLshader :: operator []和我希望该位置获取该位置的属性的名称.但是当我使用它时(例子如下),程序崩溃了.

GLuint program_id;
...
glLinkProgram(program_id);
...
...
...
glEnableVertexAttribArray(program_id["position");
glVertexAttribPointer(program_id["position"], ... );
Run Code Online (Sandbox Code Playgroud)

当我调试它时返回105,即使我希望它返回0.我已指定该位置应为0,当我硬编码时,它按预期工作:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ... );
Run Code Online (Sandbox Code Playgroud)

这是顶点着色器的行:

layout(location = 0) in vec3 position;
Run Code Online (Sandbox Code Playgroud)

我不确定我是否误解了如何使用它.到目前为止,我总是硬编码属性位置,但我希望能够这样做.我知道我也可以用

glGetAttribLocation(program_id, "position");
Run Code Online (Sandbox Code Playgroud)

这工作(它返回我指定的位置),但着色器["位置"]看起来更清晰,如果使用[]运算符是一种方法,我想知道如何做而不是只是找到一个努力使其发挥作用.

所以我的问题是你可以使用GLSLshader :: operator []如shader ["position"]来获取属性的位置吗?如果是这样,你能想到我可能正在做的那些使它无效吗?

Mar*_*aux 5

GLSLshader将是您正在阅读的书中定义的类.将定义一个operator [].这个GLSLshader类不是默认的(也因为OpenGL实际上是一个不存在类的C库).

FYI:GLuint只是固定32位无符号数的typedef.(例如,在C++: uint32_t)

  • 不必要; `GLuint`需要***为32位."`unsigned integer`"并不意味着任何大小.在适用的地方,它可能是`typedef unsigned int GLuint`但是为了便携性,不要假设. (2认同)