目前我正在嘗試使用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
是的,出於某種原因,我排除了這個選擇......現在看起來很明顯......那會教我做這一半的事情。謝謝! –