5

私の理解では、glBindAttribLocation(シェーダー プログラムをリンクする前に) アトリビュートへのハンドルをカスタム設定することができます。これは後で でレンダリングするときに使用できますglVertexAttribPointer

ただし、それを使用する必要はありません。代わりに、OpenGL がハンドルを割り当てて無限の知恵で選択することに依存するだけでかまいません。glGetAttribLocationただし、でレンダリングする前のある時点でを使用して OpenGL にクエリを実行し、このハンドルを見つける必要がありますglVertexAttribPointer

glGetAttribLocationレンダリングするたびに使用できるようになりましglGetAttribLocationたが、プログラムのビルド後に一度だけ使用してハンドルを保存できるため、無駄に思えます。

glBindAttribLocationしたがって、本質的に、このハンドルは使用または使用のいずれかで保存できます。glGetAttribLocationパフォーマンスに関して違いはありますか?また、一方の長所と短所は何ですか?

4

1 に答える 1

8

直接的なパフォーマンスの違いについてはあまり語れませんが、glBindAttribLocationorを使用するかどうかに関係なくglGetAttribLocation、とにかく初期化時にそれを行っているため、とにかく無関係である必要があります (それでも、呼び出しglGetAttribLocationはそれほど害を及ぼすべきではありません)。


しかし、明示的な GL に決定させることの主な違いと利点は、独自の属性セマンティクスを確立し、シェーダーごとglBindAttribLocationに一貫性を保つことができることです。

たくさんのオブジェクトとたくさんのシェーダーがあるとします。しかし、各シェーダーには位置属性 (および法線、色など) の概念があり、同様に各オブジェクトには位置、法線などの属性データがありますglBindAttribLocation。別のシェーダー。したがって、さまざまなシェーダーでオブジェクトを描画する場合、単一の頂点形式を使用できます (つまりglVertexAttribPointer、個々の属性を呼び出す方法と、個々の有効化呼び出しの方法)。

一方、glGetAttribLocationどの属性がどのインデックスを取得するかについての保証はありません (おそらく、1 つのシェーダーに追加の属性があり、コンパイラーはそれらを並べ替える良い方法だと考えています)。したがって、この場合glVertexAttribPointer、各オブジェクトおよび各シェーダーに対して異なる頂点フォーマット (呼び出し) を使用します。

glVertexAttribPointerこれは、頂点配列オブジェクト (すべての属性状態、特にandglEnableVertexAttribArray呼び出しをカプセル化する) を使用する場合にさらに重要になります。この場合、通常glVertexAttribPointer、別のシェーダーでオブジェクトを描画するたびに呼び出す必要はありません (したくありません)。


要するに、常に を使用することglBindAttribLocationです。せいぜい (大規模なアプリケーションでは)、多くのオブジェクトとシェーダーの管理の問題と、glVertexAttribPointer各フレームでの多くの不要な呼び出しを節約できます (そして、パフォーマンスが向上する可能性があります)。小さなアプリケーション) は良い習慣であり、拡張機能に対してオープンで柔軟な状態を保つことができます。補足として、デスクトップ GL 3+ (または ARB_explicit_attrib_location 拡張機能を使用) では、API 呼び出しを必要とせずに、シェーダーで属性の場所を直接割り当てることもできます。

于 2013-04-03T13:21:26.560 に答える