นี่เป็นวิธีที่ถูกต้องในการใช้กฎหมายเบียร์หรือไม่?


11

เมื่อฉันใช้กฎของเบียร์ (การดูดซับสีผ่านระยะทางผ่านวัตถุ) มันไม่เคยดูดีมากด้วยเหตุผลบางอย่าง

เมื่อฉันมีสีอยู่ด้านหลังวัตถุฉันจะคำนวณสีที่ปรับแล้วดังนี้

const vec3 c_absorb = vec3(0.2,1.8,1.8);
vec3 absorb = exp(-c_absorb * (distanceInObject));
behindColor *= absorb;

ที่จะให้สิ่งที่มีลักษณะเช่นนี้ (หมายเหตุหักเหเล็กน้อยนำไปใช้): ป้อนคำอธิบายรูปภาพที่นี่

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

หมายเหตุที่ว่านี้จะดำเนินการเป็นของเล่น Shader ที่นี่

นี่เป็นคำอธิบายถึงสิ่งที่กฎหมายเบียร์ทำ แต่ไม่ได้ดูดีมากเมื่อเทียบกับภาพเช่นนี้: ป้อนคำอธิบายรูปภาพที่นี่

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


2
คุณกำลังเปรียบเทียบลูกบาศก์กับตาข่ายที่ซับซ้อนมากขึ้น ทำไมไม่ทำซ้ำสถานการณ์เดียวกัน โมเดลซูซานนั้นง่ายต่อการรับ
บาร์ต

มันไม่ง่ายเลยในการใช้ shadertoy! (:
Alan Wolfe

2
ลูกบาศก์ของคุณดูถูกต้องสำหรับฉัน: รับความโปร่งใสมากขึ้นเมื่อมันเข้าใกล้ขอบ หากคุณสามารถทำซูซานน์ได้อย่างเต็มรูปแบบทรงกลมอย่างน้อยก็ควรให้การมองที่ดีขึ้นในรูปภาพอื่น ๆ
yuriks

1
ฉันไม่สามารถแยกการหักเหออกจากการลดทอน คุณสามารถสร้างลูกบาศก์ด้วย IOR = 1.0 ได้ไหม
imallett

1
@ AlanWolfe IOR ของคุณ = 1 เรนเดอร์ดูเหมือนว่าจะเป็นอย่างที่ฉันคาดไว้และฉันก็ขาดความหมาย shadertoy และมันก็ดูดี
imallett

คำตอบ:


12

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

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

การสะท้อนกลับหมด

ในแง่พื้นฐานความหมายคือถ้าแสงกระทบมุมตื้นแสงจะสะท้อนออกจากภายในห้องโดยสารอย่างสมบูรณ์ คุณจำเป็นต้องประเมินสมการเฟรสเนทุกครั้งที่แสงของคุณกระทบกับส่วนต่อประสานของแก้ว / อากาศ (AKA คือพื้นผิวด้านในของตาข่ายของคุณ) สมการเฟรสเนจะบอกสัดส่วนของแสงสะท้อนกับปริมาณของแสงหักเหในขณะที่ 1 ในกรณีของ TIR จากนั้นคุณสามารถคำนวณทิศทางแสงที่สะท้อนและหักเหแสงที่เหมาะสมและดำเนินการติดตามเส้นทางของแสงผ่านสื่อกลางหรือภายนอก หากคุณสมมติว่าตาข่ายนูนง่ายมีค่าสัมประสิทธิ์การกระเจิงสม่ำเสมอระยะทางที่ใช้สำหรับกฎหมายเบียร์จะเท่ากับผลรวมของความยาวเส้นทางภายในทั้งหมดก่อนที่จะออกจากสื่อ นี่คือลักษณะของลูกบาศก์ที่มีค่าสัมประสิทธิ์การกระเจิงและ IOR ของคุณเท่ากับ 1.526 (แก้วโซดาไลม์) แสดงผลโดยใช้ตัวติดตามเส้นทางของตัวเองที่อธิบายการสะท้อนและการหักเหทั้งภายในและภายนอก:

ก้อนแก้วที่ตรวจสอบเส้นทาง

ในที่สุดการสะท้อนแสงและการหักเหภายในเป็นส่วนสำคัญของสิ่งที่ทำให้แก้วดูเหมือนแก้ว การประมาณง่ายๆไม่ได้ตัดอย่างที่คุณรู้แล้ว มันยิ่งแย่ลงไปอีกถ้าคุณเพิ่มหลาย mesh และ / หรือ non-convex meshes เพราะคุณไม่เพียง แต่ต้องคำนึงถึงการสะท้อนกลับภายในเท่านั้น แต่ยังต้องคำนึงถึงการแผ่รังสีที่ออกจากตัวกลางและเข้าสู่จุดอื่น


1
Here is what a cube looks like (...) using my own path tracer. คุณบังเอิญได้เปิดแหล่งที่มาด้วยโอกาสใด ๆ ?
เช็ด

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