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

时间:2016-10-18 11:18:08

标签: javascript webgl electron

我在mmap中使用electron的略微修改版本来共享两个不同进程之间的内存。然后我使用这个内存,以buffer的形式上传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场景中的纹理保持不变。

但是,如果我将缓冲区复制到TypedArray,它可以完美地运行:

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

问题在于这样做我每次都在反复复制所有数据,这种方式违背了使用mmap的目的。

有没有办法用缓冲区数据更新WebGL纹理,而不是每次都将其内容复制到新数组?

1 个答案:

答案 0 :(得分:0)

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

Here您可以阅读有关DataViews的更多信息。