2014-03-01 108 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

    是的,出於某種原因,我排除了這個選擇......現在看起來很明顯......那會教我做這一半的事情。謝謝! –

    相關問題