我有一個簡單的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完成任何顯示列表,但是我找不到一個顯示我需要做什麼的示例。
編輯1 - 慢VBO性能的光,下面是我的平臺的詳細信息
的Windows 7 64位
i5-2430M
GPU只是板載Intel高清顯卡3000
4GB內存
應用程序是Python OpenGL。 Python版本爲2.7.9 64位,使用PyOpenGL 3.1.0 amd64,並通過PySide 1.2.2 amd64使用QT QGLWidget。
這裏是一個轉儲從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