「ややこしいUnityの座標系の確認方法」シリーズ. Unityからオブジェクトの頂点情報をバーテクスシェーダがどのように受け取るのかを実験で確認してみた. バーテクスシェーダの引数v.vertexがUnityのエディタと同じ左手系の座標なのか? バーテクスシェーダ内の変数の値を直接確認するすべが無いので, フラグメントシェーダが出力するオブジェクトの色で確認する.
バーテクスシェーダからフラグメントシェーダへ値を受け渡す唯一の方法(だと思う)が, vert関数のreturnで渡して,frag関数の引数で受け取る方法. vertex自体を触るとオブジェクトの見た目の形が変わってしまうので, o.uvにv.vertexの値を入れた. 2次元のベクトルに3次元要素を全部入れることができないのでx軸とy軸,x軸とz軸に分けて確認した.
x軸とy軸を確認する
v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); //o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.uv = float2(v.vertex.x, v.vertex.y); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { return float4(i.uv.x, i.uv.y, 0.0, 1.0); }
結果は,x軸正方向が赤く,y軸正方向が緑になった.ということは,この2つの成分に関しては,v.vertexの座標系はUnityと同じということ.
x軸とz軸を確認する
v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); //o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.uv = float2(v.vertex.x, v.vertex.z); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { return float4(i.uv.x, 0.0, i.uv.y,1.0); }
結果は,x軸正方向が赤く,z軸正方向が青になった.ということは,この2つの成分に関しては,やはりv.vertexの座標系はUnityと同じで左手座標系だということ.
ちなみに各頂点オブジェクト座標がv.vertexに入ってくるので,オブジェクト自体がどこにあっても結果は同じ.
つまり
v.vertexはUnityと完全に同じで左手座標系でデータを受け取っているということになる.