4

仕様によると:

メンバーがスカラーまたはベクトルの配列である場合、ベースアラインメント+ *および配列ストライドは、ルール(1)、(2)、および(3)に従って、単一の+*配列要素のベースアラインメントと一致するように設定されます。 +*をvec4のベース配列に切り上げます。配列の+*末尾にパディングがある場合があります。配列に続くメンバーのベースオフセットは、ベースアライメントの次の倍数に切り上げられます+*。

これは、(float)vec3のサイズ3の配列がある場合、次のようになることを意味しますか?

vec3、vec3、vec3、(vec4の倍数に到達するための12の空のバイト)、(最後の文のために16の空のバイト)

また

vec3、(4空のバイト)、vec3、(4空のバイト)vec3、(4空のバイト)、(最後の文のために16の空のバイト)

4

2 に答える 2

5

実際の OpenGL仕様、バージョン4.3(PDF)から:

3:メンバーがN個の基本マシンユニットを消費するコンポーネントを持つ3コンポーネントベクトルの場合、ベースアライメントは4Nです。

4:メンバーがスカラーまたはベクトルの配列である場合、ベースアラインメントとアレイストライドは、ルール(1)、(2)、および(3)に従って、単一の配列要素のベースアラインメントと一致するように設定され、切り上げられます。 vec4のベースアラインメントに。配列の最後にパディングがある場合があります。配列に続くメンバーのベースオフセットは、ベースアライメントの次の倍数に切り上げられます。

したがって、vec3aのベースアライメントは4*4です。したがって、'sの配列のベースアラインメントと配列ストライドはvec34*4です。ストライドは、ある要素から次の要素までのバイト数です。したがって、各要素のサイズは16バイトで、最初の12バイトが実際のvec3データです。

最後に、最後にベースアライメントに等しいパディングがあるので、そこから空のスペースがあります。

または、図の形式では、vec3[3]次のようになります。

|#|#|#|0|#|#|#|0|#|#|#|0| 

ここで、各セルは4バイトで、#実際のデータであり、0未使用のデータです。

于 2013-03-25T14:21:41.920 に答える
1

ない。

レッドブックの付録Lには、次のように記載されています。

  • スカラーまたはベクトルの配列->配列内の各要素は、基になる型のサイズ(vec3の場合はsizeof(vec4))であり、任意の要素のオフセットは、そのインデックス(ゼロベースのインデックスを使用)に要素サイズを掛けたものです(再びsizeof(vec4))。配列全体がvec4のサイズの倍数になるように埋め込まれます。

したがって、正解はvec3、(4空)、vec3、(4空)、vec3、(4空)->48バイトです。

于 2013-03-25T13:50:47.437 に答える