1 คะแนน โดย GN⁺ 2023-10-24 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ภายใต้แสงแวดล้อมที่สม่ำเสมอ วัตถุที่สะท้อน 100% ควรแยกไม่ออกจากฉากหลัง และใช้คุณสมบัตินี้เพื่อตรวจสอบความสอดคล้องทางฟิสิกส์ของเรนเดอเรอร์ได้อย่างรวดเร็ว
  • ไม่ว่าจะเป็นวัสดุด้าน กระจกเงา หรือวัสดุระหว่างสองแบบนั้น หากสะท้อนสมบูรณ์และได้รับแสงอย่างสม่ำเสมอ ก็ต้องมองเห็นเหมือนสภาพแวดล้อมจนดู ราวกับหายไป
  • หิมะใหม่สามารถมีอัลเบโดได้สูงถึง 90~98% และเมื่อเจอกับอากาศครึ้มหรือหมอก อาจเกิดภาวะ whiteout ที่ทำให้แยกท้องฟ้ากับหิมะไม่ออก
  • การทดสอบนี้ใช้ตรวจว่า BRDF มีการสูญเสียหรือสร้างพลังงานขึ้นมาใหม่หรือไม่ และใน สภาพแวดล้อมสีเทา พลังงานสะท้อนที่มากเกินไปจะยิ่งเห็นสว่างเด่นขึ้น ทำให้หาข้อผิดพลาดได้ง่าย
  • Lambertian BRDF สีขาวล้วนมีความเรียบง่ายและการอนุรักษ์พลังงานที่ชัดเจน จึงเหมาะเป็นการตรวจพื้นฐานเพื่อเผย บั๊กในการอินทิเกรต เช่น การแจกแจงการสุ่มตัวอย่าง น้ำหนัก PDF หรือการลืมตัวคูณอย่าง π หรือ 2

ทำไมวัตถุจึงควรหายไปภายใต้แสงที่สม่ำเสมอ

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

ตัวอย่างคล้ายกันในโลกจริง: whiteout

  • หิมะใหม่สามารถมีอัลเบโดสูงได้ถึง 90~98% จนเกือบใกล้เคียงสีขาวสมบูรณ์
  • เมื่อซ้อนทับกับอากาศครึ้มหรือหมอก อาจเกิดภาวะ whiteout ที่ทำให้แยกหิมะกับท้องฟ้าไม่ออก
  • ในสถานการณ์นี้ ทุกทิศทางจะดูเป็นสีขาวสม่ำเสมอ ทำให้แม้แต่ความลาดชันที่อยู่ตรงหน้าก็อาจแยกด้วยตาได้ยาก

การตรวจสอบการอนุรักษ์พลังงานของ BRDF

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

วิธีใช้ตรวจการอินทิเกรตในเรนเดอเรอร์

  • การทดสอบเตาหลอมสีขาวมีประสิทธิภาพไม่เพียงกับตัว BRDF เอง แต่ยังใช้ตรวจ ส่วนการอินทิเกรต ของเรนเดอเรอร์ได้ด้วย
  • Lambertian BRDF ที่มีอัลเบโด 100% มีการอนุรักษ์พลังงานสมบูรณ์และติดตั้งใช้งานง่าย จึงเหมาะสำหรับเปิดเผยบั๊กในเรนเดอเรอร์
  • จุดที่อาจเกิดปัญหามีได้หลายแห่ง
    • การแจกแจงการสุ่มตัวอย่าง
    • น้ำหนักของตัวอย่าง
    • การคำนวณ PDF
    • การลืมตัวคูณอย่าง π หรือ 2
  • ข้อผิดพลาดเหล่านี้อาจทำให้ภาพที่ได้ยังดูสมเหตุสมผลอยู่ จึงค้นหาได้ยาก

ตัวอย่างความล้มเหลวและการใช้ดีบัก

  • เมื่อเขียน path tracer หรือเวอร์ชันดัดแปลง สร้าง pre-convolved environment map หรือทดลองการแจกแจงการสุ่มตัวอย่างแบบอื่น การเริ่มจาก Lambertian BRDF สีขาวล้วนแล้วให้ผ่าน การทดสอบเตาหลอมสีขาว ก่อน เป็นวิธีที่มีประโยชน์
  • เมื่อผ่านขั้นตอนนี้แล้ว จึงค่อยเชื่อถือการติดตั้งใช้งานได้ในระดับหนึ่งและไปทดสอบตัว BRDF เองต่อ
  • หลังจากมีคอมเมนต์บน Hacker News ตัวอย่าง ShaderToy ได้เพิ่มแมโคร SIMULATE_INCORRECT_INTEGRATION เพื่อให้เห็นกรณีทดสอบที่ล้มเหลว
  • แมโครนี้จำลอง บั๊กการอินทิเกรตที่ไม่ถูกต้อง เช่น ลืมว่าการอินทิเกรตบนซีกทรงกลมมีค่าเท่ากับ 2π หรือไม่คำนึงถึงการแจกแจงการสุ่มตัวอย่าง
  • เมื่อเปิดใช้บั๊ก ทรงกลมจะสะท้อนพลังงานได้ไม่ถูกต้องตามปริมาณที่ควรเป็น จึงมองเห็นได้บนหน้าจอ

1 ความคิดเห็น

 
GN⁺ 2023-10-24
ความคิดเห็นจาก Hacker News
  • ช่วงหลังได้ทำ ตัวเรนเดอร์แบบอิงฟิสิกส์ (PBR) ตามบทเรียน PBR ของ learnopengl แต่ไม่ผ่าน white furnace test
    ต้องขอบคุณเรื่องนั้นที่ทำให้รู้ว่าตัวเองไม่ได้เข้าใจคณิตศาสตร์ที่นำมาใช้มากนัก และอย่างที่ผู้เขียนบอก การคูณ π หรือ 2 แบบสุ่ม ๆ ก็ไม่ได้ทำให้ผลตรงขึ้นมา

    • BRDF ส่วนใหญ่ที่เคยเห็นจนถึงตอนนี้จะมืดลงเมื่อความหยาบเพิ่มขึ้น เหมือนที่บทความกล่าวไว้
      มีโมเดลที่พิจารณาการสะท้อนกันเองระหว่างไมโครแฟเซ็ตเชิงทฤษฎีซึ่งประกอบเป็นการกระจายตัวของเวกเตอร์ปกติที่กลายเป็น BRDF และถึงจะดีกว่า แต่ก็ยังไม่แน่ใจว่าแม้แต่โมเดลเหล่านั้นจะผ่านการทดสอบนี้แบบตรง ๆ หรือไม่
      ในทางปฏิบัติ สิ่งที่ใช้กันแพร่หลายส่วนใหญ่มักสูญเสียพลังงาน และบางกรณีก็ใช้ ตารางค้นหา วางทับบน BRDF เพื่อชดเชยเรื่องนี้
  • แปลกใจที่บทความนี้ขึ้นมาอยู่ด้านบนของ HN จริง ๆ แล้วมี furnace test อยู่สองแบบ และอีกแบบคือการทดสอบที่ภายใต้เงื่อนไขการเปล่งแสง 0.5 และอัลบีโด 0.5 ผลลัพธ์ควรได้ 1.0 ยกเว้นความคลาดเคลื่อนระดับพิกเซลจากนอยส์

    • รู้เรื่องเรย์เทรซซิงแค่ขั้นต่ำจริง ๆ แต่ก็ยังอ่านตามบทความได้ เขียนได้ชัดเจนและน่าสนใจดี
  • นานมาแล้ว เคยมีความพยายามใน https://graphics.stanford.edu/~boulos/papers/brdftog.pdf ที่ยอมแลก การอนุรักษ์พลังงาน กับความสามารถในการสร้างข้อมูลซ้ำได้ แต่ต้องแลกด้วยการละทิ้ง reciprocity
    สุดท้ายก็ไม่มีใครใส่ใจกับการปรับข้อมูลวัสดุจาก BRDF โดยอัตโนมัติมากนัก และถึงจะมีคนสนใจ ก็ยังชอบ BSDF ที่สมมาตรและอนุรักษ์พลังงานได้เพียงพอมากกว่า
    งานวิจัยหลังจากนั้นส่วนใหญ่ก็ปรับปรุงไปในทิศทางนั้น โดยเฉพาะเมื่อทำลายสมมาตรแล้ว เทคนิคอย่าง bidirectional path tracing จะเริ่มมีพฤติกรรมค่อนข้างแปลก

  • สงสัยว่าทำไมชื่อการทดสอบถึงมีคำว่า furnace อยู่ด้วย เข้าใจแนวคิดโดยรวม แต่ชื่อฟังดูค่อนข้างตั้งขึ้นมาเอง เลยอยากรู้ว่ามีที่มาหรือไม่

    • ชื่อนี้มาจาก การทดลองรังสีวัตถุดำ แบบคลาสสิกที่ใช้อบ เตาเผา หรือเตาไฟ
      แนวคิดตรงนี้ก็คล้ายกัน คือวัตถุถูกขังอยู่ในโพรงที่มีสเปกตรัมการแผ่รังสีสม่ำเสมอ เพียงแต่ในกรณีนี้ไม่ใช่วัตถุดำ แต่เป็นสีขาว
    • เพราะภายในเตาไฟร้อน ๆ จะส่องแสงด้วย แสงสว่างสม่ำเสมอ เหมือนสิ่งที่จำลองในการทดสอบ
    • เป็นการทดสอบที่ดูสถานการณ์ซึ่งอยู่ในสภาพแวดล้อมที่มีแสงขาวส่องอย่างสม่ำเสมอ จึงใกล้เคียงกับ ชื่อช่วยจำ ที่ทำให้นึกถึงภาพเตาไฟที่ร้อนจัด
  • พอดีไม่กี่วันก่อน YouTube แนะนำวิดีโอเกี่ยวกับหัวข้อนี้ขึ้นมา เป็นเนื้อหาของ Blender 4.0 ที่มีกำหนดปล่อย
    จะมีฟังก์ชัน Multiscatter GGX ใหม่ใน BSDF โดยลงลึกกว่านี้มากและมีตัวอย่างให้ดูเยอะ
    https://www.youtube.com/watch?v=v6qXbV_Q7z4

  • ไม่รู้ว่า ShaderToy ที่ฝังไว้เดิมควรแสดงผลอย่างไร กดเล่นแล้วรอก็ยังไม่มีอะไรเกิดขึ้นเกิน 1 นาที
    ถ้ามีแค่ภาพหน้าจอของการทดสอบที่ล้มเหลวสักไม่กี่ภาพ บทความก็น่าจะดีขึ้นมาก

    • ตอนแรกเริ่มเป็นสีเทา เห็นเค้าโครงของทรงกลม จากนั้นพื้นหลังค่อย ๆ เฟดอิน มีทรงกลมสีแดง สีน้ำเงิน และสีขาวปรากฏรอบทรงกลมสีเทา/ขาวตรงกลาง แล้วฉากก็ค่อย ๆ จางกลับเป็นสีเทาอีกครั้ง
      หลังจากนั้นทรงกลมสีแดงและสีน้ำเงินกลับมาอีก และมีสิ่งที่เหมือนการสะท้อนให้เห็นบนทรงกลมตรงกลาง แต่ทรงกลมตรงกลาง “กลืน” ไปกับพื้นหลังจนแยกได้ยากว่าเป็นทรงกลม
    • น่าจะต้องใช้ WebGL ลองตรวจดูได้ไหมว่าเปิด WebGL ในเบราว์เซอร์อยู่หรือเปล่า?