【发布时间】: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
我将不胜感激任何帮助,谢谢!
【问题讨论】: