我一直在阅读一本关于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"]来获取属性的位置吗?如果是这样,你能想到我可能正在做的那些使它无效吗?
GLSLshader将是您正在阅读的书中定义的类.将定义一个operator [].这个GLSLshader类不是默认的(也因为OpenGL实际上是一个不存在类的C库).
FYI:GLuint只是固定32位无符号数的typedef.(例如,在C++: uint32_t)