如何调整GLUT窗口的大小?

时间:2017-04-18 17:12:51

标签: python opengl glut pyopengl

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()

我已经尝试了一些事情来调整和正确刷新这个窗口但到目前为止没有运气。当窗口调整大小时,场景应该实时正确渲染,但事实并非如此,只有当您释放鼠标时才更新场景(不调用重塑功能)或者当调整大小时,它会有一点机会更新但最后的结果绝对不是很酷。

值得一提的是pyqt opengl应用程序正在调整大小,并启用了show window contents while dragging选项。

测试已在windows7,PyOpenGL == 3.1.1和python3.5.1_x86上进行

所以问题是,我怎样才能实时调整大小并且正确刷新过剩的窗口?

1 个答案:

答案 0 :(得分:3)

第一件事glViewport不属于重塑处理程序(如果我每次写这篇文章都有一分钱......)。

您遇到的问题不是您可以从GLUT的“外部”轻松解决的问题,因为它基本上归结为如何实现主循环的内部结构。为了在调整大小期间平滑地更新窗口的内容,主循环必须通过平滑地将调整大小事件与显示功能的调用交错来适应这种情况。 glutPostRedisplay标记重绘的主循环的方式将每隔几个调整大小步骤调用显示函数,但它可能伴随着闪烁和不稳定的重绘。

最好的办法是做一些通常不赞成的事情:调整调整大小处理程序末尾的显示功能(包括缓冲区交换),不要调用glutPostRedisplay。然而,这可能仍然容易闪烁,这取决于WSI背景擦除的实现方式。问题在于,调整大小事件可能会排队并调整长度,这些步骤会显示落后于用户操作。

对于真正平滑的调整大小更新,需要一个适当编写的主循环,它会合并输入/调整大小事件以避免队列滞后问题,并允许调整大小绘制操作而无需自动背景擦除以支持平滑更新。 GLUT的当前实现不会这样做。