コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
未作成ページ
おまかせ表示
ヘルプ
MonoBook
検索
検索
ログイン
個人用ツール
ログイン
ログアウトした編集者のページ
もっと詳しく
投稿記録
トーク
「
Metalのデータ型
」を編集中 (節単位)
ページ
議論
日本語
閲覧
編集
ソースを編集
履歴表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
編集
ソースを編集
履歴表示
全般
リンク元
関連ページの更新状況
特別ページ
ページ情報
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
==ベクトル型== スカラー型名の末尾に数字(ここでは'''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つ以上のベクトル、またはスカラーとベクトルの混合物からベクトルを構築する場合、ベクトルの成分は引数の成分から順番に構築されます。引数は左から右の順に消費される。各引数は、次の引数の成分が消費される前に、順番にそのすべての成分が消費されます。
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)
本文の横幅制限を有効化/無効化