目前我正在尝试使用 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
我将不胜感激任何帮助,谢谢!