ライティングを考慮したシェーダ
平行光源のみ考慮するパターン
code:shader
Shader "ForwardLambert"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
Tags { "LightMode"="ForwardBase"} // ライティング系はForwardBaseにしないといけない?
CGPROGRAM
#include "Lighting.cginc" // ライティング関係のライブラリ struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float3 worldNormal : TEXCOORD1;
};
sampler2D _MainTex;
float4 _MainTex_ST;
void vert (in appdata v, out v2f o)
{
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal); // 法線ベクトルをローカルからワールドへ
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
}
void frag (in v2f i, out fixed4 col : SV_Target)
{
float3 lightDir = _WorldSpaceLightPos0.xyz;
float3 normal = normalize(i.worldNormal);
float NL = dot(normal, lightDir); // 法線方向と光源方向の内積を取って、光の強さとする
float3 baseColor = tex2D(_MainTex, i.uv);
float3 lightColor = _LightColor0;
col = fixed4(baseColor * lightColor * max(NL, 0), 0);
}
ENDCG
}
}
}
code:geom
// 法線ベクトルの計算
float3 vecA = IN1.vertex - IN0.vertex; float3 vecB = IN2.vertex - IN0.vertex; float3 normal = cross(vecA, vecB);
normal = normalize(mul(normal, (float3x3) unity_WorldToObject));
// ライティングの計算
float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
o.light = max(0., dot(normal, lightDir));
ライトの明るさを参照する
"Lighting.cginc"を追加することでDirectional Lightの色を利用できます。
_LightColor0がDirectional Lightの色に該当します。
Tags { "LightMode"="ForwardBase" }も必要なようです。