OpenGL 4.2 glBindAttribLocation недопустимое значение?

Я использую OpenGL 4.2, и я не могу понять, почему я получаю ошибку GL_INVALID_VALUE в этой программе. Я получаю сообщение об ошибке, когда я вызываю glBindAttribLocation. Согласно Справочная страница OpenGL 4, Есть только две причины, по которым GL_INVALID_VALUE должен генерироваться из glBindAttribLocation.

void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);

  1. INVALID_VALUE генерируется, если индекс равен или больше, чем MAX_VERTEX_ATTRIBS.
  2. 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 не существует, не проблема.

3

Решение

Это второй раз, когда я могу вспомнить, что этот вопрос задавался через пару месяцев. В последний раз, когда это было задано, хотя не сразу видно, что это тот же вопрос, был Вот.

Это сводится к следующему: GL_MAX_VERTEX_ATTRIBS как видит компилятор, это токен препроцессора, который определяет идентификатор, который вы можете использовать, чтобы задать драйверу OpenGL свой предел, определенный реализацией во время выполнения. Когда вы пытаетесь напечатать это значение напрямую, единственное, что вы делаете, это печатаете универсальный идентификатор, который все реализации OpenGL используют для запроса этого конкретного предела.

Чтобы получить действительный предел, зависящий от реализации, вам нужно сделать это во время выполнения:

int max_attribs;
glGetIntegerv (GL_MAX_VERTEX_ATTRIBS, &max_attribs);

Кстати, реализации OpenGL требуются только для обеспечения как минимум 16 атрибутов на каждую вершину; большинство только дают вам минимум, который объясняет, почему 20 выходит за пределы.

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]