WebGL – 将部分纹理发送给GPU

我有RAM内存中的像素matrix,例如1000×1000像素。 我使用它发送给GPU

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1000,1000, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels); 

这很好。 但是我改变了一些像素,位于矩形x = 50,y = 50,宽度= 100,高度= 100。 再次发送整个1000x1000px图片需要太多的时间,我只想发送更改的子区域到GPU。

我累了

 gl.texSubImage2D(gl.TEXTURE_2D, 0, 50,50, 100,100, gl.RGBA, gl.UNSIGNED_BYTE, pixels); 

但似乎参数“像素”应该是100×100像素的子区域。 从大图中复制一个子区域也需要太多的时间。 我可以以某种方式为RAM中的源像素指定一个子矩形吗? 也许以某种方式使用gl.pixelStorei()

更新 :我发现可以在WebGL 2.0(= OpenGL ES 3.0)使用gl.pixelStorei()通过更改PACK_ROW_LENGTH,PACK_SKIP_ROWS,PACK_SKIP_PIXELS参数。 太糟糕的WebGL 2.0不支持大多数设备现在:(

我不认为有可能在CPU内存中为缓冲区指定源音高,就像使用较低级别的API一样。

但是,您可以使用DataView在像素中指定偏移量,以便以上述方式上传1000×100的纹理部分。