2

他のOpenGLプログラムに予期しないアーティファクトがあることに気付いたとき、私はいくつかの調査を行い、UbuntuでOpenGLスタックをアップグレードできることを発見しました: https ://launchpad.net/~xorg-edgers/+archive/ppa

更新後、すべてのGLレンダリングが高速になり(以下のテストプログラム の速度は2倍になりました!)、アーティファクトはありませんでした。

それで、私自身の質問に答えるために: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)

各キューブまたはワイヤーフレームの後にフラッシュすると、次の正しいレンダリング が得られます。正しい、フラッシュあり

フラッシュを省略した場合(そして、最適な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

4

2 に答える 2

1

glFlush()呼び出さないと望ましくない結果が生じる理由を正確に言うことはできませんが、以前に尋ねたglFlush と glFinish の違いについての質問をご覧になることをお勧めします。有益な情報があるかもしれません。

解決策glFlush()としては、各キューブではなく、シーン全体のレンダリングが完了した後に を配置してみてください。

于 2010-09-29T00:59:04.010 に答える