2017-04-18 121 views
3
from OpenGL.extensions import alternate 
from OpenGL.GL import * 
from OpenGL.GL.ARB.multitexture import * 
from OpenGL.GLU import * 
from OpenGL.GLUT import * 


class TestTexture(): 

    def __init__(self): 
     self.window_width = 800 
     self.window_height = 800 

    def init(self): 
     glClearColor(0.0, 0.0, 0.0, 0.0) 
     glMatrixMode(GL_PROJECTION) 
     glLoadIdentity() 
     glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0) 
     glMatrixMode(GL_MODELVIEW) 
     glLoadIdentity() 
     glEnable(GL_TEXTURE_2D) 

    def display(self): 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     glLoadIdentity() 

     glBegin(GL_TRIANGLES) 
     glVertex3f(-1.0, 0.0, 0.0) 
     glVertex3f(1.0, 0.0, 0.0) 
     glVertex3f(0.0, 1.0, 0.0) 
     glEnd() 

     glFlush() 
     glutSwapBuffers() 

    def reshape(self, w, h): 
     self.window_width = w 
     self.window_height = h 
     glViewport(0, 0, self.window_width, self.window_height) 

    def animate(self): 
     glutPostRedisplay() 

    def visible(self, vis): 
     if (vis == GLUT_VISIBLE): 
      glutIdleFunc(self.animate) 
     else: 
      glutIdleFunc(0) 

    def key_pressed(self, *args): 
     if args[0] == b"\x1b": 
      sys.exit() 

    def run(self): 
     glutInit(sys.argv) 
     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH) 
     glutInitWindowSize(self.window_width, self.window_height) 
     glutInitWindowPosition(800, 100) 
     glutCreateWindow(b'MCVE') 
     glutDisplayFunc(self.display) 
     glutReshapeFunc(self.reshape) 
     glutIdleFunc(self.animate) 
     glutVisibilityFunc(self.visible) 
     glutKeyboardFunc(self.key_pressed) 

     self.init() 
     glutMainLoop() 

if __name__ == "__main__": 
    TestTexture().run() 

我已經嘗試了幾件事情,以調整&正確刷新這個窗口,但沒有運氣到目前爲止。當窗口被調整大小時,場景應該被實時正確渲染,但不是,只有當你釋放鼠標時纔會更新場景(重新調整函數未被調用),或者當它被調整大小時,它有一點更新的機會但最終的結果絕對不是很酷。如何調整GLUT窗口的大小?

值得一提的是,pyqt opengl應用程序正在調整大小,並且啓用show window contents while dragging選項。

測試上取得了windows7的,PyOpenGL == 3.1.1和python3.5.1_x86

所以現在的問題是,我該怎麼調整&正確刷新過剩窗口實時?

+0

@genpfault編輯問題 – BPL

+1

我在Mac OSX 10.12上運行,並且您的實現在我的計算機上實時調整大小,因此它很可能與您在Windows中的計算機設置有關。您是否在Visual Effects設置中禁用[「顯示窗口內容或輪廓拖動」](https://www.sevenforums.com/tutorials/75059-show-window-contents-outline-while-dragging.html) ? –

+0

@JustinTennant很高興知道它在Mac OSX 10.12上正確調整大小。在windows7上,我啓用了「在拖動時顯示窗口內容或輪廓」 – BPL

回答

3

第一件事情第一件事glViewport不屬於重塑處理程序(如果我每次寫這個......我都有一分錢)。

您遇到的問題並非您可以從GLUT的「外部」輕鬆解決的問題,因爲它基本上歸結爲主循環的內部實現方式。爲了在技術上調整大小時順利更新窗口內容,主循環必須適應這種情況,通過將調整大小事件與顯示功能的調用順利交錯。 glutPostRedisplay標誌着重繪的主循環會調用顯示功能每隔幾個調整大小的步驟,但它可能伴隨着閃爍和生澀的重繪。

最好的辦法是做一些通常會皺起眉頭的事情:在調整大小處理函數的末尾調用顯示函數(包括緩衝區交換),並且不要調用glutPostRedisplay。然而,這可能仍然容易閃爍,這取決於如何實施WSI背景擦除。問題在於,調整大小的事件可能會排隊並調整步長,從而導致用戶操作滯後。

爲了真正順利地調整大小更新,需要一個適當編寫的主循環,即合併輸入/調整大小事件以避免隊列滯後問題,並允許在不自動後臺擦除的情況下調整繪圖操作的大小以支持平滑更新。 GLUT的當前實現不這樣做。

+0

感謝您的回答,當與其他庫做Opengl的東西時,調整大小是順利完成的,對大量的恥辱:) – BPL

+0

@BPL:問題是,顯示器可能在低於交互幀率(即非常複雜的場景)呈現,因此。原則上,使用調整大小期間調用的reshape_display函數(我建議'glutReshapeDisplayFunc')來擴展FreeGLUT應該很容易;程序可以爲此註冊一個快速(低質量)的顯示功能。 – datenwolf