如果以下内容没有多大意义,请参考下面的背景部分,为了使问题尽可能清楚,我省略了大部分上下文。
我有两个具有以下特征的WebGLRenderingContext:
目标:在移动设备上的33ms(30fps)内,将InputGL的渲染定期叠加到OutputGL的渲染上。
InputGL和OutputGL的帧缓冲区均从单独的进程中获取。两者都可以在一个window.requestAnimationFrame回调中使用(并带有完整的帧缓冲区)。由于InputGL需要读取操作,而OutputGL仅支持写入操作,因此InputGL和OutputGL无法合并到一个WebGLRenderingContext中。
因此,我想在每个window.requestAnimationFrame回调中将帧缓冲内容从InputGL复制到OutputGL。这使我可以在InputGL上保持读/写支持,而仅在OutputGL上使用write。它们都没有附加(常规)画布,因此画布覆盖是不可能的。我有以下代码:
// customOutputGLFramebuffer is the WebXR API's extended framebuffer which does not allow read operations
let fbo = InputGL.createFramebuffer();
InputGL.bindFramebuffer(InputGL.FRAMEBUFFER, fbo)
// TODO: Somehow get fbo data into OutputGL (I guess?)
OutputGl.bindFramebuffer(OutputGl.FRAMEBUFFER, customOutputGLFramebuffer);
// Drawing to OutputGL here works, and it gets drawn on top of the customOutputGLFramebuffer
我不确定这是否需要按特定的顺序绑定或某种纹理操作,对此将大有帮助。
背景:我正在将Unity WebGL与未发布的WebXR API结合使用。 WebXR使用其自己的,经过修改的WebGLRenderingContext,它不允许从其缓冲区中进行读取(出于隐私考虑)。但是,Unity WebGL需要从其缓冲区读取。两者都在同一个WebGLRenderingContext上进行操作会给Unity的读取操作带来错误,这意味着它们必须分开保存。这个想法是定期将Unity的帧缓冲区数据叠加到WebXR的帧缓冲区上。
如果需要,还支持WebGL2。
答案 0 :(得分:1)
您不能跨上下文共享资源。
您能做的最好的事情就是通过texImage2D
将某一种方法用作另一种方法的源
例如,如果上下文使用的是画布,则将帧缓冲区绘制到画布上,然后
destContext.texImage2D(......., srcContext.canvas);
如果它是OffscreenRenderingContext
,请使用transferToImageBitmap
,然后将生成的位图传递给texImage2D