web-dev-qa-db-ja.com

glGenBuffersとglCreateBuffersの違い

OpenGL 4.5を使用しているか、GL_ARB_direct_state_access拡張機能、新しい関数 glCreateBuffers があります。

この関数の署名は glGenBuffers と同じですが、次のように指定します。

n以前に使用されなかったbuffersのバッファー名を返します。それぞれのバッファー名は、指定されていないターゲットにバインドされているかのように初期化された新しいバッファーオブジェクトを表します

glGenBuffersの仕様は次のとおりです。

glGenBuffersを使用して最初に削除されない限り、glDeleteBuffersの呼び出しによって返されたバッファーオブジェクト名は、後続の呼び出しによって返されません。

そのため、glCreateBuffersによって返されるバッファ名は、それ自体で再び使用されることはありませんが、glGenBuffersによって使用される可能性があります。

glCreateBuffersは常に新しいバッファーオブジェクトを作成してその名前を返すようです。glGenBuffersは新しいバッファーを作成しますが、それ以降に削除された以前のバッファーがない場合のみです。

この機能を追加するとどのような利点がありますか?

glCreateBuffersではなくglGenBuffersをいつ使用すればよいですか?


追伸.
これはすべてを表すと思いますglCreate*によって追加された関数GL_ARB_direct_state_access

18
CoffeeandCode

ここで気づいているのは、基本的にAPIを整理して、シェーダーおよびプログラムオブジェクトの作成に対する一貫性を保つことです。これらは常に1回の呼び出しで生成および初期化され、そのように機能するAPIの唯一の部分でした。他のすべてのオブジェクトは、最初にglGen* (...)を使用して予約され、後で予約名をターゲットにバインドすることによって初期化されました。

実際、GL 3.0以前は、glGen* (...)をすべてスキップして、どこかに一意の番号をバインドするだけでオブジェクトを作成することができました。

GL 4.5では、すべてのタイプのオブジェクトにglCreate* (...)関数が与えられ、GL 4.5。この方法は、オブジェクトの変更(この場合は作成)でバインディング状態の変更(および場合によっては復元)を必要としないダイレクトステートアクセスにうまく適合します。


多くのオブジェクトrequireターゲット(egテクスチャ)この方法でAPIを使用する場合、ただし、バッファオブジェクトはすべての意図とタイプレスの目的のためのものです。そのため、API署名は同一です。このインターフェイスでバッファオブジェクトを作成すると、 "指定されていないターゲットにバインドされているかのように初期化されます。" GLのほとんどのタイプのオブジェクト。それらを正しく初期化するにはターゲットが必要です。

ここでの主な考慮事項は、GL=でオブジェクトの状態を作成および設定することで、特定のターゲットにバインドされたオブジェクトが変更されないままであると期待する他のコードに影響を与えないようにすることです。つまり、 Direct State Accessが作成された目的。これが、これらの機能が存在する主な理由です。

理論的には、dariが指摘しているように、バッファーオブジェクトを特定のターゲットにバインドして初期化すると、ドライバーの意図する使用法に関するヒントがドライバーに与えられる可能性があります。ただし、あまりストックしません。つまり、glBufferData (...)が呼び出されたときの実際の使用フラグと同じくらい不鮮明です。せいぜいヒント。

13

OpenGL 4.5仕様-6.1バッファオブジェクトの作成とバインド:

バッファオブジェクトは、GenBuffersによって返された名前をバッファターゲットにバインドすることによって作成されます。バインディングは、

void BindBuffer(enum target、uint buffer);

targetは、表6.1にリストされているターゲットの1つでなければなりません。 bufferという名前のバッファオブジェクトが以前にバインドされていない場合、GLは、ゼロサイズのメモリバッファで初期化された新しい状態ベクトルを作成しますであり、すべての状態と表6.2にリストされている同じ初期値を使用します。

したがって、glGenBuffersglCreateBuffersの違いは、glGenBuffersは未使用の名前のみを返すのに対し、glCreateBuffersは上記の状態ベクトルを作成および初期化することです。


使用法:

glGenBuffers + glBindBufferを使用することをお勧めします。

GLは、初期バインディングに基づいて、ストレージの場所とレイアウトについて異なる選択を行う場合があります。

glCreateBuffersでは初期バインディングが指定されていないため、この選択はできません。

5
dari

glCreateBuffersには、バッファーオブジェクトが型指定されていないため、ターゲットがありません。最初のバインディングターゲットは、OpenGLのヒントとしてのみ使用されていました。そして、クロノスはglCreateBufferstargetパラメータを与えることを検討しましたが、彼らはそれに反対しました:

NamedBufferData(および元のEXTの対応する関数)には、<target>パラメータが含まれていません。実装では、このパラメーターに基づいて、データストアの使用について初期の仮定を行うことができますか?どこに行ったの?戻す必要がありますか?

解決済み:バッファのターゲットパラメータは不要。 Implemetations [sic]は、<target>パラメータに基づいて使用を想定していません。 AMD_pinned_memoryを実行するベンダー拡張は1つだけです。バッファーの使用を指定する一貫したアプローチのA [原文]は、BufferStorageの<flags>パラメーターに新しいフラグを追加することです。

強調が追加されました。

4
Nicol Bolas