实现顶点数组渲染,glReadPixels失败(无效操作)

3 投票
1 回答
995 浏览
提问于 2025-04-16 16:14

我正在尝试把纹理中的顶点数据复制到一个顶点缓冲区,然后再绘制这个顶点缓冲区。根据我的了解,最好的方法是把纹理绑定到一个帧缓冲对象(fbo),然后使用glReadPixels把它复制到一个顶点缓冲对象(vbo)。不过,我似乎无法让这个方法正常工作:glReadPixels出现了“无效操作”的错误。

欢迎提供更正、示例和其他方法。:)

以下是相关的代码:

glEnable(GL_TEXTURE_2D)

w, h = 32, 32

vbo = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, sizeof(c_float)*w*h*4, None, GL_STREAM_COPY)
glBindBuffer(GL_ARRAY_BUFFER, 0)

fbo = glGenFramebuffersEXT(1)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo)

tex = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, tex)
# tex params here
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, w, h, 0, GL_RGBA, GL_FLOAT, None)
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0)

assert glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == 36053

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT)
glBindBuffer(GL_PIXEL_PACK_BUFFER, vbo)
glReadPixels(0, 0, w, h, GL_RGBA, GL_FLOAT, None) # invalid operation?

1 个回答

1

我自己解决了这个问题。

在这个情况下,ReadPixels的最后一个参数是用作偏移量,而不是指针,并且pyopengl不会自动转换它,所以要这样使用:

glReadPixels(0, 0, w, h, GL_RGBA, GL_FLOAT, c_void_p(0)) # works!

撰写回答