OpenGL で統一ブロックに STD140 を使用するのはいつですか?
100% 確実ではありませんが、「Shared」と呼ばれる、同じことを実現できる別の方法があると思います。
コーダーの好みですか?または、どちらか一方を使用する理由はありますか?
std140 は、シーンをレンダリングするためのマトリックスと照明値のコレクションなど、一度にすべてを更新する均一なブロックがある場合に最も役立ちます。シェーダーで std140 を使用してブロックを宣言すると、構造体を使用して C でメモリ レイアウトを複製できます。C からブロック内のすべての個々の値のオフセットを照会して保存する代わりに、1 回の呼び出しで glBufferData(GL_UNIFORM_BUFFER, sizeof(my_struct), &my_struct.
たとえば、vec3 は 3 つではなく 4 つの float を使用しますが、それでもはるかに簡単です。
ユニフォーム バッファ オブジェクトについては、http://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txtで説明されています。
均一ブロックのデータ ストレージは、メモリ内の 3 つのレイアウト ( packed
、shared
、または ) のいずれかを使用するように宣言できますstd140
。
packed
均一ブロックは、効率化のために実装依存のデータ レイアウトを持ち、使用されていない均一ブロックは、スペースを節約するためにコンパイラによって削除される場合があります。
shared
デフォルトのレイアウトである均一ブロックには、効率化のために実装依存のデータ レイアウトがありますが、レイアウトはブロックの構造によって一意に決定されるため、プログラム間でデータ ストレージを共有できます。
std140
均一なブロックには、標準のクロスプラットフォーム クロスベンダー レイアウトがあります。未使用のユニフォームは排除されません。
特定のstd140
パッキング動作を保証し、アプリケーションがオフセットとストライドを照会する必要がない均一なブロック レイアウト。この場合、均一なブロック宣言のみに基づいて事前に決定されている場合でも、最小サイズを照会することができます。ユニフォーム ブロック内の各ユニフォームのオフセットは、OpenGL 仕様で説明されている一連のルールを適用することにより、ユニフォーム ブロックの定義から導き出すことができます。