0

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

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

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

目标:在移动设备上,在 33 毫秒 (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。

4

1 回答 1

2

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

您可以做的最好的事情是通过某种方法使用一种方法作为另一种方法的来源texImage2D

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

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

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

于 2019-05-09T16:27:33.100 回答