带有GL_PIXEL_UNPACK_BUFFER的glTexSubImage2D给出了GL_INVALID_OPERATION

时间:2014-03-01 09:01:19

标签: macos opengl pbo

目前我正在尝试使用PBO将视频数据传输到纹理。我不确定我想要做的事情是否可行,或者如果可能的话,这是一个很好的方法......我有3个纹理使用GL_RED格式(每个通道一个,当前不使用Alpha) 。所有这三个都将在一次调用外部库中填写。

这里绑定缓冲区等:

void LockTexture(const TextureID& id, void ** ppbData)
{
    Texture& tex = textures.getArray()[id];
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, tex.glBufID);
    glBufferData(GL_PIXEL_UNPACK_BUFFER, tex.width * tex.height, NULL, GL_STREAM_DRAW);
    *ppbData = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
}

这是针对3个纹理完成的,然后缓冲区由外部库填充。然后我尝试将它们推到纹理上,如下所示:

void UnlockTexture(const TextureID& id)
{
    Texture& tex = textures.getArray()[id];
    glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
    glBindTexture(tex.glTarget, tex.glTexID);

    glCheckForErrors(); // <--- NO ERROR

    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex.width, tex.height, GL_RED, GL_UNSIGNED_BYTE, 0);

    glCheckForErrors(); // <--- ERROR

    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
    glBindTexture(tex.glTarget, 0);
}

通过可以生成错误的原因列表,这就是我所知道的:

  • 已定义纹理数组
  • 类型正确
  • 数据参数(偏移)优于0
  • 未在glBegin / glEnd
  • 之间执行

这个我不确定:

    如果非零缓冲区对象名称绑定到GL_PIXEL_UNPACK_BUFFER目标,则会生成
  • 错误,并且数据将从缓冲区对象中解压缩,以使所需的内存读取超出数据存储大小。

这个似乎可能是一个问题,但我不知道如何处理这个问题:

    如果将非零缓冲区对象名称绑定到GL_PIXEL_UNPACK_BUFFER目标并且当前映射了缓冲区对象的数据存储,则会生成
  • 错误。

我是否正确地说这个glUnmapBuffer是取消映射最后映射的缓冲区,所以仍然映射了正确的缓冲区?

GL版本是3.2

非常感谢对此有任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

glUnmapBuffer(target)将取消映射当前绑定到target的缓冲区。从您发布的代码中,不清楚是否仍然存在与您进行地图调用时相同的绑定。你的措辞建议你一个接一个地对所有3进行映射,当你试图取消映射时,你只取消映射最后一个映射,因为你忘了重新绑定其他的,这会导致前两个错误你的纹理。