วิธีการรวมคำศัพท์การกระจายและ specular อย่างถูกต้อง?


18

เท่าที่ฉันเข้าใจใน BRDF คำว่า Fresnel กำลังบอกเราถึงความน่าจะเป็นที่โฟตอนจะสะท้อนหรือหักเหเมื่อมันกระทบกับพื้นผิว

โฟตอนที่สะท้อนออกมาจะมีผลกับเทอม specular ในขณะที่โฟตอนที่หักเหจะมีส่วนทำให้เกิดระยะกระจาย ดังนั้นเมื่อพิจารณาตามลักษณะทางกายภาพการมีส่วนร่วมของแสงกับสีของวัสดุฉันรู้สึกอยากจะเขียนเพียงแค่:

// Assuming for example:
//   diffuse = dot(L, N);
//   specular = pow(dot(H, N), alpha) * (alpha + 2.0) / 8.0;
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
color = lightIntensity * Lerp(diffuse * albedo, specular, fresnel);

แต่ฉันไม่คิดว่าฉันเคยเห็นมันเขียนแบบนี้ ฉันได้เห็นศัพท์เฉพาะที่ถูกถ่วงน้ำหนักตามศัพท์ Fresnel แต่ไม่ใช่คำที่กระจาย ในบทความอ้างอิงส่วนใหญ่ของเขาเกี่ยวกับ PBR Sébastien Lagarde ยังระบุด้วยว่าการใช้กับน้ำหนักคำว่าการแพร่กระจายนั้นไม่ถูกต้อง(1-F)

ฉันพลาดอะไรไป
ฉันยินดีรับการอธิบายที่เน้นในลักษณะที่ชัดเจนว่าทำไมสิ่งนี้ถึงไม่ถูกต้อง

คำตอบ:


14

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

อย่างไรก็ตามนั่นไม่ใช่สิ่งที่คุณกำลังทำกับ BRDF แบบกระจาย BRDF แบบกระจายมีวัตถุประสงค์เพื่อแสดงค่าเฉลี่ยของเส้นทางการแพร่ที่เป็นไปได้ทั้งหมด ในกรณีของ Lambertian ที่ค่าเฉลี่ยถูกจำลองเป็นค่าสะท้อนที่เหมือนกันและค่าอัลเบโด้เดียวที่วัดการสูญเสียพลังงานภายในระหว่างการแพร่กระจาย แต่แบบจำลองที่ซับซ้อนกว่านั้นเป็นไปได้ Crucially: BRDF แบบกระจายจะรวมเอฟเฟกต์รวมของบางเส้นทางที่สะท้อนกลับเข้าไปในสื่อเพื่อกระจายต่อไปและบางส่วนจะผ่านไปทันที "baked in" ไปยังBRDF¹แล้วและคุณไม่จำเป็นต้องแยกมันอีก1-Fโอยูเสื้อ

คำศัพท์ของ Lambertian ไม่รวมอยู่ด้วยคือส่วนของพลังงานที่หายไปจากการสะท้อนก่อนที่แสงจะเข้าสู่ตัวกลางการแพร่กระจาย สิ่งนี้ขึ้นอยู่กับมุมมอง แต่ขึ้นอยู่กับกลีบผิวด้านบนที่แม่นยำ ไม่มีการสูญเสียพลังงานที่ส่วนต่อประสานพื้นผิว (ที่ไม่ใช่โลหะ) ดังนั้นทุกอย่างที่ไม่ได้สะท้อนจะหักเหซึ่งหมายความว่าสิ่งที่คุณต้องการคือการรวมการสูญเสียพลังงานทั้งหมดที่พื้นผิวในทุกทิศทางเช่นออก1-glossy_bsdf(ใน,ออก)dออก

เป็นไปได้ที่จะคำนวณการประมาณล่วงหน้าเพื่ออินทิกรัลนั้นสำหรับ BRDF ที่เฉพาะเจาะจง ผลลัพธ์ที่ได้จะขึ้นอยู่กับทิศทางของมุมมองความหยาบของวัสดุและ IOR เป็นอย่างน้อย ในการประมาณแรกคุณสามารถสันนิษฐานได้ว่ากลีบพูเป็นตัวสะท้อนแสงแบบสมบูรณ์แบบ ที่ให้น้ำหนักซึ่งเป็นสิ่งที่คุณแนะนำครั้งแรก1-มันเงาdออก=1-Fผมn

นอกจากนี้โปรดทราบว่า Lambertian BRDF เป็นอัลเบโดหารด้วยและคำว่าโคไซน์เป็นตัวชี้วัดว่าแสงที่ได้มานั้นลดทอนลงบนพื้นผิวอย่างไร มันใช้ได้กับทั้งการสะท้อนแบบเงาและแบบกระจายπ

ดังนั้นประมาณ:

// Assuming for example:
//   diffuse = albedo / PI;
//   specular = my_favorite_glossy_brdf(in_dir, out_dir, roughness);
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
//   total_surface_reflection = fresnel
color = lightIntensity * dot(L, N) * Lerp(diffuse, specular, total_surface_reflection);

F


8

ในขณะที่เรียกดูเพื่อเขียนคำถามของฉันอย่างถูกต้องฉันพบคำตอบจริงซึ่งเกิดขึ้นง่ายมาก

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

(1-Fผมn)* * * *(1-Fโอยูเสื้อ)

1
กระดาษดิสนีย์ BRDFส่วน 5.3 หมายถึงสมการในคำตอบของคุณและจากนั้นก็จะระบุรูปแบบที่แตกต่างกัน ฉันไม่ได้อ้างว่าเข้าใจสิ่งใดเลยเพราะฉันเพิ่งเริ่มใช้ BRDF มันวาว!
PeteUK

ฉันคิดว่าสิ่งนี้จะดำเนินต่อจากที่นี่ซึ่งแสงที่สะท้อนกลับมาจากภายในจะกระทบพื้นผิวอีกครั้งจากด้านในฝั่งตรงข้ามจากนั้นอีกครั้งและอีกครั้งและอีกครั้งในแต่ละครั้งลดลงสู่อนันต์: P (หรือย่อย hehe กระจายพื้นผิว)
อลันวูล์ฟ

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