การเลือกการสะท้อนหรือการหักเหในการติดตามเส้นทาง


14

ฉันพยายามที่จะใช้การหักเหและการส่งสัญญาณในเส้นทางของฉันและฉันไม่แน่ใจเกี่ยวกับวิธีการใช้ ครั้งแรกพื้นหลังบางส่วน:

เมื่อแสงกระทบกับพื้นผิวส่วนหนึ่งของแสงจะสะท้อนกลับและส่วนหนึ่งจะหักเห: ป้อนคำอธิบายรูปภาพที่นี่

จำนวนเท่าใดแสงสะท้อนและการหักเหถูกกำหนดโดยFresnel Equations ป้อนคำอธิบายรูปภาพที่นี่

ในการติดตามเรย์แบบเรียกซ้ำการใช้งานง่าย ๆ คือการถ่ายภาพรังสีเพื่อการสะท้อนและรังสีสำหรับการหักเหของแสง

R=Fresnel()T=1RLo=RLi,reflection+TLi,refraction

อย่างไรก็ตามในการติดตามเส้นทางเราเลือกเส้นทางเดียวเท่านั้น นี่คือคำถามของฉัน:

  • ฉันจะเลือกว่าจะสะท้อนหรือหักเหในทางที่ไม่ลำเอียงได้อย่างไร

การเดาครั้งแรกของฉันคือการสุ่มเลือกตาม Fresnel aka:

float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
    // Reflect
} else {
    // Refract
}

สิ่งนี้จะถูกต้องหรือไม่ หรือฉันต้องมีปัจจัยการแก้ไขบางอย่าง? เนื่องจากฉันไม่ได้ใช้เส้นทางทั้งสอง


รูเล็ตรัสเซีย
v.oddou

คำตอบ:


6

TL; DR

ใช่คุณสามารถทำเช่นนั้นได้คุณต้องหารผลลัพธ์ด้วยความน่าจะเป็นในการเลือกทิศทาง

คำตอบแบบเต็ม

หัวข้อของการสุ่มตัวอย่างในตัวติดตามเส้นทางที่อนุญาตให้วัสดุที่มีทั้งการสะท้อนกลับและการหักเหนั้นซับซ้อนกว่าเล็กน้อย

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

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

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

ขั้นตอนการสุ่มตัวอย่าง BSDF สำหรับกรณีของพื้นผิว Fresnel ที่ราบรื่นนั้นคือการเลือกทิศทางใดทิศทางหนึ่งแบบสุ่มโดยมีความน่าจะเป็นเป็นสัดส่วนกับการสะท้อนของ Fresnel และในบางจุดแบ่งผลของทิศทางนั้นโดยความน่าจะเป็นของการเลือกทิศทาง เครื่องมือประมาณการจะมีลักษณะดังนี้:

Li(ωi)F(θi)P(ωi)=Li(ωi)F(θi)F(θi)=Li(ωi)

ωi=(ϕi,θi)Li(ωi)F(θi)P(ωi)F(θi)

ในกรณีของแบบจำลอง BSDF ที่มีความซับซ้อนมากขึ้นเช่นในแบบของทฤษฎีไมโครฟิล์มการสุ่มตัวอย่างมีความซับซ้อนมากขึ้นเล็กน้อย แต่ความคิดในการแยกอินทิกรัลทั้งชุดเป็นผลรวมย่อยของอินทิกรัลย่อยและการใช้มอนติคาร์โลโดยสิ้นเชิง


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

1
@trichoplax: ใช่ แต่ในวรรคนั้นฉันอธิบายเทคนิคการสุ่มตัวอย่างสำหรับ Fresnel BSDF (อิเล็กทริก) สำหรับพื้นผิวที่เรียบเนียนซึ่งเป็นผลรวมของฟังก์ชัน Dirac delta สองอัน ในกรณีเช่นนี้คุณกำลังเลือกทิศทางใดเส้นทางหนึ่งด้วยความน่าจะเป็นแบบแยก ในกรณีของ BSDF ที่ไม่ใช่เดลต้า (จำกัด ) คุณสร้างทิศทางตามฟังก์ชันความหนาแน่นของความน่าจะเป็น น่าเสียดายที่กรณีเดลต้าและไม่ใช่เดลตาต้องได้รับการจัดการแยกต่างหากซึ่งทำให้โค้ดยุ่งเหยิงเล็กน้อย รายละเอียดเพิ่มเติมเกี่ยวกับการสุ่มตัวอย่าง BSDF ของ microfacet สามารถพบได้ใน Walter และ อัล [2007] กระดาษ
ivokabel

2
@RichieSams: Walter และ อัล [2007] นั้นยังคงทันสมัยสำหรับพื้นผิวขรุขระอิเล็กทริก แต่เพื่อให้มันทำงานได้ดีคุณต้องมีการสุ่มตัวอย่างที่ดีซึ่งเพิ่งเผยแพร่โดย Heitz และ D'Eon ในปี 2014 กระดาษ "ความสำคัญของการสุ่มตัวอย่าง BSDFs อิง Microfacet ใช้การกระจายของบรรทัดฐานที่มองเห็นได้ " และโปรดทราบว่ามันเป็นรูปแบบการกระจัดกระจายเดียวซึ่งละเลยการสะท้อนกลับระหว่าง microfacets ทำให้มืดอย่างเห็นได้ชัดสำหรับค่าความหยาบที่สูงขึ้น ดูคำถามของฉัน "การชดเชยการสูญเสียพลังงานในรุ่น BSDF ของไมโครฟอร์แมตแบบกระจายเดียว" สำหรับรายละเอียดเพิ่มเติม
ivokabel

5
แค่อยากจะชี้ให้เห็นว่าถ้าคุณเลือกความน่าจะเป็น = fresnel () ตามคำถามที่แนะนำแล้วเมื่อคุณหารด้วยความน่าจะเป็นคุณจะยกเลิกปัจจัยเฟรสที่ปกติจะคูณด้วยดังนั้น (ในกรณีที่แยกกันสองกรณีไดirac ) คุณจบลงด้วยการมีส่วนร่วมเรย์ไม่รวมถึงปัจจัยเฟรสใด ๆ มันเป็นทฤษฎีการสุ่มตัวอย่างความสำคัญมาตรฐาน แต่ฉันคิดว่าฉันจะชี้ให้เห็นว่าเป็นปัญหาที่อาจทำให้สับสน
Nathan Reed

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