การเรนเดอร์คืออะไร


54

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

คำตอบ:


55

ลักษณะการกำหนดของการเรนเดอร์รอคอยคือการเปลี่ยนความซับซ้อนของการเรนเดอร์ฉากจาก O (ไฟเรขาคณิต *) เป็น O (เรขาคณิต + ไฟ)

สิ่งนี้สามารถทำได้โดยการเรนเดอร์ฉากโดยใช้เฉดสีที่ออกแบบมาเพื่อส่งออกคุณสมบัติพื้นฐานเช่นตำแหน่ง (อย่างน้อยที่สุด) *, ปกติและสีกระจาย คุณสมบัติอื่น ๆ อาจรวมถึงค่า specular ต่อพิกเซลและคุณสมบัติของวัสดุอื่น ๆ สิ่งเหล่านี้จะถูกเก็บไว้ในเป้าหมายการแสดงผลเต็มหน้าจอซึ่งเรียกรวมกันว่า G-buffer

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

เมื่อ G-buffer ถูกสร้างขึ้นแล้วมันเป็นไปได้ที่จะคำนวณผลลัพธ์ที่มีแสงสว่างเพียงพอสำหรับพิกเซลใด ๆ บนหน้าจอโดยการแก้ไข BRDF หนึ่งครั้งต่อพิกเซลต่อแสง กล่าวอีกนัยหนึ่งถ้าคุณมี 20 ตาข่ายที่แต่ละคนได้รับผลกระทบจาก 20 ไฟการแสดงผลแบบดั้งเดิม ("ไปข้างหน้า") จะต้องการให้คุณแสดงผลแต่ละตาข่ายอีกหลายครั้งเพื่อสะสมผลของแสงแต่ละอันที่กระทบ ในกรณีที่เลวร้ายที่สุดนี่จะเป็นการเรียกแบบดึงหนึ่งครั้งต่อตาข่ายต่อแสงหรือ 400 การสุ่มจับทั้งหมด! สำหรับการเรียกสายแต่ละครั้งคุณจะทำการส่งสัญญาณซ้ำจุดยอดของเครือข่ายซ้ำซ้อน นอกจากนี้ยังมีโอกาสดีที่คุณจะได้รับพิกเซลแรเงาที่ไม่ได้รับผลกระทบจากแสงจริง ๆ หรือจะไม่ปรากฏในผลลัพธ์สุดท้าย (เพราะพวกเขาจะถูกบดบังด้วยรูปทรงเรขาคณิตอื่น ๆ ในฉาก) ผลลัพธ์เหล่านี้แต่ละรายการทำให้สูญเสียทรัพยากร GPU

เปรียบเทียบกับการเรนเดอร์ที่ถูกเลื่อน: คุณจะต้องเรนเดอร์ตาข่ายหนึ่งครั้งเพื่อเติม G-buffer หลังจากนั้นสำหรับแต่ละแสงคุณจะสร้างรูปร่างที่มีขอบเขตซึ่งแสดงถึงขอบเขตของอิทธิพลของแสง สำหรับจุดแสงนี่อาจเป็นทรงกลมเล็ก ๆ หรือสำหรับแสงทิศทางมันจะเป็นรูปสี่เหลี่ยมเต็มหน้าจอเนื่องจากฉากทั้งหมดได้รับผลกระทบ

จากนั้นเมื่อคุณดำเนินการพิกเซล / ส่วนแตกสำหรับปริมาณขอบเขตของแสงนั้นคุณอ่านแอตทริบิวต์เรขาคณิตจากตำแหน่งที่เหมาะสมในพื้นผิว G-buffer และใช้ค่าเหล่านั้นเพื่อกำหนดผลแสง เฉพาะพิกเซลของฉากที่มองเห็นได้ในผลลัพธ์สุดท้ายเท่านั้นที่มีการแรเงาและจะมีการแรเงาหนึ่งครั้งต่อแสง นี่แสดงให้เห็นถึงการออมที่มีขนาดใหญ่

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


8

เรียกอีกอย่างว่าการแรเงาที่รอการตัดบัญชีการแสดงผลแบบอ้างถึงหมายถึงกลุ่มของการเรนเดอร์ที่เป็นไปได้จำนวนมากซึ่งเก็บผลลัพธ์ระดับกลางไว้ในพื้นผิวจากนั้นจึงทำการสร้างสมการ

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

มีหลายรูปแบบรวมถึงการแสดงข้อมูลแสงก่อน

ดูข้อมูลเพิ่มเติมได้ที่: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading


-3

การเรนเดอร์เป็นการประมวลผลโดยที่ geomtry อยู่ก่อนที่จะทำการส่งผ่านครั้งที่สอง มันมีประโยชน์เพราะมันเปลี่ยน coplexity ให้เป็น O (พิกเซล * แหล่งกำเนิดแสง) ช่วยให้คุณใช้ฉากที่ซับซ้อนด้วยประสิทธิภาพที่ยอดเยี่ยมเพียงเล็กน้อย

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

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


ฉันไม่คิดว่านี่จะเป็นการเพิ่มสิ่งใหม่ ๆ ให้กับคำตอบ ดูเหมือนว่าจะมีการใช้คำตอบของ Neverender ใหม่
HolyBlackCat

@HolyBlackCat มีความแตกต่างที่สำคัญสองสามอย่าง ก่อนอื่นมีสมการความซับซ้อนที่ถูกต้องและที่สองคือรัดกุมมากขึ้นในขณะที่ยังคงอธิบายวิธีการใช้งานจริง
hellol11

there's the correct complexity equationจริง แต่ฉันจะบอกว่าเป็นรายละเอียดเล็กน้อย คุณสามารถแนะนำว่าเป็นการแก้ไขคำตอบอื่น ๆ หรือแสดงความคิดเห็นเกี่ยวกับสิ่งนั้นเมื่อคุณมีชื่อเสียงเพียงพอ สร้างคำตอบใหม่เพราะนั่นเกินความจริงเล็กน้อย it's much more conciseโดยส่วนตัวฉันไม่คิดว่ามันดี รายละเอียดที่เป็นประโยชน์มากกว่าคำตอบก็คือดีกว่าใช่ไหม?
HolyBlackCat

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