Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何调整过剩窗口的大小?_Python_Opengl_Glut_Pyopengl - Fatal编程技术网

Python 如何调整过剩窗口的大小?

Python 如何调整过剩窗口的大小?,python,opengl,glut,pyopengl,Python,Opengl,Glut,Pyopengl,为了正确地调整和刷新这个窗口,我已经尝试了一些方法,但到目前为止没有成功。当窗口调整大小时,场景应该实时正确渲染,但事实并非如此,相反,只有在释放鼠标时场景才会更新(不调用重塑功能),或者在调整大小时,场景才有一点机会更新,但最终结果肯定一点也不酷 值得一提的是,pyqt opengl应用程序正在调整大小,并且该选项已启用 该测试是在windows7、PyOpenGL==3.1.1和python3.5.1_x86上进行的 因此,问题是,如何实时正确调整和刷新glut窗口?第一件事glViewpo

为了正确地调整和刷新这个窗口,我已经尝试了一些方法,但到目前为止没有成功。当窗口调整大小时,场景应该实时正确渲染,但事实并非如此,相反,只有在释放鼠标时场景才会更新(不调用重塑功能),或者在调整大小时,场景才有一点机会更新,但最终结果肯定一点也不酷

值得一提的是,pyqt opengl应用程序正在调整大小,并且该选项已启用

该测试是在windows7、PyOpenGL==3.1.1和python3.5.1_x86上进行的


因此,问题是,如何实时正确调整和刷新glut窗口?

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

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

您最好的选择是做一些通常不喜欢做的事情:调用resize处理程序末尾的display函数(包括缓冲区交换),不要调用
glutPostRedisplay
。然而,这可能仍然容易闪烁,这取决于WSI后台擦除的实现方式。问题是,调整事件大小可能会排队,并且调整步骤长begone显示滞后于用户操作


对于真正平滑的调整大小更新,需要一个适当编写的主循环,该循环合并输入/调整大小事件以避免队列延迟问题,并允许在调整大小时进行绘图操作,而无需自动背景擦除以支持平滑更新。当前GLUT的实现无法做到这一点。

@genpfault编辑了我在Mac OSX 10.12上运行的问题,并且您的实现在我的计算机上实时调整了大小,因此可能与您在Windows中的计算机设置有关。您是否在视觉效果设置中禁用了该选项?@Justintant很高兴知道它在Mac OSX 10.12上的大小调整正确。在windows7上,我启用了“拖动时显示窗口内容或轮廓”功能,请尝试在
重塑()的末尾调用
glutPostRedisplay()?或者这主要是与偏好有关。感谢您的回答,当使用其他LIB进行Opengl操作时,调整大小是顺利完成的,对glut感到羞耻:)@BPL:问题是,显示器可能以低于交互式帧速率的速度渲染(即非常复杂的场景),因此。原则上,通过在调整大小期间调用的重塑显示函数(我建议
glutrestrapedisplayfunc
)扩展FreeGLUT应该足够容易;然后,程序可为此注册快速(低质量)显示功能。
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()