2017-02-22 42 views
0

我有一塊GLvoid* data,其中包含整個圖像,該圖像在整個程序中定期更新。我用glTexImage2D用這個數據初始化GPU上的紋理。我應該向glTexSubImage2D提供完整或部分圖像嗎?

我想用glTexSubImage2D根據需要更新部分紋理。 documentation for glTexSubImage2D描述了GLvoid* pixels參數:

指定一個指向內存中圖像數據的指針。

這期待什麼「圖像數據」?我可以提供整個GLvoid* data,還是期待一個緩衝區,只有包含正在複製的數據?

如果期望部分數據,是否有替代方法來提供整個緩衝區?

+0

反過來說:'glTexSubImage2D'不用於更新GPU內存中的紋理的一部分,它用於將圖像數據緩衝區的一部分上傳到GPU內存。 – Steeve

+0

glPixelStore的GL_PACK_ROW_LENGTH會解決問題嗎? (以及GL_PACK_SKIP_PIXELS和GL_PACK_SKIP_ROWS)。自己沒有挖得太深,因此是一個評論,而不是一個答案。 – Columbo

回答

3

這只是對數據進行復制。或者你將不得不浪費大量的內存來上傳圖像的一部分(有時是你目前唯一的部分)。

P.S.而且它甚至不支持大數據,這是相當痛苦的。因此,如果您有完整的圖像,則無法將其複製到較小的緩衝區,而無法上傳其左側或右側一半。

+0

正如問題評論中所述, 'glPixelStore'會有幫助嗎?難道它不能用來跨越數據嗎? – Litty

+0

@Litty似乎可能,但我從來沒有嘗試過。 – BlueWanderer

0

可以提供整個圖像數據與呼叫

glTexSubImage2D(target, level, 0, 0, W, H, format, type, pixels); 

W和H是紋理的寬度和高度,整個紋理將被複制,像素是W * H陣列。或者你也可以用電話

glTexSubImage2D(target, level, offset_x, offset_y, w, h, format, type, pixels); 

其中w,h是weigth和修改數據的高度僅提供修改的數據,因此offset_x + W < W和offset_y + Y < Y.像素是W * H陣列。

編輯:

glPixelStorei(GL_UNPACK_ROW_LENGTH, W); 
glPixelStorei(GL_UNPACK_SKIP_PIXELS, offset_x); 
glPixelStorei(GL_UNPACK_SKIP_ROWS, offset_y); 

glTexSubImage2D(target, level, offset_x, offset_y, w, h, format, type, pixels); 

,其中像素是W * H

+0

在你的後一個例子中,'像素'應該只包含修改後的數據?有沒有辦法傳遞整個圖像,讓這個功能「櫻桃」挑選修改後的數據? – Litty

+0

是的。在第二個示例中,像素僅包含大小爲w * h,w <= W且h <= H的修改後的數據。您可以使用[glPixelStoref](https://www.khronos.org/opengl/wiki/GLAPI/glPixelStore) –

+0

傳遞整個圖像GL_UNPACK_SKIP_PIXELS和GL_UNPACK_SKIP_ROWS將有所幫助,但您仍然需要調用glTexSubImage2D –

相關問題