glFlush()如何影响渲染的正确性?

时间:2010-09-26 21:09:32

标签: opengl cython

  

注意到有   其他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 呈现: correct, with flush

如果我省略同花顺 - 我显然不想冲洗,即使我没有踩到最优的opengl路径 - 然后我得到这个 INCORRECT 渲染,这是我不明白的错误: incorrect, without flush

对于好奇,这是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

2 个答案:

答案 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)