Half Lambert ทำงานยังไง ถ้าจะให้เข้าใจง่ายๆก็คือ การนำ Lambert ในส่วนที่ไม่มีแสงกระทบ (ส่วนที่มืด มีค่า <= 0) มาทำการคำนวณเพิ่มแสงโดยทำการบวกค่า 0.5 ซื่งจะทำให้ส่วนที่มืดนั้นสว่างขี้น
ปล. อธิบายตามความเข้าใจของผมนะครับ
ข้อมูลเพิ่มเติมครับ
https://developer.valvesoftware.com/wiki/Half_Lambert
1. ให้ทำการสร้าง Shader
2. ในส่วนของ CGPROGRAM ให้ทำการแก้
- #pragma surface surf Lambert
เป็น
- #pragma surface surf HalfLambert
3. จากนั้นให้ทำการเพิ่ม Function
inline float4 LightingHalfLambert (SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
{
// คำนวณหาค่า Diffuse Light
float difLight = dot(s.Normal, lightDir);
// คำนวณค่า Half Lambert
// ถ้า Material ที่ถูกแสงกระทบมีค่า 1 การคำนวณก็จะได้ (1 * 0.5) + 0.5 มีค่าเท่ากับ 1 เท่าเดิม
// ถ้า Material ทีถูกแสงกระทบมีค่า 0 จะได้ค่าเป็น (0 * 0.5) + 0.5 มีค่าเท่ากับ 0.5 ซึ่งสว่างกว่าเดิม
// ถ้า Material ที่ถูกแสงกระทบมีค่า -1 จะได้ค่าเป็น (-1 * 0.5) + 0.5 มีเค่าเท่ากับ 0 ไม่มีการเปลี่ยนแปลง
float halfLambert = difLight * 0.5 + 0.5;
float4 col;
// * 2 ข้างหลังเพิ่มความสว่างของแสง (unity default)
col.rgb = s.Albedo * _LightColor0.rgb * halfLambert * atten * 2;
col.a = s.Alpha;
return col;
}
4. เท่านี้ก็ได้ Half Lambert Shader แล้วครับ
ตัวอย่าง
ซ้าย Unity Lambert
ขวา Half Lambert
Directional Light
- Color : white
- Intensity : 0.4
จะเห็นว่าเงาของ Half Lambert จะมีความเข้มน้อยกว่าของ Unity Lambert