我正在使用 OpenGL 4.2,但我无法弄清楚为什么我在该程序中收到 GL_INVALID_VALUE 错误。调用 glBindAttribLocation 时出现错误。根据OpenGL 4 参考页,应该从 glBindAttribLocation 生成 GL_INVALID_VALUE 只有两个原因。
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- 如果索引等于或大于 MAX_VERTEX_ATTRIBS,则生成 INVALID_VALUE。
- 如果程序不是 OpenGL 生成的值,则会生成 INVALID_VALUE。
从下面的程序可以看出,条件 1 没有设置,因为index
is20
和GL_MAX_VERTEX_ATTRIBS
is 34921
。条件 2 不满足,因为program
OpenGL 使用glCreateProgram()
. 那么我怎么可能GL_INVALID_VALUE
出错呢?
// test.cpp
#include <GL/glew.h>
#include <GL/glut.h>
#include <iostream>
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutCreateWindow("Test");
glewInit();
std::cout << "Max Vertex Attributes : " << GL_MAX_VERTEX_ATTRIBS << std::endl;
// create program
GLuint program = glCreateProgram();
if ( program == 0 )
std::cout << "Program error" << std::endl;
// clear existing errors
if ( glGetError() != GL_NO_ERROR )
std::cout << "Pre-existing error" << std::endl;
// bind attribute location to index 20
glBindAttribLocation(program, 20U, "DoesNotExist");
// why is this generating an INVALID_VALUE error?
if ( glGetError() == GL_INVALID_VALUE )
std::cout << "Invalid value error" << std::endl;
glDeleteProgram(program);
return 0;
}
终端输出
$ g++ test.cpp -lGLEW -lglut
$ ./a.out
Max Vertex Attributes : 34921
Invalid value error
还要验证 OpenGL 4.2
$ glxinfo | grep OpenGL
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GT 540M/PCIe/SSE2
OpenGL version string: 4.2.0 NVIDIA 304.64
OpenGL shading language version string: 4.20 NVIDIA via Cg compiler
OpenGL extensions:
注:根据参考页。“可以在任何顶点着色器对象绑定到指定的程序对象之前调用glBindAttribLocation。还允许将通用属性索引绑定到顶点着色器中从未使用过的属性变量名称。” 因此,没有加载着色器并且DoesNotExist
不存在的事实不是问题。