【问题标题】:Copy framebuffer data from one WebGLRenderingContext to another?将帧缓冲区数据从一个 WebGLRenderingContext 复制到另一个?
【发布时间】:2019-09-27 12:58:24
【问题描述】:

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

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

  • 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。

【问题讨论】:

    标签: webgl unity-webgl webgl2 webxr


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 2014-01-27
      相关资源
      最近更新 更多