【Unity】メッシュの情報(UVとか頂点カラーとか法線とか)をお手軽に可視化する

UVや頂点カラーや法線といったメッシュが持つ情報を可視化したいことがあります。
シェーダを書けばいいだけなのですが、毎回書くのは面倒なので汎用的なものをつくりました。

シェーダ

さっそくシェーダを書きます。

Shader "Hidden/MeshInfoViewer"
{
    Properties
    {
        [KeywordEnum(UV0, UV1, VertexColorRGB, VertexColorAlpha, WorldNormal)]_MeshInfo("Mesh Info", float)     = 0
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #pragma multi_compile _MESHINFO_UV0 _MESHINFO_UV1 _MESHINFO_VERTEXCOLORRGB _MESHINFO_VERTEXCOLORALPHA _MESHINFO_WORLDNORMAL
            
           #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex       : POSITION;
                float2 texcoord0    : TEXCOORD0;
                float2 texcoord1    : TEXCOORD1;
                float4 color        : COLOR;
                float4 normal       : NORMAL;
            };

            struct v2f
            {
                float4 vertex       : SV_POSITION;
                float2 uv0          : TEXCOORD0;
                float2 uv1          : TEXCOORD1;
                float4 color        : COLOR;
                float3 normal       : NORMAL;
            };
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex    = UnityObjectToClipPos(v.vertex);
                o.uv0       = v.texcoord0;
                o.uv1       = v.texcoord1;
                o.color     = v.color;
                o.normal    = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
               #if _MESHINFO_UV0
                    return fixed4(i.uv0.xy, 0, 1);
               #elif _MESHINFO_UV1
                    return fixed4(i.uv1.xy, 0, 1);
               #elif _MESHINFO_VERTEXCOLORRGB
                    return fixed4(i.color.rgb, 1);
               #elif _MESHINFO_VERTEXCOLORALPHA
                    return fixed4(i.color.aaa, 1);
               #elif _MESHINFO_WORLDNORMAL
                    return fixed4(i.normal, 1);
               #endif

                return 1;
            }
            ENDCG
        }
    }
}

処理はシンプルです。
表示したい情報ごとにKeywordを定義してバリアントを作っています。

使い方

使い方としては、上記のシェーダをアサインしたMaterialをモデルにアサインして、
MaterialのInspectorからモードを選択するだけです。

f:id:halya_11:20181117161018p:plain