У меня есть простое приложение OpenGL, где я рисую данные береговой линии. Данные представляют собой длинный список полигонов (около 41000), где каждый многоугольник представляет собой список точек (x, y). Многоугольники имеют разную длину (поскольку некоторые береговые линии длиннее других). Теперь, используя список отображения этого тривиально сделать - это код Python, но я уверен, что вы получите суть:VBO Эквивалент списка отображения с несколькими примитивами?
self.coastlines_dl = GL.glGenLists(1)
GL.glNewList(self.coastlines_dl, GL.GL_COMPILE)
for poly in coastline_polys:
GL.glBegin(GL.GL_LINE_STRIP)
for point in poly:
GL.glVertex3f(point[0], point[1], 0.0)
GL.glEnd()
GL.glEndList()
, а затем во время визуализации цикла:
GL.glCallList(self.coastlines_dl)
Это выполняет очень хорошо.
Мой вопрос: как мне сделать эквивалент, используя VBOs? Мой первоначальный подход, так как я никогда не использовал РВО раньше, и просто хотел, чтобы он работал, было создание VBO для каждого полигона, а затем сделать каждый VBO в визуализации цикла, что-то вроде:
for v in self.vbos:
v.bind()
GL.glEnableClientState(GL.GL_VERTEX_ARRAY)
GL.glVertexPointerf(v)
GL.glDrawArrays(GL.GL_LINE_STRIP, 0, v.data.shape[0])
GL.glDisableClientState(GL.GL_VERTEX_ARRAY)
v.unbind()
Этом работает, поскольку он рисует данные, но частота кадров ужасающая, что неудивительно, так как я привязываю и рисую 41000 + раз за кадр.
Могу ли я поместить все мои полисы в один большой VBO и просто сделать одно связывание и один glDrawArrays? Я не понимаю, каким образом glDrawArrays будет знать, сколько точек в каждом полигоне, так как оно отличается для каждого из них?
Извините, если это очень тривиально, но я продолжаю читать, что все, что я могу сделать с помощью списков отображения, можно сделать с помощью VBOs, но я не могу найти пример, который показывает, что мне нужно делать.
Edit 1 - В свете Медленное производительности VBO, Вот мои детали платформы
для Windows 7 64 бит
i5-2430M
GPU является только на борту Intel HD Graphics 3000
4GB RAM
Приложение Python OpenGL. Версия Python - 2.7.9 64 бит, с PyOpenGL 3.1.0 amd64 и использование QT QGLWidget через PySide 1.2.2 amd64.
Вот дамп от gDEBugger:
General
-------
OpenGL Version 3.1
Shading Language Version 1.40 - Intel Build 8.15.10.2345
Is Backward-Compatible Yes
Is Forward-Compatible No
Is Debug Context Yes
Renderer Vendor Intel
Renderer Name Intel(R) HD Graphics Family
Renderer Version 3.1.0 - Build 8.15.10.2345
Renderer Type Installable client
Marked for Deletion No
OpenGL Sharing Contexts None
Pixel Format Information
------------------------
Pixel Format ID 9
Hardware Acceleration Full
Double-Buffered Yes
Stereographic No
Native Rendering No
Channel Bits
Red 8
Green 8
Blue 8
Alpha 8
Depth 24
Stencil 8
Accumulation 64
Какая цель? Современные графические чипы? Или что-нибудь сделанное за последние 5 лет? Как сказано в другом ответе, в новых версиях gl есть лучшие функции, но вы будете ограничены новыми картами nvidia и amd. – djgandy
Как и все, что было сделано за последние 5 лет, я думаю. Как и версия 3.1? – lemondifficult