1 อธิบาย
Blur แบบ Gaussian ทำให้จุดสว่างฟุ้งจาง ๆ แต่เลนส์จริงทำให้จุดสว่างที่หลุดโฟกัสกลายเป็นวงกลมขอบชัด (bokeh) โดยเฉพาะแสงจ้าอย่างประกายไฟ
Defocus ต้องทำกับค่า linear ที่ยังไม่ตัดที่ 1 ไม่งั้นวง bokeh จะจางเกินจริง กด node ทั้งสองเพื่อเทียบ
2 ลงมือใน mini compositor
3 เจาะลึก
เลนส์ทำอะไรกับจุดแสงหนึ่งจุด
เมื่อจุดหนึ่งอยู่นอกระยะโฟกัส แสงจากจุดนั้นไม่ได้ตกลงที่จุดเดียวบนเซนเซอร์ แต่กระจายเป็นวงตามรูปรูรับแสง วงนี้เรียกว่า circle of confusion ข้างในวงสว่างเกือบเท่ากันทั้งวงและมีขอบชัด นี่คือ bokeh
Gaussian blur ให้ผลอีกแบบ สว่างที่สุดตรงกลางแล้วจางลงเรื่อย ๆ ไม่มีขอบ จุดไฟเลยกลายเป็นหมอกฟุ้ง กับภาพเรียบ ๆ สองแบบดูคล้ายกัน แต่พอมีจุดแสงจ้า เช่นประกายไฟ ความต่างจะชัดทันที
| เครื่องมือ | รูปการกระจาย | เปลี่ยนตามความลึก | ใช้เมื่อ |
|---|---|---|---|
| Blur | ระฆังคว่ำ ไม่มีขอบ | ไม่ | ทำ matte นุ่ม, หมอก, diffusion |
| Defocus | วงกลมเรียบ ขอบชัด | ไม่ (ขนาดเดียวทั้งภาพ) | element ที่อยู่ระยะเดียวกันทั้งชิ้น |
| ZDefocus | disc, เหลี่ยม หรือรูปที่ป้อนเอง | ใช่ อ่านจาก depth | CG หรือ plate ที่มี depth |
| Convolve | ภาพอะไรก็ได้เป็น kernel | ไม่ | bokeh จากเลนส์จริงที่ถ่ายเก็บไว้ |
ทำไมต้องเป็นค่า linear ที่ยังไม่ถูกตัด
Defocus ไม่ได้สร้างแสงใหม่ มันแค่เกลี่ยแสงที่มีอยู่ไปทั่ววง ตัวอย่าง: ประกายไฟ 1 pixel ค่า 62 ถ้ากระจายเป็นวงกว้าง 14 px (พื้นที่ราว 154 pixel) แต่ละ pixel ในวงจะได้ราว 0.40 ยังเห็นเป็นวงสว่างชัดบน plate ทะเลทราย
ถ้าประกายเดียวกันถูกตัดที่ 1 ไปก่อน เช่นมาจาก JPEG หรือผ่าน Clamp มา แต่ละ pixel จะเหลือแค่ราว 0.0065 แทบมองไม่เห็น แสงเหลือน้อยลง 62 เท่า นี่คือเหตุที่ defocus ต้องทำใน scene-linear float ที่ค่าเกิน 1 ยังอยู่ครบ
- 1EXR linear ค่าเกิน 1 ครบ
- 2Defocus ทีละ layer
- 3Merge กลับ
- 4Grain ท้ายสุด
ห้องแล็บของเรา: Defocus ใช้ 64 จุดในวงกลมน้ำหนักเท่ากัน เป็นไอเดียเดียวกับ Defocus ใน Nuke ซึ่งก็ไม่อ่าน depth เหมือนกัน ถ้าอยากให้เบลอตามความลึกต้องใช้ ZDefocus
ขนาดวงมาจากไหน และ depth แบบไหนที่คุณถืออยู่
ระยะชัดตื้นขึ้นเมื่อ f-number เล็กลง (รูรับแสงกว้าง) เลนส์ยาวขึ้น หรือโฟกัสใกล้ขึ้น ระยะชัดด้านหลังจุดโฟกัสมีมากกว่าด้านหน้า ฉากที่ชัดตื้นเกินจริงจะดูเหมือนโมเดลจิ๋ว ให้ดูเลนส์และค่ากล้องจาก matchmove ก่อนตั้งค่า ไม่ใช่เดา
Depth มีสองแบบหลัก ๆ ScanlineRender ของ Nuke ให้ 1/Z (ใกล้ = ค่าสูง ไกล = เข้าใกล้ 0) ส่วน renderer ส่วนใหญ่ให้ระยะจริงในหน่วยฉาก (ใกล้ = ค่าน้อย ไกล = ค่ามาก) ถ้าตั้ง ZDefocus ผิดแบบ จะแทบไม่เบลอเลยหรือเบลอผิดที่
| depth แบบ | ใกล้ | ไกล | ZDefocus math |
|---|---|---|---|
| 1/Z (ScanlineRender) | ค่าสูง | เข้าใกล้ 0 | far = 0 |
| ระยะจริง (render) | ค่าน้อย | ค่ามาก | depth |
sample depth ที่ของใกล้สุดและไกลสุดก่อนทุกครั้ง แล้วจะรู้ทันทีว่าเป็นแบบไหน
ขอบระหว่างหน้ากับหลัง
ช็อตหุ่นยนต์ CG ยืนชัดอยู่หน้า plate ทะเลทรายที่เบลอ: ถ้าใช้ ZDefocus ตัวเดียวกับภาพที่ merge แล้ว สีของหุ่นจะถูกเกลี่ยเข้าไปในพื้นหลังที่เบลอ เกิดขอบเงาหุ่นรอบตัว เพราะภาพ 2D ไม่มีข้อมูลว่าหลังหุ่นมีอะไร
ทางแก้คือแยก layer ตามความลึก defocus แต่ละ layer แยกกันโดยผูก focus ไว้ที่ค่าเดียว แล้ว merge จากหลังมาหน้า หรือใช้ deep ถ้ามีข้อมูล แต่ต้องรู้ว่าแม้ blur(FG) over blur(BG) ก็ยังไม่ถูกตามฟิสิกส์ 100% ที่ขอบที่ทั้งสองชั้นเบลอ เป็นการประมาณที่ใช้กันเพราะดีพอในเกือบทุกช็อต
Depth ที่ขอบ anti-alias เป็นค่าเฉลี่ยระหว่างหน้ากับหลัง จึงชี้ไปที่ระยะที่ไม่มีอะไรอยู่จริง ทำให้เกิดเส้นขอบคมในของที่ควรเบลอ ให้ขยาย depth ของชั้นหน้าเลยขอบออกไปนิดหนึ่ง (edge extend) และทำแค่ครั้งเดียว
- 1แยก FG / BG
- 2Edge extend depth ครั้งเดียว
- 3ZDefocus ต่อ layer
- 4Merge หลัง → หน้า
4 ในงานจริง
ทำใน Nuke
- Defocus: เบลอแบบวงกลมขนาดเดียวทั้งภาพ เหมาะกับ element ที่อยู่ระยะเดียว เช่นประกายไฟชุดหนึ่งที่ลอยห่างกล้องเท่า ๆ กัน
- ZDefocus: ตั้ง math ให้ตรงกับ depth (1/Z = far = 0, ระยะจริง = depth) แล้วเปิด output แบบ focal plane setup เพื่อดูแถบที่ชัด
- ZDefocus filter type: disc, bladed หรือ image ถ้าอยากได้ bokeh รูปเฉพาะให้ป้อนภาพ kernel เอง หรือใช้ Convolve กับ element ที่อยู่ระยะเดียว
- ปิด depth of field ใน render แล้วมาทำใน comp จะได้ควบคุมได้และไม่เบลอซ้ำสองรอบ
- Defocus plate ที่ degrain แล้ว แล้วใส่ grain ครั้งเดียวที่ท้าย comp (เหตุผลที่ grain อยู่ท้ายสุด ดู O5)
พลาดบ่อย → แก้ยังไง
- ✗ ใช้ Blur ทำของหลุดโฟกัสที่มีจุดไฟจ้า✓ ใช้ Defocus หรือ ZDefocus จุดไฟต้องกลายเป็นวงที่มีขอบ ไม่ใช่หมอก
- ✗ Defocus element ที่ถูกตัดที่ 1 มาแล้ว (JPEG หรือหลัง Clamp)✓ ใช้ EXR float ที่ค่าเกิน 1 ยังอยู่ ถ้ามีแต่ไฟล์ที่ถูกตัด ให้ดันค่าส่วนจ้ากลับขึ้นก่อน defocus
- ✗ ZDefocus แทบไม่ทำอะไร เพราะ math ไม่ตรงกับ depth✓ sample ใกล้/ไกลก่อน แล้วเลือก far = 0 สำหรับ 1/Z หรือ depth สำหรับระยะจริง
- ✗ Grade depth ให้ “ดูสวย” ในจอ✓ depth คือระยะ ไม่ใช่ภาพ ห้ามแก้ด้วยตา ไม่งั้นการคำนวณ defocus ผิดทั้งหมด
- ✗ ZDefocus ตัวเดียวกับภาพที่ merge หุ่นกับ plate แล้ว✓ แยก layer ตามความลึก defocus แยก แล้ว merge จากหลังมาหน้า
เช็กก่อนส่งช็อต
- จุดไฟที่หลุดโฟกัสเป็นวงมีขอบ ไม่ใช่หมอก
- Defocus ทำใน linear float ค่าเกิน 1 ยังอยู่
- รู้ว่า depth เป็น 1/Z หรือระยะจริง และ math ตั้งตรง
- ไม่มีเส้นขอบคมหรือเงาหุ่นรอบขอบ FG ที่เบลอ
- ระยะชัดสมเหตุผลกับเลนส์ ไม่ดูเป็นโมเดลจิ๋ว
- พื้นที่ที่เบลอยังมี grain คมเท่าส่วนอื่น
5 เช็กตัวเอง
ทำไม defocus ต้องทำก่อนตัดค่าที่ 1
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. คุณใช้ depth จาก ScanlineRender กับ ZDefocus ที่ตั้ง math = depth แล้วแทบไม่เห็นการเบลอ น่าจะเป็นเพราะอะไร
2. หุ่นยนต์ชัดยืนหน้าทะเลทรายที่เบลอ ทำไมควร defocus ทะเลทรายแยกจากหุ่น
ตัวเลขมาจากไหน: ภาพคำนวณในเบราว์เซอร์ 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 ใช้ในเรนเดอร์เท่านั้น)