1 อธิบาย
Sharpen ไม่ได้เพิ่มรายละเอียดจริง มันแค่ดันฝั่งสว่างของขอบให้สว่างขึ้น ฝั่งมืดให้มืดลง จึงเกิดขอบเรืองและค่าติดลบ ถ้า plate คมกว่า CG ให้แก้ที่ต้นเหตุ (filter ของ render หรือ defocus) ก่อน
ถ้าจำเป็นต้อง sharpen ให้ใช้น้อยและขนาดเล็ก แล้วเช็กขอบด้วย viewer gain
out = x + amount · (x − blur(x))2 ลงมือใน mini compositor
3 เจาะลึก
สูตรนี้ทำอะไรจริง ๆ
x − blur(x) คือ “ชั้นขอบ” ตรงที่เรียบจะเป็น 0 ตรงขอบจะเป็นบวกฝั่งสว่างและลบฝั่งมืด Sharpen เอาชั้นขอบนี้คูณ amount แล้วบวกกลับ ไม่มีรายละเอียดใหม่เกิดขึ้น มีแค่ความต่างที่ขอบถูกดันให้มากขึ้น
ตัวอย่างขอบวัตถุมืด (0.1) ตัดกับท้องฟ้าสว่าง (0.8) ที่ amount 1.5: pixel ฟ้าติดขอบที่ blur แล้วได้ 0.6 จะกลายเป็น 0.8 + 1.5 × 0.2 = 1.1 สว่างกว่าฟ้าจริง ส่วน pixel ฝั่งมืดติดขอบที่ blur แล้วได้ 0.3 จะกลายเป็น 0.1 − 1.5 × 0.2 = −0.2 ติดลบ
- 1x
- 2blur(x)
- 3x − blur(x) = ขอบ
- 4× amount
- 5+ x = ผล
สอง knob กับสิ่งที่เห็น
amount คุมว่าดันแรงแค่ไหน size คุมว่าขอบกว้างแค่ไหน size เล็กดันแค่ขอบบาง ๆ size ใหญ่ทำให้เกิดวงสว่างหนารอบตัวหุ่นที่เห็นได้จากระยะไกล ห้องแล็บของเราใช้สูตรนี้ตรง ๆ ไอเดียเดียวกับ Sharpen ใน Nuke
| knob | ทำอะไร | มากไปจะเห็น |
|---|---|---|
| amount | ความแรงที่ดันขอบ | ขอบขาวและขอบดำรอบวัตถุ, ค่าติดลบ |
| size | ความกว้างของแถบขอบ | halo หนาเป็นวง ดูเป็นภาพวิดีโอเก่า |
ทำไมมักเป็นทางแก้ที่ผิด
ปกติ CG คมกว่า plate ไม่ใช่นุ่มกว่า plate ถ่ายผ่านเลนส์จริงที่มีความนุ่มเสมอแม้ในจุดโฟกัส ทางที่ถูกจึงมักเป็นการทำ CG ให้นุ่มลงหนึ่งถึงสอง pixel ให้เท่า plate ไม่ใช่ sharpen plate
ถ้า CG นุ่มกว่า plate จริง ให้หาต้นเหตุก่อน เช่น filter ของ render, ความละเอียดต่ำไป, defocus หรือ motion blur ที่มากไป Sharpen ยังขยาย grain และ noise ด้วย ภาพจะดูกรอบแข็ง และค่าติดลบที่ขอบจะไปสร้างปัญหาต่อกับการหาร, log หรือการ key
กรณีที่ sharpen มีเหตุผล: plate บางชุดมี sharpening จากกล้องหรือขั้นตอนก่อนหน้าติดมา เห็นเป็นเส้นสว่างบาง ๆ ตามขอบ ถ้าจะให้ CG เข้ากัน ให้ sharpen CG นิดเดียวจนขอบมีลักษณะเดียวกับ plate และทำก่อนใส่ grain เสมอ
ตรวจ halo ให้เห็นจริง
Halo ซ่อนตัวเก่งที่ exposure ปกติ ให้ยก viewer gain ขึ้นดูฝั่งมืด กดลงดูฝั่งสว่าง แล้ว sample pixel ติดขอบด้านมืด ถ้าเห็นตัวเลขติดลบ แปลว่าดันแรงเกินไป
- 1viewer gain ขึ้น
- 2viewer gain ลง
- 3sample ฝั่งมืด
- 4wipe เทียบ plate
ซูม 200% แล้ว wipe เทียบกับขอบของจริงใน plate ขอบ CG ควรมีหน้าตาเดียวกัน
4 ในงานจริง
ทำใน Nuke
- Sharpen: เริ่มจาก amount ต่ำ size เล็ก แล้วเพิ่มทีละน้อย
- อยากเห็นทีละชิ้น: Blur → Merge minus (A = ต้นฉบับ, B = blur) = ชั้นขอบ → Multiply (หรือ Grade ที่ปิด black clamp) เพื่อคูณ → Merge plus กับต้นฉบับ ชั้นขอบมีค่าติดลบฝั่งมืด Grade ค่า default เปิด black clamp ไว้ จะตัดค่าติดลบทิ้ง ขอบจะสว่างขึ้นอย่างเดียวไม่มืดลง
- CG คมเกิน plate: Blur เล็กน้อยบน CG ก่อน merge แทนการ sharpen plate
- Sharpen ต้องอยู่ก่อน Grain เสมอ ไม่งั้น grain จะกรอบและแตก
พลาดบ่อย → แก้ยังไง
- ✗ Sharpen ทั้ง comp หลังใส่ grain✓ grain ท้ายสุดเสมอ ถ้าต้อง sharpen ให้ทำก่อน
- ✗ ใช้ sharpen แก้ CG ที่ดูเบลอ✓ หาต้นเหตุ: filter ของ render, ความละเอียด, defocus หรือ motion blur
- ✗ Sharpen ขอบ key ที่นุ่ม เพื่อให้ดูชัด✓ จะเกิดขอบเรืองรอบ matte แก้ที่ key หรือ edge treatment แทน
- ✗ ไม่สนค่าติดลบที่ขอบ✓ ลด amount หรือ size จนไม่มีค่าติดลบ การ Clamp ทีหลังแค่ซ่อนปัญหา
เช็กก่อนส่งช็อต
- viewer gain ขึ้นและลงแล้วไม่เห็นวง halo รอบวัตถุ
- ไม่มีค่าติดลบที่ขอบฝั่งมืด
- ความคมของ CG เท่ากับ plate เมื่อ wipe เทียบที่ 200%
- sharpen (ถ้ามี) อยู่ก่อน grain
5 เช็กตัวเอง
sharpen เพิ่มรายละเอียดจริงไหม
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. หลัง sharpen pixel ฝั่งมืดของขอบนั้นอ่านได้ −0.2 ควรทำอะไร
2. CG หุ่นยนต์ดูคมกว่า plate ทะเลทราย ทางแก้แรกที่ควรลองคืออะไร
ตัวเลขมาจากไหน: ภาพคำนวณในเบราว์เซอร์ Saturation, Multiply, Clamp, Invert, Keymix, Copy และ Grade ตรงกับ Nuke 17.0v2 (ตรวจแล้ว) ส่วน Blur, Defocus, Glow, Sharpen, ChromaticAberration, Vignette, LensDistort, Grain, Erode, Toe, Keyer และ Despill เป็นแบบสอนหลักการ ไม่เท่า node ใน Nuke เป๊ะ Transform ในห้องนี้ก็เป็นแบบสอนหลักการเช่นกัน ใช้ bilinear ไม่ concatenate และตัดขอบที่เฟรม ภาพเป็นเรนเดอร์ Blender ของเราเอง (green screen สร้างด้วยโค้ดล้วน ฉากทะเลทรายใช้ภูเขาจาก Gaea 2.3 ท้องฟ้าเป็น HDRI CC0 จาก Poly Haven หินและหญ้าจาก Poly Haven CC0 ทรายและหินผาจาก Quixel และ rig หุ่นจาก Mixamo โดย Quixel และ Mixamo ใช้ในเรนเดอร์เท่านั้น)