1 อธิบาย
ภาพ float เก็บค่าติดลบได้ node ที่ "ดันขอบ" อย่าง sharpen หรือการลบภาพ จะสร้างค่าต่ำกว่า 0 รอบขอบ บนจอเห็นเป็นดำ แต่ถ้า merge หรือ grade ต่อ ค่าติดลบจะทำให้ขอบดำหรือสีเพี้ยนแบบแปลก ๆ
Clamp ตัดค่าต่ำกว่า minimum และสูงกว่า maximum ใช้ตัดค่าติดลบได้ แต่อย่าตัดค่าเกิน 1 ทิ้งถ้าเป็นแสง HDR ที่ต้องการ
2 ลงมือใน mini compositor
โจทย์: เปิด Clamp ให้ตัดเฉพาะค่าติดลบ (minimum 0) แต่ยังเก็บค่าเกิน 1 ไว้ (maximum 10)
3 เจาะลึก
ค่าติดลบมาจากไหนบ้าง
ภาพ float ใน Nuke เก็บค่าต่ำกว่า 0 ได้ และหลาย node สร้างมันขึ้นมาเองโดยไม่บอก จอแสดงค่าพวกนี้เป็นดำสนิท จึงมองด้วยตาแทบไม่เห็น นอกจากต้นเหตุในตารางแล้ว despill บางแบบและการใส่ grain กลับก็ดันพิกเซลมืดให้ต่ำกว่า 0 ได้เช่นกัน
| ต้นเหตุ | เกิดตรงไหน |
|---|---|
| Sharpen | ฝั่งมืดของขอบที่ตัดกับของสว่าง |
| Merge minus / from | ทุกที่ที่ภาพหนึ่งน้อยกว่าอีกภาพ (difference ให้ค่าสัมบูรณ์ จึงไม่ติดลบ) |
| Saturation มากกว่า 1 | สีที่จัดอยู่แล้ว เช่นไฟ LED หรือประกายไฟ |
| แปลงพื้นที่สีจาก gamut กว้าง | สีจัดที่อยู่นอกขอบเขตของปลายทาง |
| filter คม ๆ ใน Transform | วงขอบมืดรอบของสว่าง (ringing) |
ทำไมมันอันตราย
ค่าติดลบอยู่เฉย ๆ ไม่เป็นไร ปัญหาคือ node ถัดไป Blur กระจายมันเป็นวงขอบมืด multiply ด้วยค่าติดลบกลับทิศ gamma และการแปลงเข้า log ทำงานกับค่าติดลบได้ไม่ดี ผลออกมาเป็นจุดดำหรือสีแปลกที่หาที่มายาก
ตัวอย่าง: sharpen หุ่นยนต์ CG ที่ยืนหน้าประกายไฟ HDR ขอบหุ่นด้านติดไฟจะติดลบ พอ defocus หรือ blur ต่อ ค่าติดลบจะกระจายเป็นเส้นขอบดำรอบหุ่นซึ่งไม่มีในเรนเดอร์ (glow ที่ใช้ threshold ไม่ค่อยโดน เพราะมันเบลอเฉพาะส่วนที่สว่างเกิน threshold)
ไฟล์ integer (8/16-bit) ตัดค่าติดลบเป็น 0 เอง แต่ EXR เก็บไว้ครบ ค่าที่หลุดไปจึงไปโผล่ที่ห้อง grade
- 1Sharpen
- 2ขอบติดลบ
- 3Defocus / Blur
- 4เส้นขอบดำ
หาให้เจอก่อนแก้
ชี้เมาส์อ่านค่าที่ขอบด้านมืดของส่วนที่ sharpen หรือขอบรอบของสว่าง ถ้าจะหาทั้งภาพ ใช้ Expression ทำ alpha = r<0 || g<0 || b<0 แล้วดูช่อง a จุดขาวคือพิกเซลติดลบ
หาเจอแล้วถามก่อนว่ามาจาก node ไหน แก้ที่ต้นเหตุดีกว่า clamp ปลายทาง
เลือกวิธีแก้ให้ตรงต้นเหตุ
Clamp ตัดแค่ล่างที่ 0 แล้วปล่อยด้านบนไว้ เหมาะกับค่าติดลบจาก sharpen หรือ saturation อย่าตั้ง maximum = 1 เพราะไฟ HDR ที่ glow และ defocus ต้องใช้จะหายไปด้วย
บางค่าติดลบตั้งใจให้มี เช่นผลต่างระหว่าง plate กับ CG ที่จะบวกกลับทีหลัง ถ้า clamp ระหว่างทาง การบวกกลับจะไม่ได้ภาพเดิม ส่วน ringing จาก Transform ให้ทำ transform ใน log หรือเลือก filter ที่นุ่มกว่า
| ต้นเหตุ | วิธีแก้ |
|---|---|
| Sharpen / Saturation | Clamp ล่าง 0 บนเปิด |
| ผลต่างที่จะบวกกลับ | ไม่ clamp เก็บ float ไว้ |
| Transform ringing | transform ใน log หรือ filter นุ่มกว่า |
4 ในงานจริง
ทำใน Nuke
- Clamp: minimum 0 และปิด maximum (หรือตั้งสูงพอ) เพื่อตัดเฉพาะค่าติดลบ
- Expression: alpha = r<0 || g<0 || b<0 แล้วดูช่อง a เพื่อหาค่าติดลบทั้งภาพ
- Log2Lin (lin2log) → Transform → Log2Lin (log2lin) เมื่อ filter คมทำให้เกิด ringing
- Merge from / minus ที่จะบวกกลับภายหลัง: อย่าใส่ Clamp ระหว่างทาง
พลาดบ่อย → แก้ยังไง
- ✗ Clamp 0–1 ทั้งภาพตอนท้าย “ให้ปลอดภัย”✓ ตัดแค่ล่าง และตัดใกล้ต้นเหตุ ค่าเกิน 1 คือแสงที่ต้องเก็บไว้
- ✗ ดูภาพบนจอแล้วคิดว่าไม่มีค่าติดลบ เพราะเห็นเป็นดำปกติ✓ probe ขอบ หรือทำ alpha ตรวจด้วย Expression
- ✗ Clamp ผลต่างระหว่าง plate กับ CG ก่อนบวกกลับ✓ ค่าติดลบตรงนี้ตั้งใจให้มี เก็บ float ไว้จนบวกกลับเสร็จ
- ✗ คิดว่า Merge difference ทำให้ติดลบ✓ difference ให้ค่าสัมบูรณ์ ตัวที่ติดลบได้คือ minus และ from
เช็กก่อนส่งช็อต
- สแกนทั้งภาพหาค่าติดลบอย่างน้อยครั้งหนึ่งก่อนส่ง
- ทุก Clamp มีเหตุผล และไม่ตัดค่าเกิน 1 โดยไม่ตั้งใจ
- ขอบที่ sharpen ไม่มีเส้นมืดหลัง defocus หรือ blur
- ค่าติดลบที่ตั้งใจ (ผลต่างที่จะบวกกลับ) ไม่ถูก clamp
5 เช็กตัวเอง
จะตัดค่าติดลบโดยไม่เสียไฟ HDR ตั้ง Clamp ยังไง
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. หุ่นยนต์หน้าประกายไฟ HDR ถูก sharpen แล้วมีเส้นขอบดำหลังใส่ defocus ควรใส่ Clamp แบบไหน และตรงไหน
2. Merge แบบไหนให้ผลติดลบได้
ตัวเลขมาจากไหน: ภาพคำนวณในเบราว์เซอร์ 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 ใช้ในเรนเดอร์เท่านั้น)