【问题标题】:OpenGL and glfw - resize window after creating it in pythonOpenGL和glfw - 在python中创建窗口后调整窗口大小
【发布时间】:2019-06-11 22:28:51
【问题描述】:

在 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]

在已经创建窗口并多次渲染(显然是清除它)之后更改渲染大小的另一种解决方案也可能会有所帮助

【问题讨论】:

  • 你至少应该阅读 TFD glfw

标签: python python-3.x opengl glfw pyopengl


【解决方案1】:

当窗口大小发生变化时,你必须通过glViewport重置视口矩形

实现resize回调并通过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)

【讨论】:

  • 嗨!如何将窗口作为参数传递给 resize_cb ?关键是 window 在我的项目中可能不是全局变量。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
相关资源
最近更新 更多