Raymarch shaders ทำงานอย่างไร


49

ฉันได้ดู shaders พบที่นี่ shadertoy.com และส่วนใหญ่ที่เย็นมีเสียงและ raymarch เหมือนกัน ฉันไม่เข้าใจซอร์สโค้ด แต่ฉันต้องการจริงๆ เฉดสีเหล่านี้ทำงานอย่างไรและอัลกอริทึม raymarch ทำงานอย่างไร ฉันค้นหาทั่วและไม่พบสิ่งใดในหัวข้อ

ขอบคุณ


6
Iñigo Quilez ได้เขียนแบบฝึกหัดที่ยอดเยี่ยมเกี่ยวกับเรื่องนั้น ดูiquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htmและiquilezles.org/www/articles/distfunctions/distfunctions.htm เฉดสีเย็นเหล่านี้ไม่ได้เป็นเพียงแค่ raymarching ใด ๆ แต่โดยเฉพาะอย่างยิ่ง raymarching ระยะทางที่เรียกว่าการติดตามทรงกลม
msell

คุณกำลังถามเกี่ยวกับการเดินเรย์โดยทั่วไปหรือการเดินเรย์บน GPU หรือไม่?
concept3d

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

ฉันใช้งาน Raymarching ใน Unity Engine github.com/smkplus/UnityRayMarching
Seyed Morteza Kamali

คำตอบ:


79

มันอาจจะง่ายที่สุดในการเข้าใจโดยเปรียบเทียบกับการฉายรังสี

ในการเรนเดอร์แบบดั้งเดิมด้วย raytracing คุณจำเป็นต้องมีฟังก์ชั่นที่บอกว่าเรย์แบบดั้งเดิมและเรย์อินพุตนั้นบอกคุณตรงจุดที่รังสีนั้นเข้าชมแบบดั้งเดิม จากนั้นคุณสามารถทดสอบรังสีกับแบบดั้งเดิมที่เกี่ยวข้องทั้งหมดและเลือกจุดตัดที่ใกล้ที่สุด ซีพียูดีในเรื่องนี้

ด้วย raymarching คุณไม่มีฟังก์ชั่นการตัดกันแบบง่าย เมื่อกำหนดจุดหนึ่งบนรังสีคุณสามารถประมาณว่าจุดนั้นอยู่ใกล้กับพื้นผิวมากแค่ไหน แต่คุณไม่รู้ว่าคุณต้องขยายรังสีนั้นให้ไกลออกไปถึงพื้นผิวอย่างไร

ดังนั้นคุณ "เดินขบวน" ทีละขั้นตอน:

  1. เริ่มต้นที่ "เริ่มต้น" ของรังสี - ระนาบใกล้สำหรับการเรนเดอร์ฉากหรือจุดตัดที่มีระดับเสียง จำกัด หากมันเป็นเพียงวัตถุเดียวในฉาก (P0 ในแผนภาพด้านล่าง)

  2. ประเมินฟังก์ชันระยะทางของคุณเพื่อรับค่าประมาณว่าคุณอยู่ใกล้พื้นผิวมากแค่ไหน (วงกลมที่ใหญ่ที่สุดในแผนภาพ)

  3. เลื่อนไปข้างหน้าตามแนวรังสีของคุณ การย้ายควรสั้นอย่างระมัดระวังดังนั้นคุณมั่นใจว่าคุณจะไม่เจาะผ่านพื้นผิวทุกที่

  4. ตอนนี้คุณมีจุดใหม่ (P1 ด้านล่าง) - รับประมาณการใหม่และทำซ้ำ

  5. รับการประมาณการต่อไปและก้าวไปข้างหน้าจนกว่าคุณจะได้รับภายในระยะทางขีด จำกัด ของพื้นผิวหรือตีจำนวนขั้นสูงสุดของคุณ (P4 ด้านล่าง)

  6. ตอนนี้คุณมีความลึกของพื้นผิวและสามารถอนุมานสิ่งต่าง ๆ เช่นภาวะปกติ / การบดเคี้ยวแวดล้อมจากตัวอย่างบริเวณใกล้เคียงและใช้ข้อมูลนี้เพื่อให้แสงและสีของพิกเซล

การเดินเรย์จาก P0 ไปยังสี่แยก

ตัวอย่างไดอะแกรมของ GPU Gems 2 ตอนที่ 8

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

ขั้นตอนที่แน่นอนขึ้นอยู่กับลักษณะพิเศษที่คุณพยายามจะทำให้สำเร็จ ใช้เทคนิค Raymarching กับ ...

  • Heightfields เพื่อจำลองการกระจัดบนพื้นผิวในเรขาคณิตเชิงภาพแรสเตอร์แบบดั้งเดิม
  • บัฟเฟอร์ความลึกของฉากสำหรับสิ่งต่าง ๆ เช่นภาพสะท้อนบนหน้าจอ
  • พื้นผิวปริมาณสำหรับการแสดงผลชุดข้อมูลตัวอย่าง 3D (มักวิทยาศาสตร์ / การแพทย์)
  • ฟังก์ชั่นโดยนัยสำหรับการแสดงผลสิ่งต่าง ๆ เช่นเศษส่วน
  • ฟิลด์ระยะทางตามขั้นตอนเช่นเดียวกับในงานของIñigo Quilez (ลิงก์ที่ยอดเยี่ยมจาก msell ในความคิดเห็นด้านบน)

Raymarching ยังถูกนำมาใช้กับการผสมในแต่ละขั้นตอน (มักจะใช้ขั้นตอนการแก้ไขแทนการประเมินระยะไกลในแต่ละครั้ง) สำหรับการแสดงผล translucency ปริมาตรเช่นเดียวกับในตัวอย่างนี้จากวิกิพีเดีย

Raymarching เนื้อสัมผัสที่โปร่งแสง

นี้ได้กลายเป็นวิธีที่นิยมที่จะทำให้เมฆรายละเอียดในเรียลไทม์

แม้แต่การทำแผนที่ภายในวิธีการจำลองรายละเอียดห้องตกแต่งภายในด้านหลังหน้าต่างอาคารก็อาจถือได้ว่าเป็นรูปแบบของ raymarching โดยที่รังสีถูกเหยียบจากจุดที่มันเข้าสู่หน้าต่างไปยังผนังชั้น / เพดานหรือระนาบเฟอร์นิเจอร์ที่ใกล้เคียงที่สุด

หากมีลักษณะพิเศษของ raymarching เฉพาะที่คุณสนใจคุณอาจได้รับคำตอบที่ละเอียดกว่านี้โดยถามคำถามใหม่พร้อมตัวอย่างเฉพาะ ในฐานะครอบครัวเทคนิคนี้มีความหลากหลายเกินกว่าที่จะครอบคลุมทุกสิ่งทุกอย่างด้วยคำตอบสั้น ๆ ;) ฉันหวังว่าสิ่งนี้จะช่วยให้คุณมีกรอบสำหรับการทำความเข้าใจกับสิ่งที่เกิดขึ้นภายใต้ประทุนในเฉดสีเหล่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.