Как изменить размер окна GLUT?
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 изменяет размеры, и содержимое окна показа при включенной функции перетаскивания включено.
Тест был сделан на windows7, PyOpenGL==3.1.1 и python3.5.1_x86
Таким образом, вопрос заключается в том, как правильно изменить размер и обновить окно перенасыщения в реальном времени?
1 ответ
Перво-наперво glViewport
не принадлежит обработчику изменения формы (если бы у меня был цент за каждый раз, когда я писал это…).
Проблема, с которой вы сталкиваетесь, - это не та проблема, которую вы легко можете решить из-за пределов GLUT, потому что она, по сути, сводится к тому, как реализованы внутренние компоненты основного цикла. Для плавного обновления содержимого окна при техническом изменении размера главный цикл должен приспосабливаться к этой ситуации, плавно чередуя события изменения размера с вызовами функции отображения. Путь glutPostRedisplay
flags основной цикл для перерисовки будет вызывать функцию отображения каждые несколько шагов изменения размера, но это может сопровождаться мерцанием и резкими перерисовками.
Лучше всего сделать то, что обычно вызывает недовольство: вызвать функцию отображения (включая замену буфера) в конце обработчика изменения размера и не вызывать glutPostRedisplay
, Однако это может быть подвержено мерцанию, в зависимости от того, как реализовано стирание фона WSI. Проблема в том, что события изменения размера могут стоять в очереди, а шаги изменения размера - долго, покажется, что они отстают от действий пользователя.
Для действительно плавных обновлений изменения размера необходим соответствующий написанный основной цикл, который объединяет события ввода / изменения размера, чтобы избежать проблем с задержкой очереди, и позволяет выполнять операцию рисования при изменении размера без автоматического стирания фона для поддержки плавных обновлений. Текущие реализации GLUT не делают этого.