OpenGLを初めて使用しました。 頂点シェーダとフラグメントシェーダを作成する方法と、頂点配列を作成してバッファに配置する方法を理解していますが、どうすれば2つをリンクできますか? 意味 - プログラムを実行すると、現在アクティブなバッファ上にある頂点配列が頂点シェーダに「供給」されていることがどのようにわかりますか?OpenGL - 簡単な概念の明確化が必要
これは単にglVertexAttribPointer
を使用して行われていますか?
ありがとうございます!
OpenGLを初めて使用しました。 頂点シェーダとフラグメントシェーダを作成する方法と、頂点配列を作成してバッファに配置する方法を理解していますが、どうすれば2つをリンクできますか? 意味 - プログラムを実行すると、現在アクティブなバッファ上にある頂点配列が頂点シェーダに「供給」されていることがどのようにわかりますか?OpenGL - 簡単な概念の明確化が必要
これは単にglVertexAttribPointer
を使用して行われていますか?
ありがとうございます!
実際には「現在アクティブなバッファ」はありません。 (まあ、そこですが、それは非ダイレクトステートアクセス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
さて、と私は理解しておいてくださいする - (推奨されません)VAOを使用する代わりに、「再宣言」 'glVertexAttribPointer'にあなたはGPUを伝えるために持っているすべての時間であり、バッファ内のデータをどのように扱うか? – gambit20088
何か? ** GPUにプリミティブを転送するには、OpenGL 3以降のVAOを使用する必要があります。 – ybungalobill
また、 'glVertexAttribPointer'の最初のパラメータでは、シェーダ変数への参照を書きます。これは、プログラムがシェーダに頂点を送る方法を知っていますか? – gambit20088