見出し画像

【Unity】3Dモデルにアウトライン + メタリックのシェーダーを適応する

どうも、マカロンです。

今回は久しぶりにただただお役立ち情報になりそうな記事を
書いていこうと思います。

意外とシェーダーに関する記事で二つの要素の複合体がコピペだけで
作れるみたいな記事って少ないんですよね。

それでは早速行きましょう!!




今回作るシェーダーのパラメータ

シェーダー系の記事って出来上がった後に

「あーそっかこのパラメータないのか…
   じゃあこのパラメータの実装方法調べないと」

みたいなことが多々あるので先に扱えるパラメータ載せておきます。

ということで今回扱うパラメータ一覧です。

Outline Color : アウトラインの色
Outline Width : アウトラインの太さ
Main Color : マテリアルの色
Smoothness : 滑らかさ
Metallic : メタリック
Emission Color : HDR、輝度

以上です!



PR




シェーダーコード

Shader "Unlit/Clip Space Outline"
{
    Properties {
        _OutlineColor("Outline Color", Color) = (0, 0, 0, 0)
        _OutlineWidth("Outline Width", float) = 0.1
        _MainColor("Main Color", Color) = (1, 1, 1, 1)
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
        [HDR] _EmissionColor ("Emission Color", Color) = (0,0,0)
    }

    SubShader {
      Tags { "RenderType"="Opaque" }
        LOD 200

        Cull Front

        CGPROGRAM

        #pragma surface surf Lambert vertex:vert

        float4 _MainColor;
        float4 _OutlineColor;
        float _OutlineWidth;

        struct Input {
            float4 vertexColor : COLOR;
        };

        void vert(inout appdata_full v, out Input o) {
            float distance = -UnityObjectToViewPos(v.vertex).z;
            v.vertex.xyz += v.normal * distance * _OutlineWidth;
            o.vertexColor = v.color;
        }

        void surf(Input IN, inout SurfaceOutput o) {
            o.Albedo = _OutlineColor.rgb;
            o.Emission = _OutlineColor.rgb;
        }
        ENDCG

        Cull Back

        CGPROGRAM

        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting

        #pragma target 3.0

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _MainColor;
        float4 _EmissionColor;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // Albedo comes from a texture tinted by color
            o.Albedo = _MainColor;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic * _MainColor;
            o.Smoothness = _Glossiness * _MainColor;
            o.Emission = _EmissionColor;
        }
        ENDCG

    }
    FallBack "Diffuse"
}

sampler2D _MainTex;
struct Input { float2 uv_MainTex;};

Standard Shaderにも搭載されてるテクスチャのパラメータ

このパラメータを使えばテクスチャの読み込みもできますが、
今回は使用していない状態です。




PR





最後に

短い記事になりますが、
こういう記事が未来の自分は一番助かっていたりします。

ではまた!

ゲームを作るにはやはりお金がないとできることが限られてしまいます。なのでよろしければどうか支援してくださるとうれしいです