【问题标题】:Implementing render-to-vertex-array, glReadPixels fails (invalid operation)实现渲染到顶点数组,glReadPixels 失败(无效操作)
【发布时间】:2011-08-10 23:02:26
【问题描述】:

我正在尝试将顶点数据从纹理复制到顶点缓冲区,然后绘制顶点缓冲区。据我所知,最好的方法是将纹理绑定到 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?

【问题讨论】:

  • GetTexImage 可以为您节省一些指令(无需 FBO)
  • 代码对我来说看起来不错。您确定错误恰好发生在 glReadPixels 之后吗?
  • 是的,pyopengl 会自动检查错误,是 glReadPixels 导致错误。
  • 如果您找到了问题的答案,请将其作为答案发布并接受,而不是编辑问题。
  • 抱歉,stackoverflow 不允许我使用新帐户这样做。

标签: python opengl vbo pyopengl glreadpixels


【解决方案1】:

我自己解决了这个问题。

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

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

【讨论】:

  • pyopengl 中似乎有几个地方需要 c_void_p(0)。使用 vbo 时的 glVertexPointer() 是另一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多