1 อธิบาย
ทุกครั้งที่วางภาพหนึ่งทับอีกภาพ Nuke ใช้สูตรเดียว: A over B = A + B·(1−αA) ส่วน B ที่ถูกบังจะหายไปตามค่า alpha แล้วบวก A เข้าไปตรง ๆ
สูตรนี้คิดว่า A ถูก premultiply มาแล้ว (สีคูณ alpha ไว้แล้ว) ถ้า A ยังไม่ได้คูณ ขอบจะสว่างเกิน (ขอบเรือง) ถ้าคูณซ้ำสองรอบ ขอบจะมืด (ขอบดำ) ลองเปลี่ยนโหมดด้านล่างแล้วดูกราฟตรงขอบ
out = A + B·(1 − αA), A = C·α2 ลองเอง
ลองสลับ plate เป็น "สว่าง" แล้วเลือก premult ซ้ำ ขอบดำจะชัดที่สุด
3 เจาะลึก
over = plus + stencil
over แยกได้เป็นสองขั้น: เจาะรูใน B ด้วย (1 − a) ซึ่งคือ stencil แล้วบวก A เข้าไปตรง ๆ ซึ่งคือ plus ผลเท่ากันทุกพิกเซล
มองแบบนี้แล้วปัญหาขอบทุกแบบอธิบายได้: ไม่มี alpha ก็เหลือแค่ plus, สีไม่ได้ premult ก็บวกสีเกินเข้าไป, ส่วน premult ซ้ำ รูยังขนาดเท่าเดิมแต่สีที่เติมน้อยไป
- 1B (plate)
- 2stencil ด้วย alpha ของ A
- 3plus A
- 4ผลลัพธ์
alpha เป็นอย่างไรหลัง merge
alpha ก็ใช้สูตรเดียวกัน: a + b·(1 − a) ตัวเลขด้านล่างวัดจาก Nuke โดย A = 0.3 (alpha 0.5) และ B = 0.4 (alpha 0.8)
| op | สูตร | rgb | alpha |
|---|---|---|---|
| over | A + B(1−a) | 0.5 | 0.9 |
| under | B + A(1−b) | 0.46 | 0.9 |
| plus | A + B | 0.7 | 1.3 |
| mask | B·a | 0.2 | 0.4 |
| stencil | B(1−a) | 0.2 | 0.4 |
plus ทำให้ alpha เกิน 1 ได้ อย่าใช้รวม matte
ญาติของ over
under วาง A ไว้ข้างหลัง B โดยไม่ต้องสลับสาย mask เก็บ B เฉพาะในรูปของ A ส่วน stencil เจาะรู ทั้ง mask และ stencil คูณ rgb กับ alpha พร้อมกัน ภาพจึงยัง premult ถูก
operation matte คือ premult กับ over ในตัวเดียว: A·a + B·(1 − a) ใช้เมื่อ A ยังไม่ premult เช่นภาพจากคีย์ที่มี alpha แล้ว
เช็กขอบในช็อตจริง
วาง element บน Constant ขาวแล้วบนดำ ขอบดำโผล่บนขาว ขอบเรืองโผล่บนดำ แล้วดัน gain ของ Viewer ขึ้นและลงเพื่อเช็กอีกชั้น วิธีไล่หา node ที่ premult ซ้ำทีละตัวอยู่ใน F2
ถ้า A ใหญ่กว่าเฟรม เช่นควันที่ล้นออกไป ตั้ง bbox ของ Merge เป็น B เพื่อไม่ให้ขอบเขตการคำนวณบวมโดยไม่จำเป็น
4 ในงานจริง
ทำใน Nuke
- Merge (over): A = element ที่ premult แล้ว, B = plate
- element ยังไม่ premult (ภาพคีย์): Premult ก่อน Merge หรือใช้ operation matte
- อยากให้ A อยู่หลัง B โดยไม่สลับสาย: operation under
- เจาะรูอย่างเดียว: stencil · เก็บเฉพาะข้างใน: mask
- bbox ของ Merge: B เมื่อ A ล้นเฟรม
พลาดบ่อย → แก้ยังไง
- ✗ over ภาพคีย์ที่ยังไม่ premult ตรง ๆ✓ สีนอก alpha ถูกบวกเข้า plate ใส่ Premult ก่อน หรือใช้ matte
- ✗ stencil พื้นหลังแล้ว over element ทับ เพื่อวางของไว้ข้างหลัง✓ มักได้เส้นขอบดำบาง ๆ ใช้ under แทน
- ✗ รวม matte สองอันด้วย plus✓ alpha เกิน 1 แล้ว over จะลบพื้นหลัง ใช้ max หรือ screen (ทบทวนจาก F1)
- ✗ แก้ขอบดำด้วยการ erode alpha✓ ถ้าต้นเหตุคือ premult ซ้ำ erode แค่ซ่อนอาการ ให้หา Premult ที่เกินแล้วเอาออก
เช็กก่อนส่งช็อต
- A premult ครั้งเดียวก่อนเข้า over
- B คือ plate A คือ element
- over บนขาวและดำแล้วไม่มีขอบผิด
- alpha หลัง merge ไม่เกิน 1
5 เช็กตัวเอง
CG ของคุณมีขอบดำบาง ๆ รอบตัว เวลาวางบนท้องฟ้าสว่าง สาเหตุที่น่าจะเป็นที่สุดคือ?
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. A = 0.3 (alpha 0.5, premult แล้ว) over B = 0.4 ได้ rgb เท่าไร
2. ภาพคีย์ที่ยังไม่ premult แต่มี alpha แล้ว ใช้ Merge operation ไหนได้ผลถูกในตัวเดียว
ตัวเลขมาจากไหน: สูตร merge ตรวจกับ Nuke 17.0v2 แล้ว ภาพในบทนี้คำนวณในเบราว์เซอร์แบบง่าย ค่าที่เกิน 1 จะถูกตัดตอนแสดงผล