glFlush() 如何影响渲染的正确性?
Posted
技术标签:
【中文标题】glFlush() 如何影响渲染的正确性?【英文标题】:how can glFlush() affect rendering correctness? 【发布时间】:2010-09-26 21:09:32 【问题描述】:注意到有 其他 OpenGL 中的意外伪影 程序,我做了一些挖掘和 发现可以升级 Ubuntu 上的 OpenGL 堆栈: https://launchpad.net/~xorg-edgers/+archive/ppa
更新后,所有 GL 渲染 更快(我的测试程序如下 速度翻了一番!)并且没有人工制品。
所以回答我自己的问题:如何 glFlush() 影响渲染 正确性? 当司机 越野车。
=== 原始问题 ===
或者,更准确地说,我的经典不流行的非着色器-VBO-stuff 的根本错误是什么?
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
【问题讨论】:
你在使用双缓冲吗? 未明确;这是一个普通的 gtk opengl 画布 你检查 glGetError 的结果了吗?也许你已经解决/放弃了这个...... @rotoglup 我已经放弃了它,但你激励我回去检查:) 【参考方案1】:我不能确切地说为什么不调用glFlush()
会导致不希望的结果,但您可能想看看我前段时间问过的关于difference between glFlush ad glFinish 的问题。它可能有一些有用的信息。
至于解决方案,也许在渲染完整个场景之后尝试添加glFlush()
,而不是每个立方体。
【讨论】:
【参考方案2】:代码示例中的 glBegin / glEnd 调用不匹配属性,并且在某些情况下它们是重叠的。 glFlush 将有效地强制 glEnd,这就是区别。如果您只是将 glFlush 替换为 glEnd,我怀疑渲染的输出将是相同的。
例如,这是修复代码的一种方法:
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)
【讨论】:
以上是关于glFlush() 如何影响渲染的正确性?的主要内容,如果未能解决你的问题,请参考以下文章
opengl中 先用glFlush();然后glutSwapBuffers();有啥作用啊