OpenGL 4.2 を使用していますが、このプログラムで GL_INVALID_VALUE エラーが発生する理由がわかりません。glBindAttribLocation を呼び出すとエラーが発生します。OpenGL 4 リファレンス ページによると、GL_INVALID_VALUE を glBindAttribLocation から生成する必要がある理由は 2 つしかありません。
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- インデックスが MAX_VERTEX_ATTRIBS 以上の場合、INVALID_VALUE が生成されます。
- program が OpenGL によって生成された値でない場合、INVALID_VALUE が生成されます。
以下のプログラムからわかるように、index
is20
とGL_MAX_VERTEX_ATTRIBS
isであるため、条件 1 は設定されません34921
。program
は を使用して OpenGL によって生成されるため、条件 2 は満たされていません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
おらず、存在しないという事実は問題ではありません。