3

そのため、コマンド glVertexAttribPointer に関する別の SO の質問を見ていましたが、少し混乱しました。この質問に対する受け入れられた回答は、次のように説明しています。

しかし、呼び出しを行ったときに属性 0 に保存される追加の暗黙の状態があります。データは、現在 GL_ARRAY_BUFFER にバインドされているバッファーから読み取られます。

これは私には理にかなっていますが、バインドされている複数のバッファーがある場合はどうなりGL_ARRAY_BUFFERますか? メソッドは、どのglVertexAttribPointer()属性を設定するかをどのように認識しますか?

たとえば、私のコードでは、グラデーションの三角形を描いています。これを行うために、2 つの VBO を作成しました。1 つは配列内のカラー データで、もう 1 つは頂点の位置です。

glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    static const GLfloat points[] = {
    //data here
    };
    static const GLfloat colors[] = {
      //data here
    };
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    vs = glCreateShader(GL_VERTEX_SHADER);
    fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(vs, 1, &vertexShaderData, NULL);
    glShaderSource(fs, 1, &fragShaderData, NULL);
    glCompileShader(vs);
    glCompileShader(fs);
    sp=glCreateProgram();
    glBindFragDataLocation(sp, 0, "outColor");
    glAttachShader(sp, vs);
    glAttachShader(sp, fs);
    glLinkProgram(sp);
    glUseProgram(sp);
    glGenBuffers(1, &colorBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);
    glDrawArrays(GL_TRIANGLES, 0, 9);

コマンドを呼び出すとき、使用するバッファをどこで指定しますか?

4

1 に答える 1

5

これは私には理にかなっていますが、GL_ARRAY_BUFFER としてバインドされた複数のバッファーがある場合はどうなるでしょうか?

それは可能ではありません。バッファ (または任意の OpenGL オブジェクト) をターゲットにバインドすると、以前にあったものはすべて自動的にアンバインドされます。

OpenGL オブジェクト ターゲットは、グローバル変数のようなものです。グローバル整数を 3 に設定するとどうなりますか? 古い価値はなくなっています。

glVertexAttribPointerは、現在バインドされているバッファを常に使用します。したがって、最初の呼び出しでは、. 2 回目の呼び出しでは、 を使用します。GL_ARRAY_BUFFERbuffercolorBuffer

これが、現在バインドさglVertexAttribPointerれているものに作用することを覚えておくことが重要な理由です。をバインドし、アトリビュート 1 で使用するように設定した後でも、アトリビュート 0から頂点データを受け取るためです。colorBufferbuffer

したがって、複数のバッファを にバインドすることはできませんがGL_ARRAY_BUFFER、複数のバッファを頂点データのソースとして使用できます。

于 2016-06-21T18:50:58.657 に答える