1 อธิบาย
lift ยกทุกพิกเซลที่มืด รวมถึงพิกเซลที่ alpha = 0 รอบ ๆ หุ่นด้วย พอ Merge over บวก A เข้าไปตรง ๆ plate ทั้งเฟรมเลยสว่างขึ้น ไม่ใช่แค่หุ่น
การคูณล้วน (gain, multiply) ทำบนภาพ premult ได้ แต่ lift, gamma, offset ต้อง unpremult → grade → premult ใน Grade ของ Nuke มีช่อง "(un)premult by" ทำให้ในตัว
Grade (Nuke): y = A·x + (add + lift − A·blackpoint), A = multiply·(gain − lift)/(whitepoint − blackpoint)2 ลงมือใน mini compositor
โจทย์: ให้ lift มีผลแค่ที่หุ่น ไม่ลามไปทั้งเฟรม
ดูที่ท้องฟ้า มันไม่ควรสว่างขึ้นเลย
3 เจาะลึก
Grade ทำอะไรจริง ๆ
ก่อน gamma ทั้ง Grade คือเส้นตรงเส้นเดียว: y = A·x + B โดย A = multiply·(gain − lift)/(whitepoint − blackpoint) และ B = offset + lift − A·blackpoint
จากนั้นจึงคิด gamma และ black clamp ซึ่งเปิดไว้เป็นค่าเริ่มต้น ตัดค่าติดลบเป็น 0 (white clamp ปิดอยู่)
- 1blackpoint / whitepoint
- 2lift / gain
- 3multiply
- 4offset
- 5gamma
- 6black clamp
ตัวเลขที่ควรจำ
lift ไม่ถูกคูณด้วย multiply: multiply 2 กับ lift 0.1 ทำให้ 0 กลายเป็น 0.1 ไม่ใช่ 0.2 และ gamma ทำงานเป็นโค้งแค่ช่วง 0–1 เกิน 1 เป็นเส้นตรงความชัน 1/gamma
| ตั้งค่า | เข้า | ออก | สังเกต |
|---|---|---|---|
| lift 0.1 | 0 | 0.1 | ดำยกขึ้น |
| lift 0.1 | 4.5 | 4.15 | ไฮไลต์ถูกดึงลง |
| gamma 2 | 0.4 | 0.6325 | โค้งช่วงต่ำกว่า 1 |
| gamma 2 | 2.5 | 1.75 | เส้นตรงช่วงเกิน 1 |
ทำไม multiply ปลอดภัย แต่ lift ไม่
พิกเซลขอบ: สีจริง 0.25 alpha 0.5 ในภาพ premult เก็บไว้เป็น 0.125 ถ้า grade ตรง ๆ บนภาพ premult ผลจะต่างจากการ unpremult → grade → premult ทุกครั้งที่ไม่ใช่การคูณล้วน
การคูณ k·(C·a) = (k·C)·a สลับกันได้ แต่ gamma, lift, offset ไม่ได้ lift ยังไปบวกพิกเซล alpha 0 รอบหุ่น แล้ว over ก็บวกค่านั้นทั้งเฟรม
| การปรับ | บนภาพ premult ตรง ๆ | unpremult → grade → premult |
|---|---|---|
| gain 2 (ขอบ) | 0.25 | 0.25 |
| gamma 2 (ขอบ) | 0.354 สว่างเกิน | 0.25 |
| lift 0.06 (นอกหุ่น, alpha 0) | 0.06 ลามทั้งเฟรม | 0 |
ช่อง (un)premult by ใน Grade
ตั้ง (un)premult by เป็น rgba.alpha แล้ว Grade จะ unpremult → grade → premult ให้ในตัว สะดวกเมื่อมี grade ตัวเดียว ถ้ามีหลายตัวติดกัน ใช้ Unpremult กับ Premult ครอบทั้งชุดจะอ่านง่ายกว่า
ข้อควรระวัง: พิกเซลที่ alpha เป็น 0 จะออกมาเป็น 0 ทุกช่อง element แสงที่ alpha 0 ทั้งภาพจึงหายหมด แสงพวกนี้ไม่ต้องใช้ช่องนี้เลย
ขยับ lift แล้วดูท้องฟ้าไกลจากหุ่น ถ้ามันขยับตาม แปลว่ายังไม่ได้ unpremult
4 ในงานจริง
ทำใน Nuke
- gain / multiply อย่างเดียว: ใส่ Grade บนภาพ premult ได้เลย
- มี lift, gamma, offset: ตั้ง (un)premult by = rgba.alpha
- หลาย node สี: Unpremult → Grade → ColorCorrect → Premult
- element แสง alpha 0: grade โดยไม่เปิด (un)premult
- ดู Viewer ที่ Merge แล้วชี้อ่านค่าท้องฟ้าก่อนและหลังขยับ lift
พลาดบ่อย → แก้ยังไง
- ✗ lift บนหุ่นที่ premult แล้ว ทั้งเฟรมสว่างขึ้น✓ เปิด (un)premult by หรือครอบด้วย Unpremult/Premult
- ✗ คิดว่า multiply จะคูณ lift ไปด้วย✓ lift อยู่ในส่วน B ไม่ถูกคูณ ดำจะค้างที่ค่า lift ปรับแยกกัน
- ✗ ใช้ gamma ดัดไฮไลต์ที่เกิน 1 เหมือนดัดโทนมืด✓ เกิน 1 gamma เป็นเส้นตรง ถ้าจะกดไฮไลต์ใช้ multiply หรือ SoftClip
- ✗ เปิด (un)premult by กับ element แสง alpha 0✓ แสงจะกลายเป็น 0 ทั้งหมด ปิดช่องนี้สำหรับแสง
เช็กก่อนส่งช็อต
- Grade ที่มี lift/gamma/offset บนภาพ premult มี unpremult ครอบ
- ท้องฟ้านอกหุ่นไม่เปลี่ยนเมื่อขยับ grade ของหุ่น
- ขอบหุ่นไม่สว่างหรือมืดกว่าเนื้อ
- element แสงไม่ได้ใช้ (un)premult by
5 เช็กตัวเอง
อันไหนทำบนภาพ premult ได้เลยโดยไม่ต้อง unpremult
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. Grade ตั้ง multiply 2 และ lift 0.1 ค่าเข้า 0 จะออกมาเท่าไร
2. ใส่ gamma 2 บนหุ่นที่ premult แล้ว โดยไม่ unpremult ขอบจะเป็นอย่างไร
ตัวเลขมาจากไหน: สูตร Merge, Grade, Premult, Unpremult ในห้องนี้ตรงกับ Nuke 17.0v2 ครบ 109 กรณีทดสอบ (เทียบตัวเลขจาก Nuke จริง) ส่วน Blur และ Transform เป็นแบบง่าย ใกล้เคียงแต่ไม่เท่า Nuke เป๊ะ ภาพทั้งหมดเรนเดอร์จาก Blender จากฉากของเราเอง: วางฉากด้วยโค้ด ภูเขาเป็น terrain ที่สร้างใน Gaea 2.3 (Community, build แบบ headless) ท้องฟ้าเป็น HDRI CC0 จาก Poly Haven หินและหญ้าแห้งจาก Poly Haven (CC0) texture ทรายและหินผาจาก Quixel และหุ่นบน rig จาก Mixamo (Quixel และ Mixamo ใช้ในเรนเดอร์เท่านั้น ไม่มีไฟล์ต้นฉบับแจก)