1 อธิบาย
Cryptomatte เก็บ ID หลายตัวในแต่ละ pixel พร้อมบอกว่าแต่ละตัวกินพื้นที่ของ pixel นั้นเท่าไร matte ที่ได้จึงมีขอบนุ่มแบบ anti-aliased ส่วน ID pass แบบหนึ่ง ID ต่อ pixel ตอบได้แค่ใช่หรือไม่ใช่ visor (กระจกหน้าหุ่น) มีราว 129 pixel และ 47% ของ pixel ที่ visor แตะเป็นขอบที่ครอบไม่เต็ม
คลิกที่หุ่นหรือที่ภาพซูมหัวเพื่อเลือก ID แล้วสลับแหล่ง matte ระหว่าง “ID pass (1 ID ต่อ pixel)”, “Crypto: material” และ “Crypto: object” กด “matte (แดง)” เพื่อดู matte แล้วดู readout สองค่า: matte ต่างจาก coverage ของกระจกเท่าไร (ถ่วงตามความสว่าง) และปลายเสาอากาศอยู่ใน matte เท่าไร
matte = Σ coverage where ID = pick (over the ranks)2 ลงมือลอง
โจทย์: ทำให้ visor สว่างขึ้น 1 stop พอดี โดยไม่แตะส่วนอื่นเลย แม้แต่ปลายเสาอากาศที่ใช้ material เดียวกับ visor
เลือก visor ด้วยแหล่ง matte ทีละแบบ แล้วดู readout สองค่า: matte ต่างจาก coverage ของกระจก (ถ่วงตามความสว่าง) และปลายเสาอากาศใน matte ทั้งคู่ต้องเกือบเป็นศูนย์ ซูมดูขอบด้วย
3 เจาะลึก
ใน pixel เดียวมีอะไรบ้าง
pixel ที่ขอบ visor มีทั้ง visor และสิ่งที่อยู่ข้าง ๆ ปนกัน Cryptomatte เก็บรายการ ID เรียงตามลำดับ (rank) คู่กับ coverage ว่าแต่ละ ID กินพื้นที่ pixel นั้นเท่าไร matte ของการเลือกคือผลรวม coverage ของ ID ที่ตรงกับชื่อที่เลือก ขอบและ motion blur จึงนุ่มตามจริง
ID pass แบบหนึ่ง ID ต่อ pixel ต้องยก pixel ทั้งตัวให้ ID เดียว ขอบจึงเป็นขั้นบันได ในรูปนี้ matte แบบนั้นพลาดที่ขอบ visor ได้ราว 61% (วัดแบบถ่วงตามความสว่าง)
| ID pass หนึ่ง ID ต่อ pixel | Cryptomatte | |
|---|---|---|
| เก็บต่อ pixel | ID เดียว | หลาย ID พร้อม coverage |
| ขอบ | ขั้นบันได | anti-aliased |
| motion blur | แข็ง ตัดเป็นใช่หรือไม่ | นุ่มตาม coverage |
object, material หรือ asset
Blender เขียน Cryptomatte แยกเป็น layer ของ object, material และ asset พร้อม manifest ที่เก็บชื่อ คลิกจุดเดียวกันแต่อยู่คนละ layer ได้ matte คนละแบบ
ใน layer material ทุกชิ้นที่ใช้ material เดียวกันเป็นการเลือกครั้งเดียว เหมาะเมื่ออยากเปลี่ยนวัสดุทั้งตัว แต่ถ้าโจทย์คือชิ้นเดียว เช่น visor โดยไม่แตะปลายเสาอากาศ ต้องเลือกใน layer object ส่วน layer asset รวมเป็นกลุ่มใหญ่กว่า แล้วแต่ว่าฉากถูกจัดไว้อย่างไร
ก่อนเลือก ถามตัวเองว่าโจทย์พูดถึงชิ้นส่วนหรือวัสดุ แล้วค่อยเลือก layer
การเลือกเก็บเป็นชื่อ ไม่ใช่สี
สิ่งที่เลือกไว้ถูกเก็บเป็นชื่อจาก manifest เมื่อคัดลอก setup ไปใช้กับช็อตอื่นที่ rig หรือ namespace ต่างกัน ชื่ออาจไม่ตรงสักตัว matte จะว่างเปล่าโดยไม่มี error เตือน
วิธีแก้คืออ่าน manifest ของช็อตใหม่ แล้วจับคู่แต่ละชื่อด้วยส่วนท้ายของชื่อ จากนั้นดู matte ทีละตัว เพราะการจับคู่ด้วยส่วนท้ายอาจได้ object มากกว่าเดิม และบางชื่ออาจไม่มีในช็อตใหม่จริง ๆ
- 1คัดลอก setup
- 2อ่าน manifest ใหม่
- 3จับคู่ด้วยส่วนท้ายชื่อ
- 4ดู matte ทีละตัว
จุดที่ Cryptomatte ไม่พอ
ใช้ Cryptomatte เป็น stencil เพื่อวางของใหม่ไว้ด้านหลัง ขอบที่ blur หรือ defocus ยังมีสีเก่าปนอยู่ เพราะสีของ pixel ขอบเป็นสีผสม วิธีแก้คือ edge-extend หรือ paint สีของชิ้นด้านหน้าให้ถึงขอบก่อน แล้วค่อย mask ด้วย alpha เดิม
Cryptomatte เหมาะกับการเลือกเร็ว ๆ ของวัตถุทึบ ผม ขน volume และ motion blur ที่ซ้อนกันหนัก ๆ ทำด้วย deep จะดีกว่า และ layer ID กับ crypto เป็นข้อมูล ต้องอ่านแบบ raw ห้ามผ่าน colour transform
ถ้าขอบที่ blur ยังเห็นสีเดิม อย่าโทษ matte ให้ดูสีของ pixel ขอบ
4 ในงานจริง
ทำใน Nuke
- อ่าน EXR โดยให้ layer ID และ crypto เป็น raw ไม่ผ่าน colour transform
- Cryptomatte: ตั้ง Layer Selection เป็น layer object แล้วเลือก visor ชื่อที่เลือกจะอยู่ใน Matte List
- EXPTool ในโหมด Stops ที่ +1 (เท่ากับคูณ 2) หรือ Grade gain 2 โดยต่อ matte เข้า mask
- หรือใช้ Keymix: ภาพที่ grade แล้วเข้า A ภาพเดิมเข้า B matte เข้า mask ถ้าไม่มี mask Keymix จะให้ B
- Shuffle2 ย้าย matte ไปช่องที่ต้องการ และ Merge2 เมื่อต้องใช้ matte เป็น stencil
พลาดบ่อย → แก้ยังไง
- ✗ เลือกใน layer material ทั้งที่ควรเปลี่ยนแค่ชิ้นเดียว✓ เลือกใน layer object แล้วเช็กว่าชิ้นที่ใช้ material เดียวกันไม่เปลี่ยน
- ✗ ใช้ ID pass แบบหนึ่ง ID ต่อ pixel แล้วได้ขอบขั้นบันได✓ ใช้ Cryptomatte ที่เก็บ coverage จะได้ขอบ anti-aliased
- ✗ คัดลอก comp ไปช็อตอื่นโดยไม่เช็กว่าชื่อยังมีอยู่✓ เทียบชื่อใน matteList กับ manifest ของช็อตใหม่ จับคู่ใหม่ แล้วดู matte ทีละตัว
- ✗ grade สีใต้ crypto stencil บนขอบที่ blur แล้วเห็นสีเก่าที่ขอบ✓ edge-extend หรือ paint สีด้านหน้าให้ถึงขอบ แล้ว mask ด้วย alpha เดิม
- ✗ อ่าน layer ID หรือ crypto ผ่าน colour transform✓ อ่านแบบ raw เพราะเป็นข้อมูล ไม่ใช่ภาพ
เช็กก่อนส่งช็อต
- matte อยู่ใน layer ที่ตรงกับโจทย์ (ชิ้นส่วนหรือวัสดุ)
- ชิ้นที่ใช้ material เดียวกันแต่ไม่อยู่ในโจทย์ไม่เปลี่ยน
- ซูมดูขอบแล้วไม่มีขั้นบันได
- ทุกชื่อใน matteList มีอยู่ใน manifest ของช็อตนี้ และไม่มี matte ว่าง
- ขอบที่ blur ไม่มีสีเก่าโผล่
- layer ID และ crypto ถูกอ่านแบบ raw
5 เช็กตัวเอง
เลือก visor แล้วเร่ง exposure แต่ปลายเสาอากาศสว่างขึ้นด้วย สาเหตุคืออะไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. comp ที่คัดลอกมาจากอีกช็อต matte ของ Cryptomatte ว่างเปล่าแต่ไม่มี error เกิดจากอะไรได้มากที่สุด
2. ทำไม matte จาก Cryptomatte มีขอบนุ่ม ขณะที่ object ID pass ได้ขั้นบันได
ตัวเลขมาจากไหน: ภาพทั้งหมด render ด้วย Blender 5.2 Cycles จากฉากทะเลทรายและหุ่นยนต์ของเราเอง (tools/assets/passes_cg.py) แล้วคำนวณในเบราว์เซอร์ coverage มาจาก Cryptomatte จริงของ Blender (layer object และ material ส่งมา 3 rank) ID ถูกเปลี่ยนเป็นเลขจำนวนเต็มเล็ก ๆ ให้เก็บใน float16 ได้ ส่วนชื่อมาจาก manifest ของ Blender matte แบบหนึ่ง ID ต่อ pixel สร้างจาก rank 0 อย่างเดียว เพื่อให้เห็นว่า ID pass ที่ไม่ anti-aliased เป็นอย่างไร การ decode เป็นแบบสอนหลักการ แนวคิดเดียวกับ node Cryptomatte ของ Nuke