[英]How to resize a GLUT window?
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应用程序正在调整ok和显示窗口内容,同时启用了拖动选项。
测试是在windows7,PyOpenGL == 3.1.1和python3.5.1_x86上进行的
所以问题是,我怎样才能实时调整大小和刷新过剩窗口?
首先,第一件事glViewport
不属于重塑处理程序(如果我每次写这个都有一分钱......)。
您遇到的问题不是您可以从GLUT的“外部”轻松解决的问题,因为它基本上归结为如何实现主循环的内部结构。 为了在调整大小期间平滑地更新窗口的内容,主循环必须通过平滑地将调整大小事件与显示功能的调用交错来适应这种情况。 glutPostRedisplay
标记重绘的主循环的方式将每隔几个调整大小步骤调用显示函数,但它可能伴随闪烁和不稳定的重绘。
最好的办法是做一些通常不赞成的事情:在调整大小处理程序结束时调用显示函数(包括缓冲区交换),不要调用glutPostRedisplay
。 然而,这可能仍然容易闪烁,这取决于WSI背景擦除的实现方式。 问题在于,调整大小事件可能会排队并调整大步长度,这些步骤显示滞后于用户操作。
对于真正平滑的调整大小更新,需要一个适当编写的主循环,它可以合并输入/调整大小事件以避免队列滞后问题,并允许调整大小绘制操作而无需自动背景擦除以支持平滑更新。 GLUT的当前实现不会这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.