วิธีการทำ
1. ให้ทำการสร้าง Shader ขึ้นมาใหม่
2. Unity จะมี built-in lighting มาให้อยู่แล้ว 2 ชนิด คือ
- Lambert
- BlinnPhong
3. หลังจากที่ เปิดไฟล์ Shader ให้ดูในส่วนของ
CGPROGRAM
#pragma surface surf Lambert
จะเห็นว่าค่าปัจจุบันถูกตั้งให้เป็นแบบ Lambert อยู่ ในกรณีที่เราต้องการเขียน Custom Lighting เราสามารถที่จะแก้คำว่า Lambert เป็นชื่อ Lighting ที่เราต้องการ (จากตัวอย่างจะทำการแก้เป็น CustomLambert)
CGPROGRAM
#pragma surface surf CustomLambert
ตัวอย่าง
// SurfaceOutput คือ ค่าที่เราสามารถอ้างอิงใน Mesh หรือ Material ของเราครับ
// lightDir คือ ทิศทางของแสง
// viewDir คือ ทิศทางทของ Camera
// atten คือ แสงของ Ambient
inline float4 LightingCustomLambert (SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
{ }
5. ใน Function ให้เราทำการเพิ่ม คำสั่งเข้าไปครับ
/*
float difLight = dot(s.Normal, lightDir);
จะทำการคำนวณค่าที่แสงตกกระทบ มีค่าระหว่าง -1 ถึง 1
col.rgb = s.Albedo * _LightColor0.rgb * (difLight) * atten;
เป็นการบอกให้ Material ให้มีการเปลี่ยนสีตาม แสงในเกม (Directional Light, Point Light, อื่นๆ) และ ให้มีการเปลี่ยนสีตาม Ambient Light
ปล. Lambert อันนี้จะต่างจากของ Unity นิดหน่อยนะครับเพื่อให้เห็นความต่าง
*/
6. เท่านี้ก็เสร็จแล้วครับ ให้ทำการสร้าง Material แล้วโยนเข้าไปใน Mesh แล้วทำการลองปรับ Light Color กับ Ambient Color ครับ
จากตัวอย่าง ผมทำการ set Ambient เป็นสีแดง และ Light Color เป็นสีน้ำเงิน
ขวามือคือ CustomLambert ซ้ายมือ Unity Lambert
หวังทุกท่านจะพอเข้าใจการเขียน Custom Lighting กันนะครับ
ปล. ผมก็ไม่ได้โปรเรื่องของ Custom Lighting มากนะครับ ดังนั้นอาจจะมีการอธิบายผิดพลาด ยังไงก็ให้คำแนะนำได้นะครับ