Я использую OpenGL 4.2, и я не могу понять, почему я получаю ошибку GL_INVALID_VALUE в этой программе. Я получаю сообщение об ошибке, когда я вызываю glBindAttribLocation. Согласно Справочная страница OpenGL 4, Есть только две причины, по которым GL_INVALID_VALUE должен генерироваться из glBindAttribLocation.
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
Как вы можете видеть из программы ниже, условие 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
не существует, не проблема.
Это второй раз, когда я могу вспомнить, что этот вопрос задавался через пару месяцев. В последний раз, когда это было задано, хотя не сразу видно, что это тот же вопрос, был Вот.
Это сводится к следующему: GL_MAX_VERTEX_ATTRIBS
как видит компилятор, это токен препроцессора, который определяет идентификатор, который вы можете использовать, чтобы задать драйверу OpenGL свой предел, определенный реализацией во время выполнения. Когда вы пытаетесь напечатать это значение напрямую, единственное, что вы делаете, это печатаете универсальный идентификатор, который все реализации OpenGL используют для запроса этого конкретного предела.
Чтобы получить действительный предел, зависящий от реализации, вам нужно сделать это во время выполнения:
int max_attribs;
glGetIntegerv (GL_MAX_VERTEX_ATTRIBS, &max_attribs);
Кстати, реализации OpenGL требуются только для обеспечения как минимум 16 атрибутов на каждую вершину; большинство только дают вам минимум, который объясняет, почему 20 выходит за пределы.
Других решений пока нет …