2017-02-24 5 views
14

floatintのようなプリミティブなデータ型ではなく、なぜベクトル値をユニオンで表現するのか、私はvec4のglmのソースコードの実装を見ていましたか?glm :: vecはvecの値を共用体として表すのはなぜですか?

これは私がvec4実装で見つかったコードです:

union { T x, r, s; }; 
union { T y, g, t; }; 
union { T z, b, p; }; 
union { T w, a, q; }; 

私達はちょうどT xT yT zT wを書く場合の違いは何ですか?

+1

ちょうどメモ:これは 'v.x == v.r == v.s'となるようにします – pingul

答えて

19

vec4は、一般に使用されているため:

  • 空間座標xyzrは、gba
  • テクスチャ座標w
  • 色成分stpq(これらはあまり標準化されていませんが、 LSO見組合を使用rと異なるコンテキストで使用u

は、例えば、にアクセスするために使用することができ2番目のデータメンバーは、.yまたは.gのいずれかであり、好みに応じて&セマンティクスに従います。

+1

この使用法は動作として定義されていますか?私は、組合での型打ちは分かりませんが、実際には型打ちではありません。 – chbaker0

+1

@ chbaker0特定のメンバーに1つの名前しか使用していない場合は間違いなく。あなたが複数を使用する場合...私はまだそう思う。私は、それをカバーする組合のための言語を特に持っているCをよく知っています。 C++のようには見えませんが、 "Object Lifetimes"(N4140 3.8.7)の中のいくつかのものは、異なる名前が同じタイプで同じ格納場所の異なる "オブジェクト"であるため、合法化する効果があると思います、ストレージを使用して別のストレージを使用する(これは、1つのライフタイムが終了し、もう1つが技術的に開始する)間に解放されません。 – hobbs

+0

@ chbaker0:はい、すべての型が同じであるため、よく定義された動作です。はい、C++でもそうです。 –

16

GLMは、C++が許す限りGLSLのように動作するように設計されています。 GLSLでは、ベクトルのスウィズル操作にxyzw,rgba、またはstpqを使用できます。対応する要素名は、ベクトルの同じ要素を参照します。したがって、この動作に一致させるために共用体が使用されます。

+2

ハイライトの互換性に加えてGLSLでは、私はそれを考慮していません。 – Angew

+0

これが本当の理由です。 GLMは、ネイティブに設計されたC++クラスのようには動作しません。 –

関連する問題