OpenGL 和 glfw - 在 python 中创建后调整大小 window
OpenGL and glfw - resize window after creating it in python
在 python3 我使用 glfw 和 PyOpenGL。当我创建一个隐藏的 window 时,渲染它,读取它的像素 - 我得到了很好的渲染图像。
如果我尝试调整 window 的大小 - OpenGL 似乎不知道新的渲染大小,并一直将大图像渲染成小的 window,这使得读回图像裁剪
这是一个例子:
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]
另一种在创建 window 并多次渲染(显然清除它)后更改渲染大小的解决方案也可能有帮助
当 window 的大小发生变化时,您必须通过 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)
在 python3 我使用 glfw 和 PyOpenGL。当我创建一个隐藏的 window 时,渲染它,读取它的像素 - 我得到了很好的渲染图像。
如果我尝试调整 window 的大小 - OpenGL 似乎不知道新的渲染大小,并一直将大图像渲染成小的 window,这使得读回图像裁剪
这是一个例子:
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]
另一种在创建 window 并多次渲染(显然清除它)后更改渲染大小的解决方案也可能有帮助
当 window 的大小发生变化时,您必须通过 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)