うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】輪郭 Shader を作る

ddx と ddy を利用して輪郭が取得できるかのテストを兼ねて作成してみました

画像は以下のサイトから利用させていただいています

[無料写真] 空に浮かぶ風船 - パブリックドメインQ:著作権フリー画像素材集

輪郭

色の差分が少ないところは灰色になってるので、ある程度輪郭が分かると思います

f:id:hacchi_man:20200629000810p:plain

ピクセルの差分を利用しているので、ズームアウトしてしまうとちょっと変に見えてしまう可能性があります

f:id:hacchi_man:20200629001030p:plain

Shader "Unlit/Outline"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _OutlineThreshold ("Outline Threshold", float) = 0.0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert_img
            #pragma fragment frag
 
            #include "UnityCG.cginc"
 
            sampler2D _MainTex;
            float _OutlineThreshold;
 
            fixed4 frag (v2f_img i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                half3 outlineValue = ddx(col) + ddy(col);
 
                return half4(1 - outlineValue - _OutlineThreshold, 1);
            }
            ENDCG
        }
    }
}