Как glFlush () может повлиять на правильность рендеринга? - PullRequest
2 голосов
/ 27 сентября 2010

Заметив, что были неожиданные артефакты в других OpenGL программы, я покопался и обнаружил, что вы можете обновить Стек OpenGL в Ubuntu: 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, with flush

если я опускаю сброс - и я, очевидно, не хочу, чтобы сброс, даже если я не иду по наиболее оптимальному пути opengl - тогда я получаю НЕПРАВИЛЬНЫЙ рендеринга и это ошибка, которую я не понимаю: 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 ]

1 голос
/ 30 августа 2013

вызовы 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)
1 голос
/ 29 сентября 2010

Я не могу точно сказать, почему не вызов glFlush() приводит к нежелательным результатам, но вы можете взглянуть на вопрос о разнице между glFlush и glFinish , который я задал некоторое время назад. Может иметь полезную информацию.

Что касается решений, возможно, попробуйте поставить glFlush() после того, как вы закончите рендеринг всей сцены, в отличие от каждого куба.

...