การแรเงาทางกายภาพ - แสงรอบข้าง / โดยอ้อม


15

ฉันใช้เครื่องมือติดตามเส้นทางร่างกายหลังจากเรียน PBRT โดย M. Pharr และ G. Humphreys ตอนนี้ฉันกำลังพยายามใช้การเรนเดอร์แบบกราฟิกกับกราฟิกแบบเรียลไทม์โดยใช้ OpenGL ES (ในแอปพลิเคชัน iPhone)

ฉันต้องการเริ่มใช้ Oren-Nayar และ Cook-Torrance เป็นแบบกระจายและแบบพิเศษ BRDF แต่ฉันมีปัญหา: ฉันจะจำลองแสงทางอ้อมได้อย่างไร

ในเส้นทางติดตาม (เช่นเดียวกับที่มีอยู่ใน pbrt) แสงทางอ้อม / รอบจะได้รับ "อัตโนมัติ" จากอัลกอริทึมการติดตามเส้นทางตามที่เป็นไปตามเส้นทางของรังสีแสงโดยคำนึงถึงแสงทางตรงและทางอ้อม

ฉันจะสร้างแบบจำลองแสงทางอ้อมในการเรนเดอร์เชิงกายภาพที่เขียนใน OpenGL ES ได้อย่างไรโดยใช้กราฟิกคอมพิวเตอร์ตามเวลาจริง

คำตอบ:


39

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

แสงโดยรอบ

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

ส่วนขยายทั่วไปของแสงพื้นฐาน ได้แก่ :

  • ทำให้สีของสภาพแวดล้อมแตกต่างกันไปในทิศทางต่างๆเช่นการใช้ฮาร์โมนิกทรงกลม (SH)หรือcubemap ขนาดเล็กและค้นหาสีใน shader ตามเวกเตอร์ปกติของแต่ละจุดยอดหรือพิกเซล สิ่งนี้ทำให้เกิดความแตกต่างทางภาพระหว่างพื้นผิวของทิศทางที่แตกต่างกันแม้ว่าจะไม่มีแสงส่องตรงก็ตาม
  • สมัครสภาวะแวดล้อมต่างๆ (AO)เทคนิครวมทั้งก่อนการคำนวณยอด AO, AO แผนที่พื้นผิวสาขา AOและหน้าจอพื้นที่ AO (SSAO) สิ่งเหล่านี้ทำงานโดยพยายามตรวจหาพื้นที่เช่นหลุมและรอยแยกที่แสงทางอ้อมมีโอกาสน้อยที่จะกระเด็นเข้ามาและทำให้แสงรอบข้างมืดลง
  • เพิ่มcubemap ของสภาพแวดล้อมเพื่อจัดเตรียมการสะท้อนแสงโดยรอบ cubemap ที่มีความละเอียดเหมาะสม (128 ²หรือ 256 ²ต่อหน้า) สามารถโน้มน้าวใจอย่างมากสำหรับ specular บนพื้นผิวที่โค้งและเป็นประกาย

แสงทางอ้อมอบ

"ระดับ" ถัดไปดังนั้นจะพูดถึงเทคนิคที่เกี่ยวข้องกับการอบ (pre-computing ออฟไลน์) เป็นตัวแทนของแสงทางอ้อมในฉาก ข้อดีของการอบคือคุณสามารถได้ผลลัพธ์ที่มีคุณภาพสูงสำหรับค่าใช้จ่ายในการคำนวณแบบเรียลไทม์เล็กน้อยเนื่องจากชิ้นส่วนที่แข็งทั้งหมดจะถูกนำไปอบ ข้อเสียคือเวลาที่ใช้สำหรับกระบวนการอบเป็นอันตรายต่ออัตราการวนซ้ำของนักออกแบบระดับ; จำเป็นต้องใช้หน่วยความจำและพื้นที่ดิสก์เพิ่มเติมเพื่อจัดเก็บข้อมูลที่คำนวณไว้ล่วงหน้า ความสามารถในการเปลี่ยนแสงในแบบเรียลไทม์นั้นมี จำกัด มาก และกระบวนการอบสามารถใช้ข้อมูลจากรูปทรงเรขาคณิตระดับคงที่เท่านั้นดังนั้นเอฟเฟกต์แสงทางอ้อมจากวัตถุไดนามิกเช่นตัวละครจะถูกพลาด ยังคงแสงไฟอบใช้กันอย่างแพร่หลายในเกม AAA วันนี้

ขั้นตอนการอบสามารถใช้อัลกอริธึมการเรนเดอร์ที่ต้องการรวมถึงการติดตามเส้นทาง, ความเป็นคลื่นวิทยุ, หรือการใช้เอ็นจิ้นเกมเพื่อแสดง Cubemaps (หรือครึ่งวงกลม )

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

ความละเอียดเชิงพื้นที่ของ lightmaps ฯลฯ จะถูก จำกัด โดยหน่วยความจำและข้อ จำกัด ในทางปฏิบัติอื่น ๆ ดังนั้นคุณอาจเสริมแสงอบด้วยเทคนิค AO บางอย่างเพื่อเพิ่มรายละเอียดความถี่สูงที่แสงอบไม่สามารถให้และตอบสนองต่อวัตถุแบบไดนามิก (เช่นทำให้แสงทางอ้อมมืดลงภายใต้ตัวละครที่เคลื่อนไหวหรือยานพาหนะ)

นอกจากนี้ยังมีเทคนิคที่เรียกว่าการถ่ายโอนความสว่างแบบ precomputed (PRT)ซึ่งขยายการอบเพื่อจัดการกับสภาพแสงแบบไดนามิกมากขึ้น ใน PRT แทนการอบด้วยแสงทางอ้อมเองคุณอบฟังก์ชั่นการถ่ายโอนจากแหล่งกำเนิดแสงบางแห่ง - โดยปกติคือท้องฟ้า - ไปยังแสงทางอ้อมที่เกิดขึ้นในฉาก ฟังก์ชั่นการถ่ายโอนจะแสดงเป็นเมทริกซ์ที่เปลี่ยนจากค่าสัมประสิทธิ์แหล่งต้นทางไปยังค่า SH ปลายทางที่จุดตัวอย่างอบแต่ละจุด สิ่งนี้ทำให้สภาพแวดล้อมของแสงมีการเปลี่ยนแปลงและแสงทางอ้อมในที่เกิดเหตุจะตอบสนองได้อย่างน่าเชื่อถือ Far Cry 3 และ 4 ใช้เทคนิคนี้เพื่อให้รอบต่อเนื่องตลอดทั้งวันด้วยแสงทางอ้อมที่แตกต่างกันไปตามสีของท้องฟ้าในแต่ละช่วงเวลาของวัน

อีกจุดหนึ่งเกี่ยวกับการทำอาหาร: มันอาจมีประโยชน์ที่จะมีข้อมูลการอบแยกต่างหากสำหรับแสงทางอ้อมแบบกระจายและแบบพิเศษ Cubemaps ทำงานได้ดีกว่า SH สำหรับ specular (เนื่องจาก cubemaps สามารถมีรายละเอียดเชิงมุมได้มากขึ้น) แต่พวกมันยังใช้หน่วยความจำมากขึ้นด้วยดังนั้นคุณจึงไม่สามารถที่จะวางมันให้หนาแน่นเหมือนตัวอย่าง SH การแก้ไข Parallaxสามารถใช้ในการชดเชยค่อนข้างมากโดยการโค้งงอ cubemap แบบ heuristically เพื่อให้การสะท้อนของมันให้ความรู้สึกที่มีเหตุผลมากขึ้นกับเรขาคณิตรอบ ๆ

เทคนิคเรียลไทม์อย่างเต็มที่

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

  • cubemap สภาพแวดล้อมแบบไดนามิกที่ใบหน้าของ cubemap จะถูกเรนเดอร์อีกครั้งในแต่ละเฟรมโดยใช้กล้องหกตัวที่รวมอยู่รอบจุดที่เลือกสามารถให้การสะท้อนแสงโดยรอบที่เหมาะสมสำหรับวัตถุชิ้นเดียว ซึ่งมักใช้สำหรับผู้เล่นในเกมแข่งรถเป็นต้น
  • การส่องสว่างส่วนกลางของพื้นที่หน้าจอซึ่งเป็นส่วนเสริมของ SSAO ที่รวบรวมแสงสะท้อนจากพิกเซลใกล้เคียงบนหน้าจอในการผ่านการประมวลผล
  • การสะท้อนแสงแบบสเปซ - เรย์บนหน้าจอทำงานโดยการเดินผ่านเรย์บัฟเฟอร์ความลึกในโพสต์ - พาส มันสามารถให้การสะท้อนค่อนข้างคุณภาพสูงตราบใดที่วัตถุที่สะท้อนอยู่บนหน้าจอ
  • ใช้คลื่นวิทยุในทันทีโดยการติดตามรังสีเข้าฉากโดยใช้ซีพียูและวางจุดไฟที่แต่ละจุดของรังสีซึ่งประมาณจะแทนแสงที่สะท้อนออกไปในทุกทิศทางจากรังสีนั้น แสงจำนวนมากเหล่านี้รู้จักกันในชื่อ virtual point lights (VPLs) นั้นแสดงผลโดย GPU ตามปกติ
  • แม็พเงาสะท้อนแสง (RSMs)นั้นคล้ายกับวิทยุแบบทันที แต่ VPL นั้นถูกสร้างขึ้นโดยการเรนเดอร์ฉากจากมุมมองของแสง (เช่นแผนที่เงา) และวาง VPL ที่แต่ละพิกเซลของแผนที่นี้
  • ปริมาณการแพร่กระจายแสงประกอบด้วยกริด 3 มิติของโพรบ SH ที่วางทั่วฉาก RSM จะแสดงผลและใช้ในการ "ฉีด" แสงสะท้อนกลับเข้าไปในโพรบ SH ที่ใกล้ที่สุดกับพื้นผิวที่สะท้อน จากนั้นกระบวนการเติมน้ำท่วมจะแพร่กระจายแสงจากหัววัด SH แต่ละจุดไปยังจุดรอบ ๆ ในตารางและผลลัพธ์ของสิ่งนี้จะถูกใช้เพื่อปรับแสงให้เข้ากับฉาก เทคนิคนี้ได้ขยายไปถึงการกระเจิงแสงตามปริมาตรเช่นกัน
  • การติดตาม Voxel coneทำงานโดยการทำให้เรขาคณิตฉากเกิดขึ้น (น่าจะใช้ความละเอียดของ Voxel ที่หลากหลายปรับให้ดีขึ้นใกล้กับกล้องและ coarser ที่อยู่ไกล) จากนั้นฉีดแสงจาก RSMs ลงในตาราง voxel เมื่อเรนเดอร์ฉากหลัก shader พิกเซลจะทำการ "กรวยติดตาม" - ray-march พร้อมกับค่อย ๆ เพิ่มรัศมี - ผ่านตาราง voxel เพื่อรวบรวมแสงที่เข้ามาสำหรับการกระจายแสงหรือการแรเงาแบบ specular

เทคนิคเหล่านี้ส่วนใหญ่ไม่ได้ใช้กันอย่างแพร่หลายในเกมวันนี้เนื่องจากปัญหาการปรับขนาดถึงขนาดฉากจริงหรือข้อ จำกัด อื่น ๆ ข้อยกเว้นคือการสะท้อนพื้นที่หน้าจอซึ่งเป็นที่นิยมมาก (แม้ว่ามักจะใช้กับ cubemaps เป็นทางเลือกสำหรับภูมิภาคที่ส่วนพื้นที่หน้าจอล้มเหลว)

อย่างที่คุณเห็นการส่องสว่างทางอ้อมแบบเรียลไทม์เป็นหัวข้อใหญ่และแม้แต่คำตอบ (ค่อนข้างยาว!) ก็สามารถให้ภาพรวม 10,000 ฟุตและบริบทสำหรับการอ่านเพิ่มเติม วิธีใดที่ดีที่สุดสำหรับคุณจะขึ้นอยู่กับรายละเอียดของแอปพลิเคชันเฉพาะของคุณข้อ จำกัด ที่คุณต้องการยอมรับและเวลาที่คุณต้องใช้ในการลงเวลา


สวัสดี @ นาธานขอบคุณสำหรับคำตอบโดยละเอียดของคุณ ฉันรู้ว่านี่เป็นหัวข้อใหญ่มาก (และเป็นวิชาที่สำคัญในการศึกษา) ปัญหาที่ใหญ่ที่สุดคือเอกสารออนไลน์มีการแยกส่วนและยากที่จะหาผู้อนุมัติที่ดี โครงการของฉันคือgoo.gl/Fgo21xนี้: โปรแกรมดู BRDF (ได้รับแรงบันดาลใจจากโปรแกรมดู WDAS) เพื่อแสดงโมเดล BRDF เชิงประจักษ์และเชิงกายภาพที่พบมากที่สุดและสนับสนุนการคำนวณสีโดยใช้ข้อมูลสเปกตรัม - ค่า tristimulus นี่เป็นโครงการเพื่อการศึกษาเพื่อศึกษา OpenGL
Fabrizio Duroni

ฉันคิดว่าวิธีแรกที่ดีอาจใช้ส่วนขยายทั่วไปที่คุณกล่าวถึง: SH หรือ cubemap ขนาดเล็ก + แผนที่ cube สิ่งแวดล้อม (สำหรับการสะท้อนและการหักเห) คุณคิดยังไงกับเรื่องนี้? (ฉันกำลังพัฒนาแอพพลิเคชั่นนี้หลังเลิกงานในช่วงที่ฉันไม่หลับ :) ขอขอบคุณอีกครั้งสำหรับคอลเลกชันของแหล่งข้อมูลที่คุณเชื่อมโยงด้านบน (ฉันมีเนื้อหามากมายให้ศึกษาตอนนี้)
Fabrizio Duroni

@FabrizioDuroni ใช่แล้ว! สำหรับผู้ชม BRDF บรรยากาศรอบทิศทางที่เรียบง่ายบวกกับ cubemap ด้านสิ่งแวดล้อมน่าจะดีมาก
นาธานรีด

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

@racarate ขออภัยที่ใช้เวลาสักครู่ฉันจะตอบ แต่ใช่คุณพูดถูก! ฉันคิดว่าฉันหมายถึงพูดถึง แต่ลืม :) อย่างไรก็ตามฉันเพิ่มเข้าไป (ฉันพูดถึงการใช้ cubemap เพื่อกระจายในจุดแรก)
นาธานรีด

5

นี่เป็นปัญหา 'ยาก' หลักที่เหลืออยู่ใน CG แบบเรียลไทม์และมีงานวิจัยจำนวนมากที่ดำเนินการแก้ไข

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

วิธีรันไทม์ราคาถูกคือการใช้แผนที่แสงอบที่คุณเรียกใช้บางสิ่งที่ช้า แต่น่ากลัวเช่น radiosity หรือเส้นทางการติดตามออฟไลน์ก่อนจากนั้นบันทึกข้อมูลแสงพร้อมกับข้อมูลจุดสุดยอดปกติของคุณ สิ่งนี้ดีมากสำหรับรูปทรงเรขาคณิตคงที่ แต่จะเกิดปัญหาทันทีที่คุณเพิ่มวัตถุเคลื่อนที่ Michal Iwanicki นำเสนอที่ดีเกี่ยวกับวิธีที่พวกเขาแก้ไขปัญหานี้สำหรับ 'The Last of Us'

Spherical Harmonicsใช้ในเกมเอ็นจิ้นมากเพื่อแสดงแสงทางอ้อม โดยทั่วไปแล้วพวกมันคือการแปลงฟูริเยร์บนพื้นผิวของทรงกลมโดยการทิ้งส่วนประกอบความถี่สูงคุณสามารถสร้างความพึงพอใจให้แก่สายตาซึ่งเป็นสภาพแวดล้อมที่ถูกต้องแม่นยำที่สุดใน 9 สัมประสิทธิ์ต่อสี ยกตัวอย่างเช่นความเป็นเอกภาพใช้ SH ในการอบ 'โพรบแสง' ที่จุดต่าง ๆ ในฉากจากนั้นวัตถุที่เคลื่อนที่สามารถสอดแทรกโพรบระหว่างโพรบใกล้เคียงเพื่อรับแสงทางอ้อมที่ตำแหน่งของพวกมัน กระดาษของ Robin Green นั้นเป็นคัมภีร์ไบเบิลของเทคนิคนี้ แต่มันก็ค่อนข้างหนัก

เทคนิคที่น่าสนใจในขณะนี้ดูเหมือนว่าจะเป็น Voxel Cone Tracing ซึ่งไม่เกี่ยวข้องกับขั้นตอนการอบล่วงหน้า ฉันไม่คุ้นเคยกับมันด้วยตัวเอง แต่เมื่อฉันเข้าใจแล้วมันเกี่ยวข้องกับการทำให้ฉากของคุณกลายเป็นโลก Minecraft ที่มีความละเอียดต่ำการวาง voxels ไว้ในโครงสร้างเชิงพื้นที่ที่หมุนได้อย่างรวดเร็วเช่นรูปที่แปด รังสี (กรวย) จากแต่ละจุดและตรวจสอบว่า voxels ใดที่พวกเขาชนเพื่อรวบรวมแสงสะท้อน NVidia จะผลักดันนี้สวยยากในขณะนี้และมีเอกสารเกี่ยวกับมันที่นี่และที่นี่

หวังว่าจะช่วย :)


0

การติดตามเส้นทางเป็นอัลกอริทึมที่มีราคาแพงมากและไม่เหมาะกับเวลาจริง สถาปัตยกรรมของ PBRT ไม่เหมาะกับเรียลไทม์เช่นกันเป้าหมายหลักของ PBRT คือการแก้สมการเรนเดอร์โดยใช้การบูรณาการแบบมอนติคาร์โลที่ไม่ลำเอียง ดูhttps://en.wikipedia.org/wiki/Unbiased_renderingสำหรับข้อมูลเพิ่มเติม

หากไม่มีการเพิ่มประสิทธิภาพและข้อ จำกัด จำนวนมากฉันสงสัยว่าคุณจะสามารถทำงานได้อย่างมีประสิทธิภาพบนอุปกรณ์พกพา

ไม่ว่าในกรณีใดการติดตามเส้นทางสามารถนำไปใช้ใน OpenGL ได้ฉันขอแนะนำให้ดู คำนวณที่มีประสิทธิภาพมาก OpenGL ES 3.1 รองรับการคำนวณเฉดสีที่มีข้อ จำกัด เล็กน้อยในทางตรงกันข้ามกับ Desktop GL

อ่านหน้านี้เพื่อรับข้อมูลเพิ่มเติม: https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-(Part-I)

ขอให้โชคดี!

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