2010-09-26 18 views
2

當注意到,有其他的OpenGL 程序 意想不到的文物,我做了一些挖掘和 發現,你可以升級在Ubuntu OpenGL的堆棧: https://launchpad.net/~xorg-edgers/+archive/ppaglFlush()如何影響渲染的正確性?

更新之後,所有的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

您使用雙緩衝? – 2010-09-27 00:20:41

+0

不明確;這是一個普通的gtk opengl canvas – Will 2010-09-27 05:34:54

+0

你檢查過glGetError的結果嗎?也許你已經解決了/丟棄這個,因爲... – rotoglup 2010-11-05 19:54:03

回答

1

我不能說正是爲什麼不叫glFlush()原因不想要的結果,但你可能想看看一個關於difference between glFlush ad glFinish我的問題前段時間問。它可能有一些有用的信息。

至於解決方案,或許在完成渲染整個場景之後嘗試放置一個glFlush(),而不是每個立方體。

1

代碼示例中的glBegin/glEnd調用不屬性匹配,並且在某些情況下它們重疊。 glFlush將有效地強制顯示,這就是區別。如果你簡單地用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)