うにてぃブログ

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

【Unity】Shader を用いて 画像を白黒だけで表現する

キャラの輪郭を表示させたり、画像を見せたいけど詳しく見せたく無いから
二色で塗りつぶしたりしたいときがあると思うので、それの対応

正しい名称が分からなかったのでざっくりとした表現

処理

各色味を計算してrgb値によって色を振り分けている

fixed total = (col.r * _WightR / 3.0) + (col.g * _WightG / 3.0) + (col.g * _WightB / 3.0);

f:id:hacchi_man:20200204010035p:plain

色ごとに重みをつけられるので、赤色部分を強調したいとかができる
虹みたいなものだと多少分かりやすいかと

左下が全部の色の重みが一緒のもので、右下が赤色のみで判定したもの

f:id:hacchi_man:20200204010432p:plain

コード

Shader "Unlit/Line"
{
    Properties
    {
        [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
        _WightR ("Wight Red", Range(0.0, 1.0)) = 1
        _WightG ("Wight Green", Range(0.0, 1.0)) = 1
        _WightB ("Wight Blue", Range(0.0, 1.0)) = 1
        _Power ("Power", Range(0.0, 1.0)) = 0.5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            fixed _WightR;
            fixed _WightG;
            fixed _WightB;
            fixed _Power;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed total = (col.r * _WightR / 3.0) + (col.g * _WightG / 3.0) + (col.g * _WightB / 3.0);
                return lerp(fixed4(0, 0, 0, 1), fixed4(1, 1, 1, 1), total > _Power);
            }
            ENDCG
        }
    }
}