目前我正在尝试使用PBO将视频数据转换为纹理。我不确定我想要做什么甚至是可能的,或者如果可能的话,这是一种很好的方法...我有3种GL_RED格式的纹理(每个通道一个,当前不使用Alpha) 。所有这三项都将通过一次致电外部图书馆填写。glTexSubImage2D with GL_PIXEL_UNPACK_BUFFER给GL_INVALID_OPERATION
这里的绑定缓存等:
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是unmapping最后映射的缓冲区,所以正确的缓冲区仍映射?
GL版本是3.2
我将不胜感激这一个的任何帮助,谢谢!
是的,我想这正是发生了什么事情。鉴于我需要全部3个同时传递到外部图书馆的事实,您建议采用何种方法来缓解此问题? –
@RamonJohannessen:多个缓冲区同时映射没有任何问题。在实际尝试取消映射之前,只需将'glBindBuffer(GL_PIXEL_UNPACK_BUFFER,tex.glBufID);'调用添加到您的'UnlockTexture'函数中,并且它将按预期工作。 – derhass
是的,出于某种原因,我排除了这个选择......现在看起来很明显......那会教我做这一半的事情。谢谢! –