OpenGL 4.2를 사용하고 있는데 왜이 프로그램에서 GL_INVALID_VALUE 오류가 발생하는지 알 수 없습니다. glBindAttribLocation을 호출하면 오류가 발생합니다. OpenGL 4 reference page에 따르면 glBindAttribLocation에서 GL_INVALID_VALUE를 생성해야하는 이유는 두 가지뿐입니다. 인덱스가 동일하거나 MAX_VERTEX_ATTRIBS보다 크면OpenGL 4.2 glBindAttribLocation 값이 잘못 되었습니까?
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- INVALID_VALUE 생성된다.
- 프로그램이 OpenGL에서 생성 된 값이 아니면 INVALID_VALUE가 생성됩니다. 아래의 프로그램에서 볼 수 있듯이
index
는20
및GL_MAX_VERTEX_ATTRIBS
이34921
입니다 때문에
, 조건 1이 설정되어 있지 않습니다. 조건 2는 program
이 OpenGL에 의해 glCreateProgram()
을 사용하여 생성되기 때문에 충족되지 않습니다. 그렇다면 어떻게하면 GL_INVALID_VALUE
오류가 발생할 수 있습니까? reference page에 따르면
// 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
존재하지 않는다는 사실은 문제가 아닙니다.
은 드라이버 버그 일 수 있지만 왜이 작업을 수행하고 있습니까? 나는 어떤 점도 보지 못했다 ... 4.2 또한 명시 적 속성 위치를 갖는다. – yngccc
이것은 훨씬 더 큰 프로그램에서 버그를 복제하는 단지 거짓 프로그램입니다. 4.2에서 셰이더에서 속성 위치를 정의 할 수 있지만 위치를 바인딩하는 것이 최적이라는 방식으로 프로그램을 구조화했음을 알고 있습니다. 또한 이것은 Nvidia 560 GTX가있는 OpenGL 4.2를 실행하는 다른 컴퓨터에서도 반복 가능합니다. 나는 운전사를 새롭게하려고 노력할 것이다 – jodag