การใช้หน่วยพื้นผิวที่มีอยู่ทั้งหมดเป็นการดีหรือไม่?


9

เมื่อใช้พื้นผิวหลายแบบกับตาข่ายเช่นสำหรับการทำแผนที่ bump ฉันมักจะผูกพื้นผิวกับหน่วยพื้นผิวแบบคงที่ไม่กี่ครั้งแรกเช่น: diffuse = unit 0, bump = unit 1, specular = unit 2 จากนั้นให้นำสิ่งเหล่านั้นกลับมาใช้ใหม่ ตาข่ายที่แตกต่างกันด้วยพื้นผิวที่แตกต่างกัน แต่ฉันสงสัยอยู่เสมอว่าทำไมglActiveTextureสนับสนุนหน่วยพื้นผิวจำนวนมาก (ในลิงค์ก่อนหน้านี้มันบอกว่าอย่างน้อย 80)

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

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

คำตอบ:


11

ฮาร์ดแวร์ที่ทันสมัยไม่ได้มีแนวคิดเกี่ยวกับจุดยึดพื้นผิวที่เปิดเผยโดย OpenGL แต่หน่วย shader ใช้ descriptor (ซึ่งเป็นตัวชี้ไขมันบางชนิด) ซึ่งสามารถจัดการกับพื้นผิวใด ๆ ได้ตราบใดที่มันมีอยู่ในหน่วยความจำวิดีโอ นี่คือสิ่งที่ทำให้สิ่งต่าง ๆ เช่นพื้นผิวที่ไม่มีสิ่งใดมาผูกมัดได้ ดังนั้น "หน่วยพื้นผิว" จำนวนมากที่มีอยู่ในการใช้งานในปัจจุบันคือการพยายามส่งมอบส่วนที่ไม่เกี่ยวข้องในตอนนี้ของ API

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


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