【问题标题】:glTexSubImage2D with GL_PIXEL_UNPACK_BUFFER gives GL_INVALID_OPERATION带有 GL_PIXEL_UNPACK_BUFFER 的 glTexSubImage2D 给出 GL_INVALID_OPERATION
【发布时间】:2014-04-02 11:11:57
【问题描述】:

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

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

【问题讨论】:

    标签: macos opengl pbo


    【解决方案1】:

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

    【讨论】:

    • 是的,我认为这正是正在发生的事情。鉴于我需要同时将所有 3 个传递到外部库,您会推荐什么方法来缓解这个问题?
    • @RamonJohannessen:同时映射多个缓冲区并没有错。只需在您实际尝试取消映射之前,将glBindBuffer(GL_PIXEL_UNPACK_BUFFER, tex.glBufID); 调用添加到您的UnlockTexture 函数,它就会按预期工作。
    • 是的,出于某种原因,我排除了这个选项......现在看起来很明显......这会教我半睡半醒。谢谢!
    • 所以似乎还有其他东西产生了同样的错误。我在取消映射之前添加了一个绑定调用,但结果相同。现在我真的不确定我错过了什么......
    • 没关系!有一些调试代码我没有改回来。它现在正在工作:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多