2

私はanother SO question regarding the command glVertexAttribPointerを見ていて、やや混乱しました。この質問への受け入れ答えは、説明複数のGL_ARRAY_BUFFERバッファを使用できますか?

しかし、あなたが電話をかける際にも属性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

これは意味がありますが、GL_ARRAY_BUFFERとしてバインドされているバッファが複数ある場合はどうなりますか?

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

OpenGL object targetsは、グローバル変数に似ています。グローバル整数を3に設定するとどうなりますか?それは古い価値がなくなったことです。

glVertexAttribPointerGL_ARRAY_BUFFERにバインド現在が何であれ、バッファ常に使用します。最初の呼び出しではbufferが使用されます。 2回目の呼び出しでは、colorBufferが使用されます。

これは、glVertexAttribPointerが現在で動作していて、現在が動作していることを覚えておくことが重要な理由です。 colorBufferをバインドして属性1で使用するように設定した場合でも、属性0 はまだbufferから頂点データを受け取ります。

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

関連する問題