寻找具有数据偏移支持的glTexSubImage2d的替代方案

时间:2012-02-28 14:41:22

标签: opengl textures

我有一个PBO,由CUDA每帧更新。在它之后,我还想使用这个PBO更新纹理,我使用glTexSubImage2d。我担心更新整个纹理是昂贵的,并且只想更新纹理的可视区域,而我的PBO上有整个数据。

问题在于,虽然glTexSubImage2d接受偏移量,宽度和高度作为参数,但它们仅在绘制到纹理时使用,而我仍然需要线性铺设我的缓冲区数据。我担心自己准备缓冲区数据可能太贵了(实际上它会非常昂贵,因为我的PBO驻留在GPU内存中。)

是否有glTexSubImage2d的替代方法,它也接受缓冲区偏移量的参数,或者我是否应该一次更新整个纹理?

2 个答案:

答案 0 :(得分:7)

请阅读使用glPixelStore设置的像素商店参数。参数GL_UNPACK_ROW_LENGTHGL_UNPACK_SKIP_PIXELSGL_UNPACK_SKIP_ROWS对您最感兴趣:

Pixel Store Parameters

  

这些值是为了方便程序员而提供的;它们不提供无法通过递增传递给glDrawPixels,glTexImage1D,glTexImage2D,glTexSubImage1D,glTexSubImage2D,glBitmap或glPolygonStipple的指针来复制的功能。将GL_UNPACK_SKIP_PIXELS设置为i等效于将指针递增i n个分量或索引,其中n是每个像素中的分量或索引的数量。将GL_UNPACK_SKIP_ROWS设置为j等效于将指针递增j k个分量或索引,其中k是每行的分量或索引数,如GL_UNPACK_ROW_LENGTH部分中计算的那样。

你仍然会使用glTexImage和/或glTexSubImage进行数据传输。

答案 1 :(得分:1)

如果纹理中选定的ROI不等于整个纹理大小,则glTexSubimage2D在从PBO获取数据时出错。 这是一个可能无法解决的已知问题(例如opengl forum thread)。