หน้าแรก · บทเรียน

Merge over กับ premult

ทำไมขอบถึงดำหรือเรือง และแก้ที่ต้นเหตุ

บท 01 · ฟรี · ~6 นาที · หน่วย: ขอบและ alpha

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 ซ้ำ ขอบดำจะชัดที่สุด

Viewer1 · บท 01rgba · 1001

3 เจาะลึก

over = plus + stencil

over แยกได้เป็นสองขั้น: เจาะรูใน B ด้วย (1 − a) ซึ่งคือ stencil แล้วบวก A เข้าไปตรง ๆ ซึ่งคือ plus ผลเท่ากันทุกพิกเซล

มองแบบนี้แล้วปัญหาขอบทุกแบบอธิบายได้: ไม่มี alpha ก็เหลือแค่ plus, สีไม่ได้ premult ก็บวกสีเกินเข้าไป, ส่วน premult ซ้ำ รูยังขนาดเท่าเดิมแต่สีที่เติมน้อยไป

  1. 1B (plate)
  2. 2stencil ด้วย alpha ของ A
  3. 3plus A
  4. 4ผลลัพธ์

alpha เป็นอย่างไรหลัง merge

alpha ก็ใช้สูตรเดียวกัน: a + b·(1 − a) ตัวเลขด้านล่างวัดจาก Nuke โดย A = 0.3 (alpha 0.5) และ B = 0.4 (alpha 0.8)

opสูตรrgbalpha
overA + B(1−a)0.50.9
underB + A(1−b)0.460.9
plusA + B0.71.3
maskB·a0.20.4
stencilB(1−a)0.20.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

  1. Merge (over): A = element ที่ premult แล้ว, B = plate
  2. element ยังไม่ premult (ภาพคีย์): Premult ก่อน Merge หรือใช้ operation matte
  3. อยากให้ A อยู่หลัง B โดยไม่สลับสาย: operation under
  4. เจาะรูอย่างเดียว: stencil · เก็บเฉพาะข้างใน: mask
  5. 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 เช็กตัวเอง

เช็กตัวเอง 1 ข้อ

CG ของคุณมีขอบดำบาง ๆ รอบตัว เวลาวางบนท้องฟ้าสว่าง สาเหตุที่น่าจะเป็นที่สุดคือ?

สิ่งที่ได้เรียน

🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด

คำถามเพิ่ม

1. A = 0.3 (alpha 0.5, premult แล้ว) over B = 0.4 ได้ rgb เท่าไร

2. ภาพคีย์ที่ยังไม่ premult แต่มี alpha แล้ว ใช้ Merge operation ไหนได้ผลถูกในตัวเดียว

ตัวเลขมาจากไหน: สูตร merge ตรวจกับ Nuke 17.0v2 แล้ว ภาพในบทนี้คำนวณในเบราว์เซอร์แบบง่าย ค่าที่เกิน 1 จะถูกตัดตอนแสดงผล