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

LA6 Overscan สำหรับ redistort

CG ต้อง render เผื่อขอบ ไม่งั้นมุมภาพว่าง

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

1 อธิบาย

เรา track และ render CG ในโลกที่ไม่มี distortion แล้วใส่ distortion ของเลนส์กลับเข้าไป (redistort) ก่อน merge ทับ plate เลนส์ barrel ดึงภาพจากนอกขอบเข้ามาในเฟรม มุมของผลลัพธ์จึงต้องการพิกเซลที่อยู่นอกกรอบ render ปกติ

render พอดีเฟรมแล้วมุมจะว่างดำ ทางแก้คือ render ใหญ่กว่าเฟรม (overscan) โดยขยายทั้ง resolution และ filmback ด้วยสัดส่วนเดียวกัน ภาพตรงกลางจึงไม่เปลี่ยน สลับไปดู footprint: เส้นส้มคือขอบที่ redistort ต้องอ่าน ช่วงสีแดงคือที่ยังไม่มีพิกเซล

overscan ≥ k · r²(corner) · r² = 1 + (h/w)², r normalised to the half width

2 ลงมือลอง

โจทย์: เลือก overscan ที่ไม่มีพิกเซลหาย และเกินค่าที่ต้องการไม่เกิน 4%

มุมภาพต้องการมากที่สุดเพราะอยู่ไกลกลางที่สุด render ใหญ่เกินก็เสียเวลา render เปล่า ๆ

SkyVFX Lab · LA6interactive · 1001

3 เจาะลึก

ลำดับที่ถูก: undistort เพื่อ track, redistort เฉพาะ CG

plate หลักไม่ต้องผ่าน undistort แล้ว redistort ทั้งก้อน เพราะการ resample สองรอบทำให้นุ่มลง ใช้ plate ที่ undistort เพื่อ track และงาน 3D เท่านั้น CG ถูก render แบบไม่มี distortion แล้วใส่ distortion ของเลนส์กลับ (redistort) เฉพาะตัว CG ก่อน merge ทับ plate เดิมที่ไม่ถูกแตะ

  1. 1Undistort plate (เพื่อ track)
  2. 2Track / solve
  3. 3Render CG + overscan
  4. 4Redistort CG
  5. 5Merge ทับ plate เดิม

ทำไม barrel ต้องการพิกเซลนอกเฟรม

เลนส์ barrel บีบขอบภาพเข้าหากลาง ภาพที่เห็นในเฟรมจริงจึงครอบคลุมพื้นที่กว้างกว่าเฟรมที่ไม่มี distortion ตอน redistort แต่ละพิกเซลของผลลัพธ์ไปอ่าน CG ที่ระยะ r × (1 + k·r²) จากกลาง ยิ่งไกลกลางยิ่งอ่านไกลออกไป มุมภาพอ่านไกลที่สุด

ในห้องแล็บ k = 0.06 มุมภาพอ่านที่ 1.079 เท่าของระยะ จึงต้องการ overscan 7.9% ถ้า plate เป็น HD ต้อง render ราว 2072 × 1166 ขึ้นไป (มากกว่า 1920 × 1080 ประมาณ 76 px ต่อข้าง) อีกวิธีที่ใช้บ่อย: undistort ของ plate barrel จะได้ภาพที่ใหญ่กว่าเฟรม ขนาดนั้นคือขนาดที่ควร render CG

pincushion ทำกลับกัน: redistort อ่านเข้ามาด้านใน ไม่ต้องเผื่อขอบมาก

render overscan ให้ถูก

overscan ต้องขยายทั้ง resolution และ filmback (aperture) ของกล้องด้วยสัดส่วนเดียวกัน focal เท่าเดิม พิกเซลตรงกลางจึงอยู่ที่เดิมพอดี แค่มีขอบเพิ่มรอบ ๆ ถ้าขยายแค่ resolution ภาพจะถูกซูม ถ้าขยายแค่ filmback ภาพจะกว้างขึ้นแต่พิกเซลหยาบลง

ระวัง node ที่ตัด bbox: Crop หรือ Reformat ก่อน redistort จะทิ้ง overscan ที่เพิ่ง render มา และ CameraShake ก็ต้องการพิกเซลนอกเฟรมเหมือนกัน

4 ในงานจริง

ทำใน Nuke

  1. LensDistortion (NukeX) solve จาก grid เก็บ node ต้นฉบับไว้ใน backdrop แล้ว copy ไปใช้ ตั้งเป็น redistort บนสาย CG
  2. หรือใช้ STMap ที่ export จาก solve: STMap ของ redistort ต่อหลัง CG
  3. ScanlineRender: เพิ่ม overscan ให้พอสำหรับ redistort ไม่งั้นขอบจะมีเส้นดำ
  4. Crop เพื่อ bbox วางหลัง redistort แล้ว Merge ทับ plate เดิมด้วย bbox = B

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

  • ✗ render CG พอดีเฟรมแล้ว redistort✓ render overscan ตามที่มุมภาพต้องการ (หรือตามขนาด plate ที่ undistort)
  • ✗ undistort plate หลัก comp แล้ว redistort ทั้งก้อน✓ plate หลักไม่แตะ redistort เฉพาะ CG
  • ✗ ขยาย resolution แต่ไม่ขยาย filmback✓ ขยายทั้งสองด้วยสัดส่วนเดียวกัน focal เท่าเดิม
  • ✗ Crop bbox ก่อน redistort✓ crop หลัง redistort

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

  • มุมภาพหลัง redistort ไม่มีขอบดำหรือพิกเซลยืด
  • ภาพกลางเฟรมของ CG ที่ render overscan ตรงกับแบบไม่มี overscan
  • plate หลักไม่ผ่าน undistort/redistort
  • ไม่มี Crop หรือ Reformat ตัด overscan ก่อน redistort

5 เช็กตัวเอง

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

ทำไม Crop CG ให้พอดีเฟรมก่อน redistort แล้วมุมภาพพัง

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

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

คำถามเพิ่ม

1. เลนส์ barrel ที่มุมภาพอ่านที่ 1.12 เท่าของระยะ ภาพ render ต้องกว้างและสูงขึ้นรวมอย่างน้อยกี่ %

2. จะ render overscan 10% ในกล้อง CG ต้องทำอะไร

ตัวเลขมาจากไหน: กฎ render overscan เผื่อ redistort และห้าม crop overscan ทิ้งก่อน มาจาก KB 152 โมเดล distortion ในห้องนี้เป็น radial เทอมเดียว (k = 0.06) จุดกลางอยู่กลางเฟรมพอดี ซึ่งง่ายกว่าโมเดลใน LensDistortion หรือ STMap จริง ค่าที่ต้องใช้จริงมาจากเลนส์และ solve ของช็อตนั้น ตัวเลข HD เป็นตัวอย่างการคำนวณ ฉาก CG สร้างด้วยโค้ด