2017-01-08 24 views
2

OpenGLを初めて使用しました。 頂点シェーダとフラグメントシェーダを作成する方法と、頂点配列を作成してバッファに配置する方法を理解していますが、どうすれば2つをリンクできますか? 意味 - プログラムを実行すると、現在アクティブなバッファ上にある頂点配列が頂点シェーダに「供給」されていることがどのようにわかりますか?OpenGL - 簡単な概念の明確化が必要

これは単にglVertexAttribPointerを使用して行われていますか?

ありがとうございます!

答えて

2

実際には「現在アクティブなバッファ」はありません。 (まあ、そこですが、それは非ダイレクトステートアクセスAPIでのみVAO仕様の時に関連するのです。)

頂点配列オブジェクト(VAOは)内のデータに(glVertexAttribPointerを介して設定)のポインタを保持していますメモリバッファこれらのバッファへのバインディングは、VAOの状態の一部です。 VAOをバインドすると、その後のglDraw*コマンドは、現在のVAOにバインドされたバッファから頂点をパイプラインに転送します。理解を簡単にするため

は、ここにその状態を設定するために使用される関連のOpenGL 4.5ダイレクトステートアクセス関数名で、おおよそ何であるかVAOです:あなたはglVertexAttribPointerを呼び出すと

struct VertexArrayObject 
{ 
    // VertexArrayElementBuffer 
    uint element_buffer; 

    struct Binding { 
     // VertexArrayVertexBuffers 
     uint buffer; 
     intptr offset; 
     sizei stride; 

     // VertexArrayBindingDivisor 
     uint divisor; 
    } bindings[]; 

    struct Attrib { 
     // VertexArrayAttribBinding 
     uint binding; // This is an index into bindings[] 

     // EnableVertexArrayAttrib 
     bool enabled; 

     // VertexArrayAttrib*Format 
     int size; 
     enum type; 
     boolean normalized; 
     boolean integer; 
     boolean long; 
     uint relativeoffset; 
    } attribs[]; 
}; 

それは基本的にありません現在バインドされVAOに次

vao.attribs[index].binding = index; 
vao.attribs[index].size = size; 
vao.attribs[index].type = type; 
vao.attribs[index].normalized = normalized; 
vao.attribs[index].relativeoffset = 0; 
vao.bindings[index].buffer = current ARRAY_BUFFER; 
vao.bindings[index].offset = pointer; 
vao.bindings[index].stride = stride; // if stride == 0 computes based on size and type 
+0

さて、と私は理解しておいてくださいする - (推奨されません)VAOを使用する代わりに、「再宣言」 'glVertexAttribPointer'にあなたはGPUを伝えるために持っているすべての時間であり、バッファ内のデータをどのように扱うか? – gambit20088

+0

何か? ** GPUにプリミティブを転送するには、OpenGL 3以降のVAOを使用する必要があります。 – ybungalobill

+0

また、 'glVertexAttribPointer'の最初のパラメータでは、シェーダ変数への参照を書きます。これは、プログラムがシェーダに頂点を送る方法を知っていますか? – gambit20088

関連する問題