หน้าแรก · Lab · Lens artifact ขั้นสูง

LA3 Halation: บวกเฉพาะแสงที่ฟุ้ง

max(0, ฟุ้ง − ต้นฉบับ) และ roto ไฟแดงออก

Lens artifact ขั้นสูง · ~8 นาที · ฟรี

1 อธิบาย

บนฟิล์ม แสงที่จ้ามากทะลุชั้นรับแสงลงไปสะท้อนจากฐานฟิล์มแล้วย้อนกลับขึ้นมา เกิดเป็นขอบเรืองแดงส้มรอบไฮไลต์ที่ล้น โดยเฉพาะตรงที่สว่างจัดชนกับมืด ห้องนี้กระจายช่องแดงกว้างสุด เขียวรองลงมา น้ำเงินแคบสุด สีส้มแดงจึงเกิดเองจากขนาดที่ต่างกัน

มีกับดักสามข้อ: บวกภาพฟุ้งทั้งก้อน แกนไฟสว่างซ้ำ ลบต้นฉบับแต่ไม่ clamp แกนไฟเป็นรูมืด และไฟที่แดงอยู่แล้วจะแดงซ้อน ดูตัวเลขที่แกนกระจกหน้าหุ่นและที่ไฟแดง แล้วเปิด "เฉพาะที่บวก ×3" เพื่อดูสิ่งที่เพิ่มเข้าไป (ขยาย 3 เท่า ค่าติดลบก็แสดงเป็นสว่างด้วย)

out = img + amount · max(0, spread(key·img) − key·img)

2 ลงมือลอง

โจทย์: ให้ halation บวกเฉพาะแสงที่ฟุ้งออก แกนกระจกไม่เปลี่ยน และไฟแดงไม่แดงซ้อน

ต้องใช้ครบสามอย่าง: minus, clamp และ roto

SkyVFX Lab · LA3interactive · 1001

3 เจาะลึก

halation เกิดที่ไหน และไม่ใช่ glow ธรรมดา

halation ไม่ได้เกิดในเลนส์ มันเกิดในฟิล์ม แสงที่จ้ามากทะลุชั้นรับแสงลงไปถึงฐานฟิล์มแล้วสะท้อนกลับ ชั้นที่โดนก่อนคือชั้นรับแดง ขอบเรืองจึงออกแดงส้ม และเกิดชัดตรงที่ไฮไลต์ล้นชนกับพื้นที่มืด ฟิล์มรุ่นใหม่มีชั้นกัน halation จึงเห็นน้อยกว่าฟิล์มเก่า

bloom ของกล้องดิจิทัลออกขาว ไม่แดง ถ้าโปรเจกต์ถ่ายดิจิทัล halation คือ look ที่ตั้งใจเลือก ต้องดู reference ก่อนว่าต้องการไหม

HalationBloom / glow
เกิดที่ฟิล์ม (สะท้อนจากฐาน)เลนส์/เซนเซอร์
สีแดงส้ม แดงกว้างสุดตามสีไฟ ค่อนข้างขาว
อยู่ตรงไหนขอบไฮไลต์ล้นที่ชนมืดรอบไฮไลต์ทุกทิศ

คณิตที่ทำให้แกนไฟไม่เพี้ยน

ภาพที่ฟุ้งมีพลังงานเท่าเดิมแต่กระจายออก ที่แกนไฟค่าจึงต่ำกว่าต้นฉบับ รอบ ๆ สูงกว่า สิ่งที่เราอยากบวกคือ "ส่วนที่ล้นออกไป" อย่างเดียว คือ ฟุ้ง − ต้นฉบับ แล้วตัดส่วนติดลบทิ้ง ผลในห้องแล็บ: ไม่ลบต้นฉบับ แกนกระจกสว่างขึ้น +12.0% ลบแต่ไม่ clamp แกนดับลง −52% ลบและ clamp แกนไม่เปลี่ยนเลย

ตัวเลือกขั้นสูง: ถ้าฟุ้งด้วย kernel ที่วัดจากเลนส์จริง (PSF) แล้วใส่จุดกลางเพิ่มนิดหนึ่ง (kernel = PSF + จุดเดียว) ภาพคมส่วนหนึ่งจะผ่านไปตรง ๆ แกนไฟคมขึ้นเมื่อเทียบกับขอบเรือง

  1. 1Key ไฮไลต์ที่ล้น
  2. 2ฟุ้ง (แดงกว้างสุด)
  3. 3ลบต้นฉบับ
  4. 4Clamp ≥ 0
  5. 5Merge plus

ไฟที่แดงอยู่แล้ว และเวลาที่ไม่ควรใส่

ไฟท้ายรถ ไฟเตือนสีแดง หรือไฟที่แดงจัดอยู่แล้ว ถ้าปล่อยเข้า key จะได้แดงซ้อนแดงจนเกินจริง roto ออกจาก key ก่อนฟุ้ง ในห้องแล็บไฟแดงได้แดงเพิ่ม +33% จนกว่าจะ roto ออก

halation มีเฉพาะที่ไฮไลต์ล้นจริง ไม่ใช่ทุกช็อต ทุกไฟ ดู reference ของกล้องหรือฟิล์มที่ใช้ก่อน แล้วใส่น้อยที่สุดที่ยังเห็น

ทั้งสูตรในบรรทัดเดียว: key ไฮไลต์ที่ล้น เอาไฟแดงออกจาก key ฟุ้ง ลบต้นฉบับออก เก็บแค่ส่วนที่เกิน 0 แล้วบวกทับ แกนไฟจึงไม่เปลี่ยน

4 ในงานจริง

ทำใน Nuke

  1. Keyer (luminance) เลือกเฉพาะไฮไลต์ที่ล้น ช่วงค่าต้องดันเกิน 1 ได้ แล้ว Premult
  2. Blur แยกช่อง (แดงใหญ่สุด เขียวกลาง น้ำเงินเล็ก) หรือ Convolve กับ kernel ของเลนส์
  3. Merge operation minus = A − B (ตรวจใน Nuke 17 แล้ว): ต่อภาพที่ฟุ้งเข้า A ต้นฉบับที่ key เข้า B
  4. Clamp ขั้นต่ำ 0 (ตั้งขั้นสูงเผื่อไว้ เช่น 10 กันค่าพุ่ง) แล้ว Merge plus ทับ comp
  5. Roto ไฟที่แดงอยู่แล้วออกจาก key และวาง halation ไว้หลัง CA (chromatic aberration) ก่อน grain (ลำดับ stack ทั้งหมดดู LA7)

พลาดบ่อย → แก้ยังไง

  • ✗ บวกภาพที่ฟุ้งทั้งก้อน✓ บวกเฉพาะ max(0, ฟุ้ง − ต้นฉบับ) แกนไฟจึงไม่สว่างซ้ำ
  • ✗ ลบต้นฉบับแล้วลืม clamp✓ ค่าติดลบกินแกนเป็นรูมืดและขอบสีแปลก Clamp ขั้นต่ำ 0 เสมอ
  • ✗ ใส่ halation กับไฟแดง✓ roto ออกจาก key ไม่งั้นแดงซ้อน
  • ✗ ใส่ทุกช็อตเป็น look ประจำ✓ ใส่เมื่อไฮไลต์ล้นจริงและ reference มี

เช็กก่อนส่งช็อต

  • แกนไฟเท่าเดิมเมื่อเทียบก่อน/หลัง (sample ค่าดู)
  • ขอบเรืองออกแดงส้ม แดงกว้างที่สุด
  • ไม่มีค่าติดลบหลัง merge (sample ค่าดู)
  • ไฟที่แดงอยู่แล้วถูก roto ออก
  • อยู่หลัง CA ก่อน grain

5 เช็กตัวเอง

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

ทำไมต้อง clamp ที่ 0 หลัง Merge ลบต้นฉบับออก

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

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

คำถามเพิ่ม

1. หลังใส่ halation แกนกระจกหน้าหุ่นจาก 1.82 กลายเป็น 2.04 แปลว่าอะไร

2. ทำไมใช้ขนาดฟุ้งช่องแดงใหญ่กว่าเขียวและน้ำเงิน

ตัวเลขมาจากไหน: วิธีบวกเฉพาะส่วนที่ฟุ้ง (ลบต้นฉบับ แล้ว clamp ขั้นต่ำ 0) และการ roto ไฟแดงออก มาจาก KB 159 และ 153 (กราฟ node อ่านใน Nuke 17) สัดส่วนการกระจาย 1 : 0.45 : 0.2 และสี tint เป็นค่าสอนของเรา ไม่ใช่ค่าของ gizmo ใด Blur ใช้ box 3 รอบ (ใกล้ Gaussian) ที่ครึ่งความละเอียด key ใช้ luma Rec.709 ช่วง 1–2 ไฟแดงสร้างด้วยโค้ด