Я использую OpenGL 4.2 и не могу понять, почему я получаю ошибку GL_INVALID_VALUE в этой программе. Я получаю сообщение об ошибке при вызове glBindAttribLocation. Согласно справочной странице OpenGL 4, есть только две причины почему GL_INVALID_VALUE следует генерировать из glBindAttribLocation.
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- INVALID_VALUE генерируется, если индекс равен или больше MAX_VERTEX_ATTRIBS.
- INVALID_VALUE генерируется, если программа не является значением, сгенерированным OpenGL.
Как видно из приведенной ниже программы, условие 1 не задано, поскольку index
равно 20
, а GL_MAX_VERTEX_ATTRIBS
равно 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
не существует.