opengl รูปหลายเหลี่ยมกับแถบสามเหลี่ยมโดยใช้รายการแสดงผล

(ฉันใช้ PyOpenGL และแล็ปท็อปของฉันใช้ OpenGL 2.1)

ฉันได้ยินมาว่า OpenGL วาดรูปสามเหลี่ยมนั้นเร็วกว่ารูปหลายเหลี่ยมมาก แต่การใช้รายการแสดงผลจะช่วยลดค่าใช้จ่ายอีกด้วย ฉันจะได้รับความเร็วโดยการแปลงโมเดลของฉันเป็นแถบสามเหลี่ยมหรือไม่ หากปัจจุบันฉันอยู่ในรูปหลายเหลี่ยม (สามเหลี่ยมและรูปสี่เหลี่ยมและอื่น ๆ ) และใช้ glBegin(GL_TRIANGLE_STRIP) เพื่อวาดแทน glBegin(GL_POLYGON) หากฉันใช้รายการแสดงผลอยู่แล้ว รายการที่แสดงจะสามเหลี่ยมทุกอย่างโดยอัตโนมัติหรือไม่

ฉันมีโมเดลที่มีใบหน้าประมาณ 50 ใบหน้าในรูปแบบ obj และรายการทำด้วยรหัสนี้:

treelist = glGenLists(1)
glNewList(treelist, GL_COMPILE)
for s in OBJ.treeobjs:
    for face in s.faces:
        verts, normals, texcoords = face

        glBegin(GL_POLYGON)
        for i in range(len(verts)):
            glNormal3fv(s.normals[normals[i]])
            if texcoords[i] > 0:
                glTexCoord2fv(s.texcoords[texcoords[i]])
            glVertex3fv(s.vertices[verts[i]])
        glEnd()
glEndList()

และวาดด้วย:

glCalllist(treelist)

แต่ถ้าฉันต้องการแปลงทุกอย่างเป็นแถบสามเหลี่ยม (สามเหลี่ยมนั้นง่ายในเครื่องปั่น) ฉันจะต้องใช้รูปแบบที่แตกต่างจาก obj หรือไม่


person Matt Majic    schedule 03.01.2016    source แหล่งที่มา
comment
ค่อนข้างจะอวดรู้สักหน่อย แต่ถึงกระนั้น OpenGL ไม่ได้วาดรูปสามเหลี่ยมได้เร็วกว่ารูปหลายเหลี่ยม เพราะมันเป็นข้อกำหนด มันกำหนดเฉพาะสิ่งที่เกิดขึ้น การเรียก API ทำอะไร และไม่ได้ใช้งานอะไรเลย อย่างที่กล่าวไปแล้วว่า ฮาร์ดแวร์ส่วนใหญ่ในปัจจุบันเรนเดอร์เฉพาะรูปสามเหลี่ยมเท่านั้น และรูปร่างที่ซับซ้อนมากขึ้นก็จะถูกสลายออกไป หากคุณใช้ OpenGL 2+ คุณควรใช้บัฟเฟอร์จุดยอดแทนแสดงรายการ   -  person Colonel Thirty Two    schedule 03.01.2016
comment
บัฟเฟอร์จุดยอดรวมการใช้ glDrawArrays หรือไม่ ตัวอย่าง VBO ใน Wikipedia ใช้ glDrawArrays ร่วมกับ glBindBuffer แต่ฉันสามารถใช้ glDrawArrays ได้ด้วยตัวเอง   -  person Matt Majic    schedule 03.01.2016


คำตอบ (1)


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

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

person Taylor    schedule 03.01.2016
comment
แถบสามเหลี่ยมดีกว่ารายการสามเหลี่ยมที่ยังไม่ได้ปรับให้เหมาะสม แม้ว่ารายการสามเหลี่ยมที่ปรับให้เหมาะสมมักจะเอาชนะแถบได้ แต่คุณยังคงต้องเพิ่มประสิทธิภาพรายการนั้น - person Nicol Bolas; 03.01.2016
comment
ฉันไม่พบข้อกำหนดของ glDrawIndices - นั่นเป็นเพียงเวอร์ชันอื่นของ glDrawArrays และ glDrawElements หรือไม่ - person Matt Majic; 03.01.2016