ประสิทธิภาพของการแลกเปลี่ยนระหว่างการเรนเดอร์ไปข้างหน้าและการเรนเดอร์เป็นอย่างไร


9

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

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

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

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

คำตอบ:


11

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

การจัดกำหนดการ GPU เป็นหัวข้อที่ซับซ้อนและการแลกเปลี่ยนระหว่างไปข้างหน้าและรอการตัดบัญชีไม่ได้ลดลงเพียงเพื่อ "ทำงานได้เร็วขึ้น แต่ใช้แบนด์วิดท์มากขึ้น" หากคุณมีการดำเนินการราคาถูกสองอย่างที่ดำเนินการตามลำดับและแต่ละครั้งใช้ทรัพยากรเท่ากันก็ไม่มีเหตุผลที่จะแบ่งพวกมันออกเป็นส่วนที่แยกต่างหาก: wavefronts ขนาดเล็กสองอันที่แต่ละการใช้ทรัพยากร X ทำงานได้ไม่ดีกว่าคลื่นที่ยาวกว่า ยังใช้ทรัพยากร X หากคุณมีการดำเนินการที่ถูกและการดำเนินการที่มีราคาแพงในการดำเนินการตามลำดับ แต่ก็อาจได้รับประโยชน์จากการแยกเป็นส่วนแยกต่างหาก: โดยทั่วไปแล้ว Shader จะสงวนจำนวนทรัพยากรสูงสุดที่อาจใช้ในทุกจุด มัน' เป็นไปได้ว่าการเรนเดอร์ไปข้างหน้าอาจไม่สามารถใช้แบนด์วิดท์ทั้งหมดของ GPU ของคุณได้เนื่องจากมี wavefronts เพียงไม่กี่ตัวในการบินที่มันไม่สามารถออกปฏิบัติการที่เพียงพอเพื่อทำให้แบนด์วิดท์อิ่มตัว แต่ถ้าคุณมีแบนด์วิดท์ที่ จำกัด อาจไม่มีประโยชน์ในการเรนเดอร์ที่เลื่อนออกไป (เนื่องจากอาจใช้แบนด์วิดท์มากกว่า)

ข้อกังวลเกี่ยวกับประสิทธิภาพเพิ่มเติมคือการแสดงผลไปข้างหน้าสนับสนุนประเภทวัสดุที่แตกต่างกัน (BRDF ที่ต่างกันพูด) เพียงแค่ใช้ shader ที่แตกต่างกันสำหรับวัตถุนั้น ตัวเรนเดอร์ที่เลื่อนออกไปตรงไปตรงมาจำเป็นต้องจัดการประเภทวัสดุที่แตกต่างกันในวิธีที่ต่างกัน (อาจเป็นสาขาใน shader) เนื่องจากงานจะไม่ถูกจัดกลุ่มเป็น warps / wavefronts อีกต่อไปขึ้นอยู่กับวัตถุที่ถูกเรนเดอร์ สิ่งนี้สามารถลดลงได้ด้วยตัวเรนเดอร์แบบเรียงต่อกัน - ถ้าเฉพาะพื้นที่ของหน้าจอใช้ชนิดของวัสดุทางเลือก (เช่นสำหรับผม) จากนั้นคุณสามารถใช้รูปแบบการเปลี่ยนแปลงของ Shader กับสาขาประเภทวัสดุสำหรับกระเบื้องที่มีพิกเซลใด ๆ .

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