「Metalのデータ型」を編集中

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

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

最新版 編集中の文章
1行目: 1行目:
==スカラー型==
+
スカラー型
 
{| class="wikitable"
 
{| class="wikitable"
 
|+
 
|+
!
+
!
!概要
+
!
 
|-
 
|-
 
|bool
 
|bool
9行目: 9行目:
 
|-
 
|-
 
|char
 
|char
| rowspan="2" |符号付き8ビット整数
+
int8_t
|-
+
|符号付き8ビット整数
|int8_t
 
 
|-
 
|-
 
|unsigned char
 
|unsigned char
| rowspan="3" |符号なし8ビット整数
+
uchar
|-
+
 
|uchar
+
uint8_t
|-
+
|符号なし8ビット整数
|uint8_t
 
 
|-
 
|-
 
|short
 
|short
| rowspan="2" |符号付き16ビット整数
+
int16_t
|-
+
|符号付き16ビット整数
|int16_t
 
 
|-
 
|-
 
|unsigned short
 
|unsigned short
| rowspan="3" |符号なし16ビット整数
+
ushort
|-
+
 
|ushort
+
uint16_t
|-
+
|符号なし16ビット整数
|uint16_t
 
 
|-
 
|-
 
|int
 
|int
| rowspan="2" |符号付き32ビット整数
+
int32_t
|-
+
|符号付き32ビット整数
|int32_t
 
 
|-
 
|-
 
|unsigned int
 
|unsigned int
| rowspan="3" |符号なし32ビット整数
+
uint
|-
+
 
|uint
+
uint32_t
|-
+
|符号なし32ビット整数
|uint32_t
 
 
|-
 
|-
 
|long
 
|long
| rowspan="2" |符号付き64ビット整数
+
int64_t
 +
|符号付き64ビット整数
 
Metal 2.2以降
 
Metal 2.2以降
|-
 
|int64_t
 
 
|-
 
|-
 
|unsigned long
 
|unsigned long
| rowspan="2" |符号なし64ビット制す
+
uint64_t
 +
|符号なし64ビット制す
 
Metal 2.2以降
 
Metal 2.2以降
|-
 
|uint64_t
 
 
|-
 
|-
 
|half
 
|half
65行目: 57行目:
 
|-
 
|-
 
|size_t
 
|size_t
|sizeof 演算子の結果を表す符号なし整数型。
+
|sizeof 演算子の結果を表す符号なし整数型。実態は符号なし64ビット整数。
実態は符号なし64ビット整数。
 
 
|-
 
|-
 
|ptrdiff_t
 
|ptrdiff_t
|2つのポインタを引き算した結果の符号付き整数型。
+
|2つのポインタを引き算した結果の符号付き整数型。実態は符号付き64ビット整数。
実態は符号付き64ビット整数。
 
 
|-
 
|-
 
|void
 
|void
 
|void
 
|void
 
|}
 
|}
 
===サフィックス ===
 
 
*f または F = float, 0.5f
 
*h または H = half, 0.5h
 
*u または U = uint, 2u
 
*l または L = long, 2L
 
 
==ベクトル型==
 
スカラー型名の末尾に数字(ここでは'''n'''とする)を付けるとベクトル型になる。
 
'''n''' には 2, 3, 4のいづれかの数字が入る。
 
「float2」や「float3」といった感じだ。
 
[[HLSL]]などと同じだな。
 
 
*bool'''n'''
 
*char'''n'''
 
*short'''n'''
 
*int'''n'''
 
*long'''n'''
 
*uchar'''n'''
 
*ushort'''n'''
 
*uint'''n'''
 
*ulong'''n'''
 
*half'''n'''
 
*float'''n'''
 
 
===ベクトル型のサイズは必ず2の乗数===
 
Metalのベクトル型は「型のサイズは必ず2の乗数」となっている。
 
 
たとえば、
 
 
*int = 4バイト
 
*int2 = 8バイト
 
*int3 = '''16バイト''' (12バイトではない)
 
*int4 = 16バイト
 
 
[[HLSL]]や[[GLSL]]で[[定数バッファー]]などの[[構造体]]を作る際は、その構造体のサイズを[[GPU]]が扱いやすいよう「8バイト単位」や「16バイト単位」にする必要があり、[[シェーダー]]の[[プログラミング]]の際にはその構造体のサイズを手計算で算出して、バイト数が足りない場合はダミーの変数を追加してサイズ調整が必要である。
 
 
一方、[[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つ以上のベクトル、またはスカラーとベクトルの混合物からベクトルを構築する場合、ベクトルの成分は引数の成分から順番に構築されます。引数は左から右の順に消費される。各引数は、次の引数の成分が消費される前に、順番にそのすべての成分が消費されます。
 
 
== マトリックス型 ==
 
[[Metal]]では[[行列]]を表すマトリックス型をサポートしている。
 
 
halfおよびfloatの末尾に「'''n'''x'''m'''」と付けるとマトリックス型になる。
 
'''n'''と'''m'''の部分には2から4の数字が入る。
 
* half'''n'''x'''m'''
 
* float'''n'''x'''m'''
 
 
=== マトリックス成分へのアクセス ===
 
Metalでは基本的にC言語の多次元配列と同じでありインデックスは「ゼロ」から始まる。
 
プログラミング言語によっては「m11」などと「1始まり」のものもあるので移植の際には注意しよう。
 
 
<source lang="c">
 
float4x4 m;
 
 
// 2列目の全要素(全行)に2.0fを設定する
 
m[1] = float4(2.0f);
 
 
// 1行目1列目に1.0fを設定する
 
m[0][0] = 1.0f;
 
</source>
 
 
=== マトリックス型のコンストラクタ ===
 
; 引数が浮動点数型1個
 
浮動点数が1個だと
 
<source lang=c>
 
float4x4( val );
 
</source>
 
こうなる。
 
 
<math>
 
\begin{pmatrix}
 
val & 0.0 & 0.0 & 0.0 \\
 
0.0 & val & 0.0 & 0.0 \\
 
0.0 & 0.0 & val & 0.0 \\
 
0.0 & 0.0 & 0.0 & val \\
 
\end{pmatrix}
 
</math>
 
 
; 引数が同じサイズのマトリックス型
 
同じサイズのマトリックス型だと複製が作られる。
 
<source lang=c>
 
float3x4( float3x4 );
 
</source>
 
 
== バッファー ==
 
Metalのバッファーとはいわゆるポインタである。
 
* device
 
* constant
 
* threadgroup
 

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)