2017-04-18 87 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