Anti-aliasing / Filtering ในการติดตามเรย์


20

ในการติดตามรังสี / การติดตามเส้นทางหนึ่งในวิธีที่ง่ายที่สุดในการต่อต้านนามแฝงของภาพคือการแทนที่ค่าพิกเซลและเฉลี่ยผลลัพธ์ IE แทนที่จะถ่ายภาพตัวอย่างทุกชิ้นผ่านจุดศูนย์กลางของพิกเซลคุณชดเชยตัวอย่างด้วยจำนวนเงินหนึ่ง

ในการค้นหาทั่วอินเทอร์เน็ตฉันได้พบสองวิธีที่แตกต่างกันในการทำสิ่งนี้:

  1. สร้างตัวอย่างอย่างไรก็ตามคุณต้องการและชั่งน้ำหนักผลลัพธ์ด้วยตัวกรอง
    • ตัวอย่างหนึ่งคือPBRT
  2. สร้างตัวอย่างที่มีการแจกแจงเท่ากับรูปร่างของตัวกรอง


สร้างและชั่งน้ำหนัก

กระบวนการพื้นฐานคือ:

  1. สร้างตัวอย่างอย่างไรก็ตามคุณต้องการ (ลำดับแบบสุ่มแบ่งชั้นความคลาดเคลื่อนต่ำ ฯลฯ )
  2. ชดเชยเรย์ของกล้องโดยใช้สองตัวอย่าง (x และ y)
  3. แสดงภาพด้วยรังสี
  4. คำนวณน้ำหนักโดยใช้ฟังก์ชั่นตัวกรองและระยะห่างของตัวอย่างโดยอ้างอิงจากจุดศูนย์กลางพิกเซล ตัวอย่างเช่น Box Filter, Tent Filter, Gaussian Filter, ฯลฯ ) รูปร่างตัวกรอง
  5. ใช้น้ำหนักกับสีจากการเรนเดอร์


สร้างเป็นรูปร่างของตัวกรอง

หลักฐานพื้นฐานคือการใช้การสุ่มตัวอย่างการแปลงผกผันเพื่อสร้างตัวอย่างที่กระจายตามรูปร่างของตัวกรอง ตัวอย่างเช่นฮิสโตแกรมของตัวอย่างที่กระจายในรูปร่างของเกาส์เซียนจะเป็น:
ฮิสโทแกรมแบบเกาส์

สิ่งนี้สามารถทำได้อย่างแน่นอนหรือโดยการ binning ฟังก์ชั่นเป็น pdf / cdf แยก smallptใช้ cdf ผกผันที่แน่นอนของตัวกรองเต็นท์ ตัวอย่างของวิธีการ binning สามารถพบได้ที่นี่


คำถาม

ข้อดีและข้อเสียของแต่ละวิธีคืออะไร? แล้วทำไมคุณถึงใช้อันอื่น? ฉันนึกถึงบางสิ่ง:

การสร้างและการชั่งน้ำหนักดูเหมือนว่าจะแข็งแกร่งที่สุดช่วยให้สามารถใช้วิธีการสุ่มตัวอย่างร่วมกับตัวกรองใด ๆ ก็ได้ อย่างไรก็ตามคุณต้องติดตามน้ำหนักใน ImageBuffer แล้วทำการแก้ไขขั้นสุดท้าย

สร้างในรูปร่างของตัวกรองสามารถรองรับรูปร่างของตัวกรองที่เป็นบวกเท่านั้น (เช่น no Mitchell, Catmull Rom หรือ Lanczos) เนื่องจากคุณไม่สามารถมี pdf เชิงลบได้ แต่ดังที่กล่าวไว้ข้างต้นคุณสามารถนำไปใช้งานได้ง่ายขึ้นเนื่องจากคุณไม่จำเป็นต้องติดตามน้ำหนักใด ๆ

ถึงแม้ว่าในท้ายที่สุดฉันคิดว่าคุณสามารถนึกถึงวิธีที่ 2 เป็นการทำให้ง่ายขึ้นของวิธีที่ 1 เนื่องจากมันใช้น้ำหนักตัวกรอง Box แบบปริยาย


แค่คิดออกมาดัง ๆ ... คุณสามารถจำลองส่วนลบของตัวกรองแยกต่างหากเพื่อสร้างกลุ่มตัวอย่างสองชุดหนึ่งชุดจะถือว่าเป็นบวกและอีกชุดเป็นลบ สิ่งนี้จะอนุญาตตัวกรองตามอำเภอใจสำหรับแนวทางที่สองของคุณหรือไม่ (สร้างเป็นตัวกรอง)
trichoplax

อาจจะ? เล็มซอกับมันสำหรับบิต
RichieSams

1
ตกลงถ้าคุณติดตามค่าศูนย์ของฟังก์ชั่นคุณสามารถ abs () เอาท์พุทเป็น pdf จากนั้นเมื่อสุ่มตัวอย่างคุณสามารถตรวจสอบว่าคุณติดลบหรือไม่ โค้ดตัวอย่างที่นี่: gist.github.com/RichieSams/aa7e71a0fb4720c8cb41
RichieSams

คำตอบ:


9

มีกระดาษที่ดีจาก 2006 ในหัวข้อนี้คือการสุ่มตัวอย่างกรองความสำคัญ พวกเขาเสนอวิธีการของคุณ 2 ศึกษาคุณสมบัติและออกมาโดยทั่วไปในความโปรดปรานของมัน พวกเขาอ้างว่าวิธีนี้ให้ผลการเรนเดอร์ที่นุ่มนวลขึ้นเนื่องจากมันให้น้ำหนักตัวอย่างทั้งหมดที่มีส่วนร่วมในพิกเซลอย่างเท่าเทียมกันซึ่งจะช่วยลดความแปรปรวนในค่าพิกเซลสุดท้าย เรื่องนี้ทำให้รู้สึกบางอย่างเพราะมันเป็นความจริงทั่วไปในการแสดงผล Monte Carlo ที่การสุ่มตัวอย่างความสำคัญจะให้ความแตกต่างที่ต่ำกว่าตัวอย่างน้ำหนัก

วิธีที่ 2 ยังมีข้อได้เปรียบในการทำให้ขนานได้ง่ายขึ้นเล็กน้อยเนื่องจากการคำนวณของแต่ละพิกเซลมีความเป็นอิสระจากพิกเซลอื่น ๆ ทั้งหมดในขณะที่วิธีที่ 1 ผลลัพธ์ตัวอย่างจะถูกใช้ร่วมกันในพิกเซลที่อยู่ใกล้เคียง โปรเซสเซอร์หลายตัว) ด้วยเหตุผลเดียวกันการสุ่มตัวอย่างแบบปรับตัวได้ง่ายขึ้น (ตัวอย่างมากขึ้นในพื้นที่ที่มีความแปรปรวนสูงของภาพ) ด้วยวิธีที่ 2 มากกว่าวิธีที่ 1

ในกระดาษพวกเขายังทดลองกับตัวกรอง Mitchell, สุ่มตัวอย่างจาก abs () ของตัวกรองแล้วชั่งน้ำหนักแต่ละตัวอย่างด้วย +1 หรือ −1 ตามที่ @trichoplax แนะนำ แต่สิ่งนี้จบลงด้วยการเพิ่มความแปรปรวนและแย่กว่าวิธีที่ 1 ดังนั้นพวกเขาจึงสรุปได้ว่าวิธีที่ 2 นั้นสามารถใช้งานได้กับตัวกรองเชิงบวกเท่านั้น

ดังที่ได้กล่าวไปแล้วผลที่ได้จากบทความนี้อาจไม่สามารถใช้ได้ในระดับสากลและอาจขึ้นอยู่กับฉากซึ่งวิธีการสุ่มตัวอย่างนั้นดีกว่า ฉันเขียนบล็อกโพสต์เพื่อตรวจสอบคำถามนี้เป็นอิสระในปี 2014 โดยใช้ "ฟังก์ชั่นภาพ" สังเคราะห์มากกว่าการเรนเดอร์เต็มรูปแบบและพบวิธีที่ 1 เพื่อให้ได้ผลลัพธ์ที่น่าพึงพอใจมากขึ้นเนื่องจากการปรับขอบความคมชัดสูงให้ราบรื่นยิ่งขึ้น Benedikt Bitterli ยังแสดงความคิดเห็นในโพสต์ที่รายงานปัญหาที่คล้ายกันกับ renderer ของเขา (เสียงความถี่สูงเกินรอบแหล่งกำเนิดแสงเมื่อใช้วิธีที่ 2) นอกเหนือจากนั้นฉันพบความแตกต่างที่สำคัญระหว่างวิธีการคือความถี่ของสัญญาณรบกวนที่เกิดขึ้น: วิธีที่ 2 ให้ความถี่สูงกว่า, เสียง "ขนาดพิกเซล" ในขณะที่วิธีที่ 1 ให้เสียง "ธัญพืช" ที่มีขนาด 2-3 พิกเซล แต่ ความกว้างของเสียงมีความคล้ายคลึงกันทั้งคู่ดังนั้นเสียงชนิดใดที่ดูไม่ดีน่าจะเป็นเรื่องของความชอบส่วนตัว


ขอบคุณ! เหล่านี้เป็นแหล่งข้อมูลที่ดี ดังนั้นในที่สุดมี 3 วิธี? 1. สร้างและชั่งน้ำหนักด้วยการกระจาย 2. สร้างและชั่งน้ำหนักโดยไม่มีการ
รั่วไหล

คุณรู้จากเอกสารบล็อก ฯลฯ ที่สำรวจวิธีสร้างขนานและสร้างน้ำหนักด้วยการทำเครื่องหมาย? ด้านบนของหัวของฉันคุณสามารถมี mutex ต่อไทล์หรือสร้างแต่ละอะตอมของพิกเซล
RichieSams

2
@RichieSams ฉันไม่รู้ว่าทำไมคุณถึงใช้ "สร้างและชั่งน้ำหนักโดยไม่ทำเครื่องหมาย" จริง ๆ แล้ว - ดูเหมือนว่ามันจะแย่กว่าในกรณีใด ๆ มากกว่าการสุ่มตัวอย่างความสำคัญของตัวกรอง ฉันสันนิษฐานว่า "สร้างและชั่งน้ำหนัก" หมายถึงการทำเครื่องหมาย สำหรับการกระจายแบบขนานของภาพบนศีรษะของฉันวิธีหนึ่งก็คือการแบ่งภาพออกเป็นแบบเรียงต่อกัน แต่ให้แต่ละเส้นขอบภาพมีขนาด 2‒3 พิกเซลเพื่อจับรอยที่ข้ามขอบของแผ่นกระเบื้อง จากนั้นในการผ่านรอบสุดท้ายให้ประกอบแผ่นกระเบื้องที่ล้อมรอบเข้าด้วยกันเป็นภาพสุดท้าย
นาธานรีด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.