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

Javascript 强制从缓冲区重新加载WebGL纹理,javascript,webgl,electron,Javascript,Webgl,Electron,我正在使用中的(稍加修改的版本)在两个不同进程之间共享内存。然后我用这个内存,以a的形式上传一个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.R

我正在使用中的(稍加修改的版本)在两个不同进程之间共享内存。然后我用这个内存,以a的形式上传一个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纹理,而无需每次将其内容复制到新数组?

您不是在复制数据,使用
新Uint8Array(缓冲区)
,您是在创建对相同数据的新引用


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

您不是在复制数据,使用
新建Uint8Array(buffer)
,您是在创建对相同数据的新引用


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

我不知道您可以将node::Buffer传递给gl.texImage2D。但是,如果它是第一次工作,为什么需要将其复制到Uint8Array进行更新?我第一次工作,但它不会使用缓冲区中的新信息进行更新。缓冲区中存储的信息会发生变化,因为它基本上是共享内存,但不知何故Texamage2D没有意识到这一点。你找到解决方案了吗?我使用一个节点本机模块也遇到了类似的情况,该模块向node::Buffer渲染一个YUV曲面,然后通过webgl画布显示。。。唯一可行的方法是为每个帧(指向相同的数据)创建不同的node::Buffer。我不知道您可以将node::Buffer传递给gl.texImage2D。但是,如果它是第一次工作,为什么需要将其复制到Uint8Array进行更新?我第一次工作,但它不会使用缓冲区中的新信息进行更新。缓冲区中存储的信息会发生变化,因为它基本上是共享内存,但不知何故Texamage2D没有意识到这一点。你找到解决方案了吗?我使用一个节点本机模块也遇到了类似的情况,该模块向node::Buffer渲染一个YUV曲面,然后通过webgl画布显示。。。唯一可行的方法是为每一帧(指向相同的数据)创建一个不同的node::Buffer。但是:
缓冲区对象的内存被复制到TypedArray,不是共享的,而是:
缓冲区对象的内存被复制到TypedArray,不是共享的