2020年12月18日金曜日

Unityのバーテクスシェーダ引数のv.vertexは何座標系?

ややこしい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と完全に同じで左手座標系でデータを受け取っているということになる.