34

非常に基本的なOpenGL3.2(コアプロファイル)アプリケーションをまとめようとしています。三角形の頂点位置を含むVBOを作成することになっている次のコードでは、の呼び出しはglVertexAttribPointer失敗し、OpenGLエラーが発生しますGL_INVALID_OPERATION。これはどういう意味ですか、どうすれば修正できますか?

GLuint vbo, attribLocation = glGetAttribLocation(...);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
GLfloat vertices[] = { 0, 1, 0, 1, 0, 0, -1, 0, 0 };
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(attribLocation);
// At this point, glGetError() returns GL_NO_ERROR.
glVertexAttribPointer(attribLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
// At this point, glGetError() returns GL_INVALID_OPERATION.
4

1 に答える 1

62

まず、いくつかの予備知識を邪魔にならないようにしましょう。

glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

これをやめなさい。あなたはすでにコアOpenGLコンテキストを求めています。上位互換性は必要ありません、そしてそれはあなたのために何もしません。これは、3.0で廃止されたものの、削除されなかったときの古いフラグでした。あなたはそれを必要としません。

しかし、それはあなたの問題を引き起こしていません。これは:

glEnableVertexAttribArray(program.getAttrib("in_Position"));
// A call to getGLError() at this point prints nothing.
glVertexAttribPointer(program.getAttrib("in_Position"), 3, GL_FLOAT, GL_FALSE, 0, 0);
// A call to getGLError() at this point prints "OpenGL error 1282".

まず、ここにも明らかなドライバーのバグがあります。これエラーを発行しているglEnableVertexAttribArrayはずだからです。または、チェックしたときに間違えました。GL_INVALID_OPERATION

なぜ両方の関数がエラーになるのですか?頂点配列オブジェクトを使用しなかったためです。glEnableVertexAttribArray現在のVAOに状態を設定します。現在のVAOがないため、エラーが発生します。同じことがglVertexAttribPointer。それらのページの両方のエラーのリストにも含まれています。

互換性コンテキストではVAOは必要ありませんが、コアコンテキストでは必要です。あなたが求めたもの。だから...あなたは1つ必要です:

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

それをセットアップのどこかに置くと、プログラムが機能します。

于 2012-11-15T20:00:41.577 に答える