以下の内容はhttps://redhologerbera.hatenablog.com/entry/2025/01/10/231732より取得しました。


ゼロから始めるUnityShader開発 第六章 セルルックなライティングを行う その②シャドウカラーの実装

本日はShader枠です。

 前回はライティングの一環としてセルルックなシェーダーを実装しました。

redhologerbera.hatenablog.com

 前回の状態だと影が真っ黒になります。

今回は影の色を変更可能にします。

〇影の取得

影に色を付けるためにはまずは影のピクセルを取得します。

これはNdotLにStep関数を使用した以下の個所が相当します。

                float strength = dot(lt.direction, i.normalWS);
                float shadow =step(0.3,strength);

1からこの影の値を引いた値に新しく定義する色であるShadowColorを掛け合わせることで影の色が定義できます。

                float4 shadowColor = _ShadowColor * (1-shadow);

1-shadowの理由ですが、shadowの状態では影の部分が黒になります。

黒に何を掛け合わせても黒になるため、逆数を取り色を掛け合わせます。

同様にshadowをlightColorに掛け合わせ、これらを加算することでシャドウカラーが実現できます。

〇コード全文

Shader "Unlit/TutorialShader"
{
    Properties
    {
     //   _MainTex ("Texture", 2D) = "white" {}
        _MainColor("Color" ,color) = (1,1,1,1)
        _ShadowColor("ShadowColor",color) = (0,0,0,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include  "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
            
            struct appdata
            {
                float4 vertex : POSITION;
                half3 normal: NORMAL;
            };

            struct v2f
            {
            float4 vertex : SV_POSITION;
            float3 normalWS : TEXCOORD1;
            };


            float4 _MainColor;
            float4 _ShadowColor;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = TransformObjectToHClip(v.vertex);
                //面の法線を取得、ライトの当たる向きを計算
                VertexNormalInputs normal = GetVertexNormalInputs(v.normal);
                o.normalWS = normal.normalWS;
                return o;
            }

            float4 frag (v2f i) : SV_Target
            {
                float4 col = _MainColor;
                //Light.hlslで提供されるUnityのライトを取得する関数
                Light lt = GetMainLight();

                //ライトの向きを計算
                float strength = dot(lt.direction, i.normalWS);
                float shadow =step(0.3,strength);
                float4 lightColor = float4(lt.color, 1)*shadow;
                float4 shadowColor = _ShadowColor * (1-shadow);
                return col* (shadowColor+lightColor);
            }
            ENDHLSL
        }
    }
}

これを実行することで影の色を変更可能になりました。

本日は以上です。




以上の内容はhttps://redhologerbera.hatenablog.com/entry/2025/01/10/231732より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14