2014-03-01 110 views
1

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

    我将不胜感激这一个的任何帮助,谢谢!

  • 回答

    1

    glUnmapBuffer(target)将取消映射当前绑定到target的缓冲区。从您发布的代码中,尚不清楚是否仍会有与您进行地图通话时相同的绑定。你的措词表明你完全按照所有3映射,而当你尝试取消映射时,你只能取消映射最后映射的映射,因为你忘记重新绑定其他映射,这会导致前两个错误的纹理。

    +0

    是的,我想这正是发生了什么事情。鉴于我需要全部3个同时传递到外部图书馆的事实,您建议采用何种方法来缓解此问题? –

    +0

    @RamonJohannessen:多个缓冲区同时映射没有任何问题。在实际尝试取消映射之前,只需将'glBindBuffer(GL_PIXEL_UNPACK_BUFFER,tex.glBufID);'调用添加到您的'UnlockTexture'函数中,并且它将按预期工作。 – derhass

    +0

    是的,出于某种原因,我排除了这个选择......现在看起来很明显......那会教我做这一半的事情。谢谢! –

    相关问题