Как изменить размер окна 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 не делают этого.

Другие вопросы по тегам