【Cg Programming/Unity】Basics ~ Debbuging of Shaders【順番にやっていく】
今回はこれ。
en.wikibooks.org
内容
前回までに紹介したように、例えば : POSITION
というセマンティクスをつけることで頂点の座標を頂点シェーダのインプットとして使用することができる。
このように頂点シェーダのインプットとして使用できるパラメータはほかにも色々用意されており、この節ではそれらの紹介と、実際に各ピクセルの色として出力してやって確認してみようということである。
Shader "Custom/DebbugingOfShaders" { SubShader { Pass { CGPROGRAM #pragma vertex v #pragma fragment f struct vertexInput { float4 position : POSITION; // 頂点座標 float3 normal : NORMAL; // 法線ベクトル float4 tangent : TANGENT; // 法線に垂直なベクトル(面に平行なベクトル) float4 texcoord0 : TEXCOORD0; // 1番目のテクスチャUV座標 float4 texcoord1 : TEXCOORD1; // 2番目のUV座標(1番目とは異なる座標が入っているが、よく知らん) float4 texcoord7 : TEXCOORD7; // 8番目のUV座標 float4 color : COLOR; }; /* 以下、デフォルトで定義されているもの struct appdata_base { float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; }; struct appdata_tan { float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; }; struct appdata_full { float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; float4 texcoord1 : TEXCOORD1; float4 texcoord2 : TEXCOORD2; float4 texcoord3 : TEXCOORD3; fixed4 color : COLOR; // and additional texture coordinates only on XBOX360 }; struct appdata_img { float4 vertex : POSITION; half2 texcoord : TEXCOORD0; }; // デフォルトで定義されているものここまで */ struct vertexOutput { float4 pos : SV_POSITION; float4 col : TEXCOORD0; }; vertexOutput v(vertexInput input) { vertexOutput output; output.pos = UnityObjectToClipPos(input.position); output.col = input.position + float4(0.5, 0.5, 0.5, 0.0); //output.col = input.normal; //output.col = input.tangent; //output.col = input.texcoord0; //output.col = input.texcoord1; //output.col = input.texcoord7; // ベクトルの各要素は(x,y,z,w)あるいは(r,g,b,a)のように名前がついており // それらを任意の組み合わせ・順番で4つ並べたベクトルを以下のように取得することができる //output.col = input.position.xyzw; //output.col = input.position.rgba; //output.col = input.position.xxyy; // position.xやposition.aaのようにスカラーや2次元ベクトル、3次元ベクトルも取得できる return output; } float4 f(vertexOutput input) : COLOR { return input.col; } ENDCG } } }
セマンティクスとは
ここまでセマンティクスという言葉をなんとなく使ってきてしまったが、改めて何を表しているのか確認しておきたい。
といってもUnityの公式ドキュメントで詳しく説明されているのでそこを参照されたし。
docs.unity3d.com
粉々にかみ砕いて説明すると、「その変数が何をするための値なのかを指定」している。
変数名はこっちで勝手に決めちゃうから、中身にはこういう値を入れてねとプログラムに伝えるためのものがセマンティクスである。
ベクトルへの便利なアクセス方法
頂点シェーダの最後のほうに書いてあるinput.position.xyzw
などがそれである。
コメントで説明しているのでここでは省略する。
このようにCG言語(というかシェーダ言語)ではベクトルや行列を便利に操作するための機能が豊富にそろえられている。
どのような関数があるかはNVIDIAによるこちらの公式ドキュメントを参照されたし。(バージョンが合ってるかは知らん)
http://developer.download.nvidia.com/cg/Cg_3.0/Cg_Users_Manual_JP.pdf#page=40
(この辺についてググろうとしたのだけど、「CG言語」って検索性悪すぎやろ。。。ストレスたまる~~)
各パラメータについて
コメントで書いてある通りです。(丸投げ)(この書き方めっちゃ昔のインターネットっぽい)
いちいち自分で構造体を定義しなくてもappdata_base
みたいにいくつかよく使う組み合わせで定義してくれてあるのでそれを使ってもいいよって書いてありました。
あとは、「そのままの値だと負の数になってたりして上手く色として出力できないのでいい感じに変形してね」とか「色んなベクトル操作をしてシェーダの書き方に慣れよう」みたいな感じなので飛ばす。
以上。
正直この節はいろいろあるよ~っていう紹介だけです。
次はこちら。
spi8823.hatenablog.com