1

目前我正在尝试使用 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

我将不胜感激任何帮助,谢谢!

4

1 回答 1

1

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

于 2014-03-01T13:43:09.583 回答