本日はShader枠です。
前回はライティングの一環としてセルルックなシェーダーを実装しました。
前回の状態だと影が真っ黒になります。

今回は影の色を変更可能にします。
〇影の取得
影に色を付けるためにはまずは影のピクセルを取得します。
これは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
}
}
}
これを実行することで影の色を変更可能になりました。

本日は以上です。