ฉันได้ยินเกี่ยวกับการเรนเดอร์ที่เลื่อนออกไปและวิธีการใช้งานที่สามารถอนุญาตสำหรับ "ล็อต" ของแสงในฉากที่ไม่มีการแสดงยอดเยี่ยม แต่มันคืออะไรและ (จากระดับสูง) มันนำไปใช้อย่างไร?
ฉันได้ยินเกี่ยวกับการเรนเดอร์ที่เลื่อนออกไปและวิธีการใช้งานที่สามารถอนุญาตสำหรับ "ล็อต" ของแสงในฉากที่ไม่มีการแสดงยอดเยี่ยม แต่มันคืออะไรและ (จากระดับสูง) มันนำไปใช้อย่างไร?
คำตอบ:
ลักษณะการกำหนดของการเรนเดอร์รอคอยคือการเปลี่ยนความซับซ้อนของการเรนเดอร์ฉากจาก O (ไฟเรขาคณิต *) เป็น O (เรขาคณิต + ไฟ)
สิ่งนี้สามารถทำได้โดยการเรนเดอร์ฉากโดยใช้เฉดสีที่ออกแบบมาเพื่อส่งออกคุณสมบัติพื้นฐานเช่นตำแหน่ง (อย่างน้อยที่สุด) *, ปกติและสีกระจาย คุณสมบัติอื่น ๆ อาจรวมถึงค่า specular ต่อพิกเซลและคุณสมบัติของวัสดุอื่น ๆ สิ่งเหล่านี้จะถูกเก็บไว้ในเป้าหมายการแสดงผลเต็มหน้าจอซึ่งเรียกรวมกันว่า G-buffer
(*: เป็นเรื่องน่าสังเกตว่านักพัฒนามักเลือกที่จะเก็บความลึกและใช้เพื่อสร้างตำแหน่งใหม่เนื่องจากการมีความลึกที่มีอยู่นั้นมีประโยชน์สำหรับเอฟเฟกต์อื่น ๆ มากมาย )
เมื่อ G-buffer ถูกสร้างขึ้นแล้วมันเป็นไปได้ที่จะคำนวณผลลัพธ์ที่มีแสงสว่างเพียงพอสำหรับพิกเซลใด ๆ บนหน้าจอโดยการแก้ไข BRDF หนึ่งครั้งต่อพิกเซลต่อแสง กล่าวอีกนัยหนึ่งถ้าคุณมี 20 ตาข่ายที่แต่ละคนได้รับผลกระทบจาก 20 ไฟการแสดงผลแบบดั้งเดิม ("ไปข้างหน้า") จะต้องการให้คุณแสดงผลแต่ละตาข่ายอีกหลายครั้งเพื่อสะสมผลของแสงแต่ละอันที่กระทบ ในกรณีที่เลวร้ายที่สุดนี่จะเป็นการเรียกแบบดึงหนึ่งครั้งต่อตาข่ายต่อแสงหรือ 400 การสุ่มจับทั้งหมด! สำหรับการเรียกสายแต่ละครั้งคุณจะทำการส่งสัญญาณซ้ำจุดยอดของเครือข่ายซ้ำซ้อน นอกจากนี้ยังมีโอกาสดีที่คุณจะได้รับพิกเซลแรเงาที่ไม่ได้รับผลกระทบจากแสงจริง ๆ หรือจะไม่ปรากฏในผลลัพธ์สุดท้าย (เพราะพวกเขาจะถูกบดบังด้วยรูปทรงเรขาคณิตอื่น ๆ ในฉาก) ผลลัพธ์เหล่านี้แต่ละรายการทำให้สูญเสียทรัพยากร GPU
เปรียบเทียบกับการเรนเดอร์ที่ถูกเลื่อน: คุณจะต้องเรนเดอร์ตาข่ายหนึ่งครั้งเพื่อเติม G-buffer หลังจากนั้นสำหรับแต่ละแสงคุณจะสร้างรูปร่างที่มีขอบเขตซึ่งแสดงถึงขอบเขตของอิทธิพลของแสง สำหรับจุดแสงนี่อาจเป็นทรงกลมเล็ก ๆ หรือสำหรับแสงทิศทางมันจะเป็นรูปสี่เหลี่ยมเต็มหน้าจอเนื่องจากฉากทั้งหมดได้รับผลกระทบ
จากนั้นเมื่อคุณดำเนินการพิกเซล / ส่วนแตกสำหรับปริมาณขอบเขตของแสงนั้นคุณอ่านแอตทริบิวต์เรขาคณิตจากตำแหน่งที่เหมาะสมในพื้นผิว G-buffer และใช้ค่าเหล่านั้นเพื่อกำหนดผลแสง เฉพาะพิกเซลของฉากที่มองเห็นได้ในผลลัพธ์สุดท้ายเท่านั้นที่มีการแรเงาและจะมีการแรเงาหนึ่งครั้งต่อแสง นี่แสดงให้เห็นถึงการออมที่มีขนาดใหญ่
อย่างไรก็ตามไม่ใช่ว่าจะไม่มีข้อเสีย มันเป็นกระบวนทัศน์ที่ยากมากที่จะขยายออกไปเพื่อจัดการกับรูปทรงเรขาคณิตที่โปร่งใส (ดู: การปอกเปลือกลึก) ในความเป็นจริงยากมากที่การใช้งานการเรนเดอร์แบบเลื่อนออกไปแทบทั้งหมดกลับไปสู่การเรนเดอร์เรนเดอร์สำหรับส่วนที่โปร่งใสของฉาก การเรนเดอร์ที่ถูกหน่วงยังใช้ VRAM และแบนด์วิดท์บัฟเฟอร์เฟรมจำนวนมากซึ่งนำไปสู่การพัฒนาความยาวที่ยอดเยี่ยมในการแพ็คและบีบอัดแอตทริบิวต์ G-buffer อย่างชาญฉลาดให้เป็นองค์ประกอบที่เล็กที่สุด / น้อยที่สุด
เรียกอีกอย่างว่าการแรเงาที่รอการตัดบัญชีการแสดงผลแบบอ้างถึงหมายถึงกลุ่มของการเรนเดอร์ที่เป็นไปได้จำนวนมากซึ่งเก็บผลลัพธ์ระดับกลางไว้ในพื้นผิวจากนั้นจึงทำการสร้างสมการ
ตัวอย่างบัฟเฟอร์เรขาคณิตเป็นตัวอย่างแรกที่ฉากจะแสดงผลเป็นชุดของบัฟเฟอร์ที่มีเช่นตำแหน่งปกติและพื้นผิวฐานของเรขาคณิตทึบแสง ไม่ได้ใช้แสงไฟและไม่ทราบสีสุดท้าย ในไฟสัญญาณผ่านที่ตามมาจะถูกเรนเดอร์และบัฟเฟอร์เรขาคณิตจะถูกสุ่มตัวอย่าง ซึ่งหมายความว่าสามารถให้แสงจำนวนมากพร้อมค่าใช้จ่ายคงที่จำนวนแสงที่มองเห็นได้บนพิกเซลหน้าจอ การเรนเดอร์แบบดั้งเดิมจะทำการประเมินแหล่งกำเนิดแสงทั้งหมดสำหรับพื้นผิวที่ถูกบดบังและไม่เคยเห็นบนหน้าจอ
มีหลายรูปแบบรวมถึงการแสดงข้อมูลแสงก่อน
ดูข้อมูลเพิ่มเติมได้ที่: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading
การเรนเดอร์เป็นการประมวลผลโดยที่ geomtry อยู่ก่อนที่จะทำการส่งผ่านครั้งที่สอง มันมีประโยชน์เพราะมันเปลี่ยน coplexity ให้เป็น O (พิกเซล * แหล่งกำเนิดแสง) ช่วยให้คุณใช้ฉากที่ซับซ้อนด้วยประสิทธิภาพที่ยอดเยี่ยมเพียงเล็กน้อย
การใช้มันค่อนข้างง่าย บัตรโดยสารประเภทพาสต้องมีการแสดงผลอย่างน้อยที่สุดระยะทางปกติและสี คุณสามารถเพิ่มพื้นผิวเพิ่มเติมเพื่อแสดงผลเช่น specular และตำแหน่งในราคาหน่วยความจำ
เมื่อคุณสร้างเรนเดอร์เหล่านั้นแล้วคุณจะสร้างทรงกลมบางอันซึ่งแหล่งกำเนิดแสงที่ไม่เหมือนใครอยู่ตรงกลางของแต่ละแหล่งรวมแสงเข้าด้วยกันครอบตัดมันทั้งหมดให้เป็นรูปทรงเรขาคณิตในฉากของคุณ
there's the correct complexity equation
จริง แต่ฉันจะบอกว่าเป็นรายละเอียดเล็กน้อย คุณสามารถแนะนำว่าเป็นการแก้ไขคำตอบอื่น ๆ หรือแสดงความคิดเห็นเกี่ยวกับสิ่งนั้นเมื่อคุณมีชื่อเสียงเพียงพอ สร้างคำตอบใหม่เพราะนั่นเกินความจริงเล็กน้อย it's much more concise
โดยส่วนตัวฉันไม่คิดว่ามันดี รายละเอียดที่เป็นประโยชน์มากกว่าคำตอบก็คือดีกว่าใช่ไหม?