OpenGL и glfw - изменить размер окна после его создания в python - PullRequest
0 голосов
/ 17 января 2019

в python3 я использую glfw и PyOpenGL. Когда я создаю скрытое окно, рендерину в него, читаю его пиксели - я получаю хорошо визуализированные изображения.

Если я пытаюсь изменить размер окна - кажется, что OpenGL не знает о новом размере рендеринга и продолжает рендеринг больших изображений в маленькое окно, которое обрезает считанные изображения

Вот пример:

width = height = 500

# Create the hidden window we are going to render into
glfw.window_hint(glfw.VISIBLE, False)
glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 2)
glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, OpenGL.GL.GL_TRUE)
glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
window = glfw.create_window(width, height, "hidden window", None, None)
assert window
glfw.make_context_current(window)

# THIS CODE BREAKS IT:
# width = height = 300
# glfw.set_window_size(window, 300, 300)

# render into the window:
# ...code to choose the VBO...
glDrawArrays(GL_TRIANGLES, ...)


# Read back the created pixels:
data = glReadPixels(0, 0, width, height, OpenGL.GL.GL_RGB, OpenGL.GL.GL_UNSIGNED_BYTE)
rendered_image =  np.frombuffer(data, dtype=np.uint8).reshape(rendered_image_height, rendered_image_width, 3)[::-1]

Также может быть полезным другое решение для изменения размера рендеринга после того, как окно уже создано и рендерился в него несколько раз (и, очевидно, очищается), также может быть полезным

1 Ответ

0 голосов
/ 18 января 2019

Когда размер окна изменился, вы должны сбросить прямоугольник области просмотра на glViewport

Реализовать обратный вызов изменения размера и установить его glfw.set_window_size_callback:

vp_size_changed = False
def resize_cb(window, w, h):
    global vp_size_changed
    vp_size_changed = True
glfw.set_window_size_callback(window, resize_cb)

Получите новый размер кадрового буфера с помощью glfw.get_framebuffer_size и установите прямоугольник области просмотра с помощью glViewport:

global vp_size_changed

while not glfw.window_should_close(window):
    glfw.poll_events()

    if vp_size_changed:
        vp_size_changed = False
        w, h = glfw.get_framebuffer_size(window)
        glViewport(0, 0, w, h)
        print("new viewport size:", w, h)
...