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