OpenGL和glfw-在python中创建窗口后调整窗口大小

OpenGL和glfw-在python中创建窗口后调整窗口大小,python,python-3.x,opengl,glfw,pyopengl,Python,Python 3.x,Opengl,Glfw,Pyopengl,在python3中,我使用glfw和PyOpenGL。当我创建一个隐藏窗口,渲染到其中,读取它的像素-我得到渲染良好的图像 如果我尝试调整窗口的大小,OpenGL似乎不知道新的渲染大小,而是将大图像渲染到一个小窗口中,这会使回读图像被裁剪 以下是一个例子: width = height = 500 # Create the hidden window we are going to render into glfw.window_hint(glfw.VISIBLE, False) glfw.w

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

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

当窗口大小已更改时,您必须通过

实现resize回调并通过以下方式进行设置:

vp\u size\u changed=False
def RESIGH_cb(窗口,w,h):
全局vp_大小_已更改
vp_size_changed=真
glfw.set\u window\u size\u回调(window,resize\u cb)
获取新的帧缓冲区大小,并设置视口矩形:

全局vp\u大小\u已更改
而不是glfw。窗口应关闭(窗口):
glfw.poll_事件()
如果vp_尺寸_发生变化:
vp_size_changed=False
w、 h=glfw.get\u帧缓冲区\u大小(窗口)
glViewport(0,0,w,h)
打印(“新视口大小:”,w,h)

您至少应该阅读TFD Hi!如何将窗口作为参数传递以调整_cb的大小?关键是窗口在我的项目中可能不是全局变量。非常感谢。