2010-09-26 6 views
2

Обнаружив, что были неожиданных артефактов в других программах OpenGL, я сделал некоторые рытье и обнаружили, что вы можете обновить стек OpenGL на Ubuntu: https://launchpad.net/~xorg-edgers/+archive/ppaКак glFlush() влияет на правильность рендеринга?

После обновления всех GL рендеринга был быстрее (мои тестовые программы ниже удваивается в скорости!) и без артефактов.

Итак, чтобы ответить на мой вопрос: как может glFlush() влияет на рендеринг правильность? если драйверы багги.

=== оригинальный вопрос ===

или, вернее, то, что является основной ошибкой с моей классической untrendy без шейдера-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

+0

вы используете двойную буферизацию? –

+0

не указано явно; это нормальный gtk opengl canvas – Will

+0

Вы проверили результат glGetError? может быть, вы решили/отбросили это с тех пор ... – rotoglup

ответ

1

Я не могу точно сказать, почему не вызывая glFlush() причин нежелательных результатов, но вы можете захотеть взглянуть на вопрос о difference between glFlush ad glFinish I - спросил некоторое время назад. У него может быть какая-то полезная информация.

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

1

вызовы 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^