最新版 |
編集中の文章 |
111行目: |
111行目: |
| *int4 = 16バイト | | *int4 = 16バイト |
| | | |
− | [[HLSL]]や[[GLSL]]で[[定数バッファー]]などの[[構造体]]を作る際は、その構造体のサイズを[[GPU]]が扱いやすいよう「8バイト単位」や「16バイト単位」にする必要があり、[[シェーダー]]の[[プログラミング]]の際にはその構造体のサイズを手計算で算出して、バイト数が足りない場合はダミーの変数を追加してサイズ調整が必要である。 | + | [[HLSL]]や[[GLSL]]で[[定数バッファー]]などの[[構造体]]を作る際は、その構造体のサイズを「8バイト単位」や「16バイト単位」にする必要があり、[[シェーダー]]の[[プログラミング]]の際にはその構造体のサイズを手計算で算出して、バイト数が足りない場合はダミーの変数を追加してサイズ調整が必要である。 |
| | | |
| 一方、[[Metal]]では「必ず2の乗数」になるのでそのような手計算が必要ない。 | | 一方、[[Metal]]では「必ず2の乗数」になるのでそのような手計算が必要ない。 |
| [[HLSL]]や[[GLSL]]の感覚でサイズ調整すると無駄が発生するので注意すること。 | | [[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
| |