如何使用 GLSLshader::operator[]

How to use GLSLshader::operator[]

本文关键字:operator GLSLshader 何使用      更新时间:2023-10-16

我一直在阅读一本关于OpenGL的书,其中说你可以使用GLSLshader::operator[]和我想要位置的属性的名称来获取该位置。但是,当我使用它时(下面的示例(,程序崩溃了。

GLuint program_id;
...
glLinkProgram(program_id);
...
...
...
glEnableVertexAttribArray(program_id["position");
glVertexAttribPointer(program_id["position"], ... );

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

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ... );

这是顶点着色器中的线条:

layout(location = 0) in vec3 position;

不确定我是否误解了如何使用它。到目前为止,我一直对属性位置进行硬编码,但我希望能够以这种方式做到这一点。我知道我也可以使用

glGetAttribLocation(program_id, "position");

并且有效(它返回我指定的位置(,但着色器["位置"]对我来说看起来更清晰,如果使用 [] 运算符是一种方法,我想知道如何做到这一点,而不是只是找到一个解决方法让它工作。

所以我的问题是你能使用 GLSLshader::operator[] (例如着色器["位置"(来获取属性的位置吗?如果是这样,你能想到我可能正在做什么让它不起作用吗?

GLSLshader 将是你正在阅读的书中定义的一个类。将定义一个运算符 []。这个 GLSLshader 类不是默认的(也因为 OpenGL 实际上是一个不存在类的 C 库(。

仅供参考:GLuint只是一个固定的 32 位无符号数字的 typedef。(例如C++:uint32_t(