强制WebGL纹理从缓冲区重新加载

Forcing WebGL texture reload from buffer

本文关键字:加载 新加载 WebGL 纹理 缓冲区 强制      更新时间:2023-09-26

我在电子中使用(稍微修改的版本)mmap来在两个不同的进程之间共享内存。然后我用这个内存,以缓冲区的形式上传一个WebGL纹理,我用它来画东西:

buffer = mmap(196608,mmap.PROT_READ,mmap.MAP_SHARED,"shared_mmap",0)
f = function(){
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 256, 256, 0, gl.RGB, gl.UNSIGNED_BYTE, buffer);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.bindTexture(gl.TEXTURE_2D, null)
}

这第一次工作得很好。虽然我可以看到数据被其他进程改变(如果我在控制台上评估buffer[100]),但纹理在WebGL场景中保持不变。

但是,如果我将缓冲区复制到typearray,它就可以完美地工作:

arr = new Uint8Array(buffer)
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 256, 256, 0, gl.RGB, gl.UNSIGNED_BYTE, arr);

问题是,这样做,我重复复制所有的数据每帧,这有点违背了使用mmap的目的。

是否有一种方法来更新WebGL纹理与缓冲区数据不复制其内容到一个新的数组每次?

您没有复制数据,使用new Uint8Array(buffer),您正在创建对相同数据的新引用。

您可以在这里阅读更多关于DataViews的信息。