差分

ナビゲーションに移動 検索に移動

Metalのデータ型

3,785 バイト追加, 2022年6月9日 (木) 02:23
一方、[[Metal]]では「必ず2の乗数」になるのでそのような手計算が必要ない。
[[HLSL]]や[[GLSL]]の感覚でサイズ調整すると無駄が発生するので注意すること。
 
=== ベクトル成分へのアクセス ===
; インデクサ
ベクトル型の成分へのアクセスには配列のインデックスを使用することができる。
 
<source lang="c">
float4 pos = float4(1.0f, 2.0f, 3.0f, 4.0f);
 
float x = pos[0]; // x = 1.0f
float y = pos[2]; // y = 3.0f
</source>
 
<source lang="c">
float4 vA = float4(1.0f, 2.0f, 3.0f, 4.0f);
float4 vB;
 
for (int i=0; i<4; i++) {
vB[i] = vA[i] * 2.0f // vB = (2.0, 4.0, 6.0, 8.0);
}
</source>
 
 
; 選択演算子を使用する
Metalではピリオド(.)を選択演算子、いわゆる[[スウィズル]]([[swizzle]])を利用してベクトルの各成分にアクセスすることができる。
 
<source lang="c">
<vector_data_type>.xyzw
<vector_data_type>.rgba
</source>
 
xyzwおよびrgbaの各成分(1文字)が配列インデックスに相当している感じである。
* x, r = 0
* y, g = 1
* z, b = 2
* w, a = 3
<source lang="c">
int4 test = int4(0, 1, 2, 3);
int a = test.x; // a = 0
int b = test.y; // b = 1
int c = test.z; // c = 2
int d = test.w; // d = 3
int e = test.r; // e = 0
int f = test.g; // f = 1
int g = test.b; // g = 2
int h = test.a; // h = 3
</source>
 
xyzwおよびrgbaの各成分は組み合わせて利用できる。
xとyの値が欲しい場合は「.xy」などと書ける。
<source lang="c">
float4 c;
c.xyzw = float4(1.0f, 2.0f, 3.0f, 4.0f);
c.z = 1.0f;
c.xy = float2(3.0f, 4.0f);
c.xyz = float3(3.0f, 4.0f, 5.0f);
</source>
 
並べ替えや複製もできる。
<source lang="c">
float4 pos = float4(1.0f, 2.0f, 3.0f, 4.0f);
 
// 並べ替え
float4 swiz = pos.wzyx; // swiz = (4.0f, 3.0f, 2.0f, 1.0f)
 
// 複製
float4 dup = pos.xxyy; // dup = (1.0f, 1.0f, 2.0f, 2.0f)
</source>
 
; 主なエラー
ベクトル型に宣言された成分以外の成分にアクセスするとエラーになる。
<source lang="c">
float2 pos;
pos.z = 1.0f; // エラー:2成分ベクトル型は.xy または .rg の要素にのみアクセスできる。
</source>
<source lang="c">
float3 pos;
pos.w = 1.0f; // エラー:3成分ベクトル型は.xyz または .rgb 要素にのみアクセスできる。
</source>
 
同じ成分に代入はできない。
<source lang="c">
pos.xx = float2(3.0f, 4.0f); // エラー:代入に「.xx」などは使用できない。
</source>
 
要素数が違うのもだめ。
<source lang="c">
pos.xy = float4(1.0f, 2.0f, 3.0f, 4.0f); // エラー:float2にfloat4は代入できない
</source>
 
1回のアクセスで.rgbaと.xyzwの混在はできない。
<source lang="c">
pos.xg = float2(3.0f, 4.0f); // エラー:xとgは混在できない。
 
// なお二行に分けた場合は問題ない。
pos.x = 3.0f;
pos.g = 4.0f
</source>
 
スウィズル付きのベクトル型のポインタや参照はエラーとなる。
<source lang="c">
float4 pos = float4(1.0f, 2.0f, 3.0f, 4.0f);
my_func(&pos.xy); // エラー
</source>
 
=== ベクトル型のコンストラクタ ===
コンストラクタを使用すると、スカラーまたはベクトルの集合からベクトルを作成することができます。パラメータシグネチャは、ベクトルの構築と初期化の方法を決定します。例えば、ベクターが単一のスカラーパラメータのみで初期化される場合、構築されたベクターのすべての構成要素はそのスカラー値に設定されます。
 
複数のスカラー、1つ以上のベクトル、またはスカラーとベクトルの混合物からベクトルを構築する場合、ベクトルの成分は引数の成分から順番に構築されます。引数は左から右の順に消費される。各引数は、次の引数の成分が消費される前に、順番にそのすべての成分が消費されます。

案内メニュー