opengl poligon vs strip segitiga menggunakan daftar tampilan

(Saya menggunakan PyOpenGL dan laptop saya menjalankan OpenGL 2.1)

Saya mendengar bahwa OpenGL menggambar segitiga jauh lebih cepat daripada poligon, tetapi penggunaan daftar tampilan juga mengurangi biaya overhead. Apakah saya akan memperoleh kecepatan dengan mengubah model saya menjadi garis segitiga, jika model tersebut saat ini berbentuk poligon (segitiga dan segi empat, dan lainnya) dan menggunakan glBegin(GL_TRIANGLE_STRIP) untuk menggambar alih-alih glBegin(GL_POLYGON), jika saya tetap menggunakan daftar tampilan? Apakah daftar tampilan secara otomatis melakukan triangulasi semuanya?

Saya memiliki model dengan sekitar 50 wajah dalam format obj dan daftarnya dibuat dengan kode ini:

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()

dan digambar dengan:

glCalllist(treelist)

Tetapi jika saya ingin mengubah semuanya menjadi strip segitiga (triangulasi mudah dilakukan dalam blender) saya harus menggunakan format yang berbeda dari obj?


person Matt Majic    schedule 03.01.2016    source sumber
comment
Agak berlebihan, namun demikian: OpenGL tidak menggambar segitiga lebih cepat daripada poligon, karena ini adalah spesifikasi; itu hanya mendefinisikan apa yang terjadi, panggilan API melakukan apa, dan tidak mengimplementasikan apa pun. Meskipun demikian, sebagian besar perangkat keras saat ini hanya merender segitiga, dan bentuk yang lebih kompleks dipecah menjadi segitiga. Jika Anda menggunakan OpenGL 2+, Anda harus menggunakan buffer vertex alih-alih daftar tampilan.   -  person Colonel Thirty Two    schedule 03.01.2016
comment
Apakah buffer vertex termasuk penggunaan glDrawArrays? Contoh VBO di Wikipedia menggunakan glDrawArrays bersama dengan glBindBuffer, tapi saya bisa menggunakan glDrawArrays sendiri.   -  person Matt Majic    schedule 03.01.2016


Jawaban (1)


format obj tidak memiliki dukungan untuk strip segitiga. Jangan gunakan GL_POLYGON atau tampilkan daftar karena sudah tidak digunakan lagi. Jangan repot-repot melakukan pengupasan segitiga kecuali Anda memiliki alasan kinerja yang kuat.

Dengan asumsi Anda dapat melakukan triangulasi semuanya dalam blender, muat segitiga ke dalam VBO dan render diindeks melalui glDrawElements. Jika Anda memiliki banyak model untuk digambar, cobalah menggabungkan model Anda menjadi satu VBO besar.

person Taylor    schedule 03.01.2016
comment
Strip segitiga lebih baik daripada daftar segitiga yang tidak dioptimalkan. Meskipun daftar segitiga yang dioptimalkan biasanya dapat mengalahkan garis, Anda tetap harus mengoptimalkan daftar tersebut. - person Nicol Bolas; 03.01.2016
comment
Saya tidak dapat menemukan spesifikasi pada glDrawIndices - apakah itu hanya versi lain dari glDrawArrays dan glDrawElements? - person Matt Majic; 03.01.2016