การกำหนดรูปทรงเรขาคณิตใน OpenGL ES 2.0


12

ฉันวางแผนที่จะทำรูปทรงเรขาคณิตใน OpenGL ES 2.0 โดยทั่วไปฉันวางแผนที่จะแสดงรูปทรงเรขาคณิตเดียวกัน (เก้าอี้) อาจจะ 1,000 ครั้งในฉากของฉัน

วิธีที่ดีที่สุดในการทำสิ่งนี้ใน OpenGL ES 2.0 คืออะไร?

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

นั่นจะเป็นข้อมูลพิเศษจำนวนมากที่ส่งไปยัง GPU (2 จุดยอดพิเศษ * 16 ลอย * (จำนวนสามเหลี่ยม) จำนวนข้อมูลพิเศษ)

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

วิธีที่ดีที่สุดและมีประสิทธิภาพในการทำอินสแตนซ์ใน OpenGL ES 2.0 คืออะไร


3
ฉันพลาดจริง ๆglVertexAttribDivisor:(
จะ

คำตอบ:


9

ES2 ไม่มีทั้ง glVertexAttribDivisor และ text point floating ดังนั้นตัวเลือกของคุณค่อนข้าง จำกัด

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

คุณสามารถทำสิ่งนี้ด้วยการเรียก glUniform ปกติหรือคุณอาจใช้ช่องทางจุดสุดยอดบางอย่างในทางที่ผิดและทำการโทร glVertexAttrib (หมายเหตุ: ไม่ใช่การเรียก glVertexAttribPointer) ก่อนที่จะวาดเก้าอี้แต่ละตัวระบุเมทริกซ์ที่ใช้ 4 ช่องดังกล่าว แต่ละจุดสุดยอดที่ตามมาในเก้าอี้ นั่นอาจเป็นเส้นทางที่เร็วพอสำหรับฮาร์ดแวร์บางตัว แต่จะช้ากว่ากันดังนั้นคุณจะต้องทำการทดสอบ

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

ในภาพรวมและสมมติว่าคุณมีเป้าหมายสำหรับแพลตฟอร์มมือถือทั่วไปฉันคิดว่าไม่ว่าคุณจะทำอะไรการโทรออกจะฆ่าคุณ


6

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


3

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

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


+1 อย่างไรก็ตามฉันยังไม่แน่ใจว่าการอ้างอิงข้อความ Nvidia นั้นใช้ได้กับชิป PVR บนมือถือ โดยเฉพาะอย่างยิ่งเกี่ยวกับการกล่าวถึงของพวกเขาเกี่ยวกับส่วนคนขับ http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/…
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

นี่คือ Google Talk บน WebGL ซึ่งเป็น OpenGL ES สำหรับ JavaScript ซึ่งหมายความว่าไม่มีการสร้างรูปทรงเรขาคณิตเช่นกัน มันอาจทำให้คุณมีความคิด แต่ก็ยากที่จะบอกเพราะฉันไม่รู้ว่าคอขวดของคุณอยู่บน GPU หรือ CPU

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

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