當注意到,有其他的OpenGL 程序 意想不到的文物,我做了一些挖掘和 發現,你可以升級在Ubuntu OpenGL的堆棧: https://launchpad.net/~xorg-edgers/+archive/ppaglFlush()如何影響渲染的正確性?
更新之後,所有的GL性以 更快(我的測試程序低於 翻倍在速度!)和沒有文物。
那麼回答我自己的問題: glFlush()如何影響渲染 的正確性? 當司機是 越野車。
=== 原來的問題 ===
,或者更正確的,什麼是我的經典untrendy非着色器VBO-東西根本錯誤?
cdef struct xyz:
float x, y, z
cdef inline void _normal(xyz b,xyz a):
glNormal3f(a.x-b.x,a.y-b.y,a.z-b.z)
cdef inline void _draw_quad(xyz a,xyz b,xyz c,xyz d):
glVertex3f(a.x,a.y,a.z)
glVertex3f(b.x,b.y,b.z)
glVertex3f(c.x,c.y,c.z)
glVertex3f(d.x,d.y,d.z)
cdef void _draw_grid(xyz a,xyz b,xyz c,xyz d):
glBegin(GL_LINE_LOOP)
_draw_quad(a,b,c,d)
glEnd()
.... # main loop goes through my data array issuing the appropriate functions
while self._buf.remaining() > 0:
op = self._buf.read_char()
if op == _COLOR:
col = self._buf.read_rgb()
#print col
glColor3f(col.r,col.g,col.b)
elif op in (_BOX,_GRID):
tl,tr,br,bl,trb,brb,tlb,blb = self._buf.read_xyz(),self._buf.read_xyz(),\
self._buf.read_xyz(),self._buf.read_xyz(),\
self._buf.read_xyz(),self._buf.read_xyz(),\
self._buf.read_xyz(),self._buf.read_xyz()
if op == _BOX:
#print "box",col
glBegin(GL_QUADS)
func = _draw_quad
else:
#print "grid",col
func = _draw_grid
_normal(tlb,tl)
func(tl,tr,br,bl)
_normal(tl,tr)
func(tr,trb,brb,br)
_normal(tr,tl)
func(tl,tlb,blb,bl)
_normal(tr,tl)
func(tl,tlb,trb,tr)
_normal(tl,tr)
func(bl,blb,brb,br)
_normal(tl,tlb)
func(tlb,trb,brb,blb)
if op == _BOX:
glEnd()
#glFlush()
else:
raise Exception("corrupt serialisation; got %x"%op)
如果沖洗每個立方體或線框後,我得到這個正確渲染:
如果我省略了沖洗 - 我顯然不希望被沖洗,即使我沒有踩到最優化的opengl路徑 - 然後我得到這個錯誤渲染,這是我不明白的錯誤:
對於好奇,這裏是如何glutSolidCube
和電線做到這一點:http://www.google.com/codesearch/p?hl=en#xbii4fg5bFw/trunk/FDS/trunk/SMV_5/source/glut-3.7.6/glut_shapes.c&q=glutSolidCube%20lang:c&sa=N&cd=4&ct=rc
您使用雙緩衝? – 2010-09-27 00:20:41
不明確;這是一個普通的gtk opengl canvas – Will 2010-09-27 05:34:54
你檢查過glGetError的結果嗎?也許你已經解決了/丟棄這個,因爲... – rotoglup 2010-11-05 19:54:03