2017-02-22 40 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 –

相关问题