将帧缓冲数据从一个WebGLRenderingContext复制到另一个?

时间:2019-05-09 16:16:57

标签: webgl unity-webgl webgl2 webxr

如果以下内容没有多大意义,请参考下面的背景部分,为了使问题尽可能清楚,我省略了大部分上下文。

我有两个具有以下特征的WebGLRenderingContext:

  • WebGLRenderingContext: InputGL (允许对其帧缓冲区进行读写操作。)
  • WebGLRenderingContext: OutputGL (允许仅在其帧缓冲区上写操作。)

目标:在移动设备上的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。

1 个答案:

答案 0 :(得分:1)

您不能跨上下文共享资源。

您能做的最好的事情就是通过texImage2D将某一种方法用作另一种方法的源

例如,如果上下文使用的是画布,则将帧缓冲区绘制到画布上,然后

destContext.texImage2D(......., srcContext.canvas);

如果它是OffscreenRenderingContext,请使用transferToImageBitmap,然后将生成的位图传递给texImage2D