目前我正在尝试使用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);
}
通过可以生成错误的原因列表,这就是我所知道的:
这个我不确定:
这个似乎可能是一个问题,但我不知道如何处理这个问题:
我是否正确地说这个glUnmapBuffer是取消映射最后映射的缓冲区,所以仍然映射了正确的缓冲区?
GL版本是3.2
非常感谢对此有任何帮助,谢谢!
答案 0 :(得分:1)
glUnmapBuffer(target)
将取消映射当前绑定到target
的缓冲区。从您发布的代码中,不清楚是否仍然存在与您进行地图调用时相同的绑定。你的措辞建议你一个接一个地对所有3进行映射,当你试图取消映射时,你只取消映射最后一个映射,因为你忘了重新绑定其他的,这会导致前两个错误你的纹理。