【问题标题】:How to resize a GLUT window?如何调整 GLUT 窗口的大小?
【发布时间】:2017-09-14 15:47:09
【问题描述】:
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上进行了测试

所以问题是,我怎样才能实时正确地调整和刷新过剩窗口?

【问题讨论】:

  • @genpfault 编辑了问题
  • 我在 Mac OSX 10.12 上运行,您的实现在我的计算机上实时正确调整大小,因此它可能与您在 Windows 中的计算机设置有关。您是否在视觉效果设置中禁用了"Show window contents or outline while dragging"
  • @JustinTennant 很高兴知道它在 Mac OSX 10.12 上正确调整大小。在 windows7 上,我启用了“拖动时显示窗口内容或轮廓”
  • 尝试在reshape()末尾调用glutPostRedisplay()
  • 这里有实际的技术问题吗?还是这只是主要与偏好有关。

标签: python opengl glut pyopengl


【解决方案1】:

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

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

最好的办法是做一些通常不受欢迎的事情:在调整大小处理程序的末尾调用显示函数(包括缓冲区交换),不要调用glutPostRedisplay。但是,这可能仍然容易出现闪烁,具体取决于 WSI 背景擦除的实现方式。这样做的问题是,调整大小事件可能会排队,并且早已开始的调整大小步骤会滞后于用户操作。

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

【讨论】:

  • 感谢您的回答,当与其他库一起做 Opengl 的东西时,调整大小很顺利,对 glut 感到羞耻 :)
  • @BPL:问题是,显示器可能会以低于交互式帧速率(即非常复杂的场景)呈现,因此。原则上,使用在调整大小期间调用的 reshape_display 函数(我建议 glutReshapeDisplayFunc)扩展 FreeGLUT 应该很容易;然后程序可以为此注册一个快速(低质量)显示功能。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2014-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2015-01-19
相关资源
最近更新 更多