直接的なパフォーマンスの違いについてはあまり語れませんが、glBindAttribLocation
orを使用するかどうかに関係なくglGetAttribLocation
、とにかく初期化時にそれを行っているため、とにかく無関係である必要があります (それでも、呼び出しglGetAttribLocation
はそれほど害を及ぼすべきではありません)。
しかし、明示的な GL に決定させることの主な違いと利点は、独自の属性セマンティクスを確立し、シェーダーごとglBindAttribLocation
に一貫性を保つことができることです。
たくさんのオブジェクトとたくさんのシェーダーがあるとします。しかし、各シェーダーには位置属性 (および法線、色など) の概念があり、同様に各オブジェクトには位置、法線などの属性データがありますglBindAttribLocation
。別のシェーダー。したがって、さまざまなシェーダーでオブジェクトを描画する場合、単一の頂点形式を使用できます (つまりglVertexAttribPointer
、個々の属性を呼び出す方法と、個々の有効化呼び出しの方法)。
一方、glGetAttribLocation
どの属性がどのインデックスを取得するかについての保証はありません (おそらく、1 つのシェーダーに追加の属性があり、コンパイラーはそれらを並べ替える良い方法だと考えています)。したがって、この場合glVertexAttribPointer
、各オブジェクトおよび各シェーダーに対して異なる頂点フォーマット (呼び出し) を使用します。
glVertexAttribPointer
これは、頂点配列オブジェクト (すべての属性状態、特にandglEnableVertexAttribArray
呼び出しをカプセル化する) を使用する場合にさらに重要になります。この場合、通常glVertexAttribPointer
、別のシェーダーでオブジェクトを描画するたびに呼び出す必要はありません (したくありません)。
要するに、常に を使用することglBindAttribLocation
です。せいぜい (大規模なアプリケーションでは)、多くのオブジェクトとシェーダーの管理の問題と、glVertexAttribPointer
各フレームでの多くの不要な呼び出しを節約できます (そして、パフォーマンスが向上する可能性があります)。小さなアプリケーション) は良い習慣であり、拡張機能に対してオープンで柔軟な状態を保つことができます。補足として、デスクトップ GL 3+ (または ARB_explicit_attrib_location 拡張機能を使用) では、API 呼び出しを必要とせずに、シェーダーで属性の場所を直接割り当てることもできます。