注意到有 其他OpenGL中的意外人工制品 程序,我做了一些挖掘和 发现你可以升级了 Ubuntu上的OpenGL堆栈: https://launchpad.net/~xorg-edgers/+archive/ppa
更新后,所有GL渲染都是 更快(我的测试程序如下 在速度上加倍 !)并且没有人工制品。
所以回答我自己的问题:怎么可能 glFlush()会影响渲染 正确性? 当司机是 车。
=== 原始问题 ===
或更确切地说,我的经典非渐变非着色器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)
如果在每个多维数据集或线框后刷新,我会得到 CORRECT 呈现:
如果我省略同花顺 - 我显然不想冲洗,即使我没有踩到最优的opengl路径 - 然后我得到这个 INCORRECT 渲染,这是我不明白的错误:
对于好奇,这是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
答案 0 :(得分:1)
我无法准确说出为什么不致电glFlush()
会导致不良后果,但您可能想看一下我前段时间问过的difference between glFlush ad glFinish问题。它可能有一些有用的信息。
至于解决方案,也许在完成渲染整个场景之后尝试放置glFlush()
,而不是每个立方体。
答案 1 :(得分:1)
代码示例中的glBegin / glEnd调用不是属性匹配的,在某些情况下它们是重叠的。 glFlush将有效地强制glEnd,这就是差异。我怀疑如果你只是用glEnd替换glFlush,渲染的输出将是相同的。
例如,这是修复代码的一种方法:
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):
_draw_quad(a,b,c,d)
.... # 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
glBegin(GL_LINE_LOOP)
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)
glEnd()
#glFlush()
else:
raise Exception("corrupt serialisation; got %x"%op)