จัดการ Projective Aliasing ในการแมป Shadow


15

ฉันเล่นซอกับการสร้างแบบจำลอง 3 มิติขั้นตอนง่าย ๆ เพื่อสร้างอาคารเล็ก ๆ สำหรับการพิมพ์ 3 มิติ ตัวอย่าง:

อาคาร


เพื่อให้แบบจำลองบนหน้าจอที่อ่านง่ายขึ้นฉันได้ใช้การทำแผนที่เงาพื้นฐานสำหรับแสงทิศทางเดียว เนื่องจากฉากของฉันไม่เปลี่ยนไปฉันเพิ่งเรนเดอร์แผนที่เงาเมื่อใช้กล่องจัดแนวแกนของฉากเพื่อหาว่าขอบเขตของแผนที่เงาควรเป็นเท่าไหร่ เงาและขอบเขตดูเหมือนว่าฉันมีเมทริกซ์ทั้งหมดถูกต้อง แต่การเข้ามาใกล้ขึ้นเล็กน้อยดูแย่มาก:

โคลสอัพของหอคอย

จากการอ่านที่ฉันทำฉันเข้าใจแพนเตอร์ปีเตอร์และสิ่งที่ฉันอาจทำเกี่ยวกับมัน แต่ขอบมอมแมมซึ่งฉันเชื่อว่าเป็นรูปแบบของนามแฝง projective ดูไม่ดีว่าฉันคิดว่ามีบางอย่างผิดปกติในการใช้งานพื้นฐานของฉัน

ฉันแฮ็กพิกเซลแชร์เดอร์เพื่อแสดงขอบเขตเงาของเท็กเซล:

แสดงขอบเขตของ Texel

ฉันได้รับการกรองแบบ bilinear ในพื้นผิว (โดยไม่ได้ฉันได้รับสิวที่ร้ายแรง) น่าเศร้าที่ความพยายามของฉันที่ PCF ล้มเหลวเช่นกัน - ดูเหมือนว่าจะมอมแมม:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือตัวอย่างกรณีเดียวที่ปิดใช้งานการกรอง bilinear:

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งนี้มีลักษณะคล้ายนามแฝง projective "ทั่วไป" หรือไม่? สามารถเรนเดอร์แผนที่เงาแบบไดนามิกโดยใช้มุมมอง frustum ที่ตัดกับฉากหรืออาจจะเป็นแบบเรียงซ้อนแก้ปัญหาได้หรือไม่

แก้ไข: การเพิ่มโคลสอัพของการกรอง bilinear, การเปรียบเทียบเงาของโพสต์, เพื่อแสดงสิ่งที่ฉันได้รับ สิวเงาไม่ดีปรากฏขึ้นเนื่องจากขอบภายใน ฉันกำลังสร้างโมเดลด้วยบล็อกเสมือนแบบเรียงซ้อนและไม่ดำเนินการรวมกันอย่างเหมาะสม จากการอ่านของฉันการใช้การดำเนินการบูลีนบนโพลีเฮดนั้นไม่สำคัญ แต่จะช่วยให้ฉันสามารถใช้วอลลุ่มเงาคงที่รวมถึงทำความสะอาดสำหรับซอฟต์แวร์การพิมพ์ 3 มิติ

การกรอง Bilinear

คำตอบ:


10

การทำแผนที่เงาด้วยคุณภาพที่ยอมรับได้เป็นการเดินทาง ดังนั้นคุณจึงนำขั้นตอนแรกไปใช้ - แผนที่เงาพื้นฐานที่ล้อมรอบทั้งฉากแบบคงที่ ซึ่งหมายความว่าขนาดของแผนที่เงาของเท็กเซลในพื้นที่แสงน้อยต่อขนาดของภาพที่แสดงในอัตราส่วนพื้นที่ดูภาพของกล้องนั้นค่อนข้างใหญ่ทำให้เกิดนามแฝง หากต้องการลดอัตราส่วนนี้ให้ใกล้เคียงกับ 1: 1 มีเทคนิคที่คุณกล่าวถึงเช่น:

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

เทคนิคพื้นฐานบางอย่างในการปรับขอบเงาให้เรียบ:

  • เห็นได้ชัดว่า PCF แต่แนะนำให้รวมการใช้ PCF ของคุณเข้ากับฮาร์ดแวร์ PCF ในตัว (ใน OpenGL โดยใช้sampler2DShadow) ซึ่งจะส่งผลให้การวนซ้ำน้อยลงจากด้านข้างของคุณและ PCF ที่ถูกกว่า
  • การปิดกั้นขอบสามารถแลกเปลี่ยนกับเสียงรบกวนได้โดยใช้ดิสก์ปัวซองแบบหมุน ตัวอย่างที่ใช้ในการสุ่มตัวอย่างจากแผนที่เงาจะถูกสุ่มหมุนด้วยการวนซ้ำของ PCF loop

นอกจากนี้คุณยังสามารถศึกษาเทคนิคการทำให้ขอบเรียบได้เช่น:

  • เรนเดอร์แผนที่เงาให้กับ MSAA ใช้ framebuffer
  • การเสริมสร้าง PCF โดยการแก้ไข ,
  • เพิ่มจำนวนตัวอย่างด้วยการผสมผสานทางโลก

เทคนิคพื้นฐานของ PCF ได้รับผลกระทบจากเงาสิวซึ่งสามารถแก้ไขได้โดยการใช้ออฟเซ็ตในการทดสอบเงา การคำนวณขนาดของชดเชยนี้ยังเป็นพื้นที่ของการวิจัย

วิธีแผนที่เงาขั้นสูงอื่น ๆ ได้แก่ :

  • แผนที่เงาแบบเอกซ์โปเนนเชียลและความแปรปรวนของเงาแผนที่ - ในกรณีส่วนใหญ่จะไม่ประสบกับสิวที่เป็นเงาและให้ขอบที่ราบรื่นโดยไม่มีการปิดกั้น แต่ในบางสถานการณ์การรั่วไหลของแสง
  • Exponential Variance Shadow Maps - อาจเป็นเทคนิคขั้นสูงที่สุดของการทำแผนที่เงาแผนที่ความลึก 2D รวมความราบรื่นที่ยอดเยี่ยมของ VSM และแก้ไขการรั่วไหลของแสงในค่าใช้จ่ายในการใช้หน่วยความจำเป็นสองเท่า
  • Percentage Closer Soft Shadows - เทคนิคพื้นฐานของการเพิ่มแผนที่เงาแบบดั้งเดิมด้วยขนาดเงามัวที่แตกต่างกัน
  • Multiview Shadow Maps - แผนที่เงาหลายอันของเทคนิคบางอย่างซึ่งถูกจัดวางบนพื้นที่แสงสำหรับการคำนวณเงานุ่มที่เหมือนจริงด้วยขนาดเงามัวที่แตกต่างกัน
  • แผนที่ Deep Shadow - สำหรับการเพิ่มการกระเจิงของปริมาตรด้วยเงา
  • เรย์ตามเวลาจริงเงา - อาจเป็นในอนาคต

คุณไม่ได้ล้มเหลวด้วย PCF ดูเหมือนว่า :)

ฉันหวังว่าจะมีวิธีการใช้ gaussian blur บนแผนที่เงาในพื้นที่ดูกล้อง แต่มันไม่ทำงานอย่างที่คาดไว้


ส่วนหนึ่งของความคิดเห็นนี้ขอบคุณสำหรับคำตอบของคุณดังนั้นฉันคิดว่าฉันจะแจ้งให้คุณทราบเนื่องจากคุณจะไม่ได้รับการแจ้งเตือนจากที่นั่น
trichoplax

ใช่ฉันเห็น แต่ขอบคุณ
narthex

1

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

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


ขอบคุณมากสำหรับคำตอบ! เพื่อให้ได้ผลลัพธ์ที่ฉันต้องการอาจเปลี่ยนเป็นไดรฟ์ข้อมูลแบบเงา ลิงค์ codeflow ที่ให้ไว้ภายใต้ "การแก้ไข" นั้นมีประโยชน์มาก - ขอบคุณ!
Daniel M Gessel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.