You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebGL2与WebGPU互操作:如何读取WebGPU创建的纹理或帧缓冲?

WebGPU纹理/帧缓冲转WebGL2使用的可行性与实现步骤

可行性说明

目前基于Chromium的浏览器(如Chrome)已经支持WebGPU与WebGL2之间的纹理共享,你可以将WebGPU创建的纹理或帧缓冲内容导出为WebGL2可直接使用的纹理对象,这和你找到的Chromium相关实现对应。

具体操作步骤

1. 创建符合共享要求的WebGPU纹理

  • 创建WebGPU纹理时,必须在usage参数中包含GPUTextureUsage.RENDER_ATTACHMENT(用于渲染)、GPUTextureUsage.COPY_SRC(用于内容复制)和GPUTextureUsage.EXTERNAL(允许导出到外部API)。
  • 纹理格式需选择WebGL2支持的类型,比如rgba8unorm,同时确保纹理的尺寸、维度(如2D)与WebGL2兼容。
    示例代码:
    const sharedTexture = device.createTexture({
      size: [width, height],
      format: 'rgba8unorm',
      usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC | GPUTextureUsage.EXTERNAL,
    });
    

2. 导出WebGPU纹理为WebGL2可用对象

  • 先获取WebGL2上下文,并启用WEBGL_shared_resources扩展(这是跨API共享的核心依赖):
    const gl = canvas.getContext('webgl2');
    const sharedResourcesExt = gl.getExtension('WEBGL_shared_resources');
    
  • 将WebGPU纹理导出为WebGL2纹理:
    const externalTexture = sharedTexture.getExternalTexture({ type: 'webgl2' });
    const webglTexture = externalTexture.webGLTexture;
    
  • 在WebGL2中绑定该纹理,即可像普通WebGL纹理一样使用:
    gl.bindTexture(gl.TEXTURE_2D, webglTexture);
    // 后续可用于着色器采样等操作
    

3. 从WebGPU帧缓冲复制内容到共享纹理

如果渲染结果直接在WebGPU的帧缓冲(RenderPass)中,需要先将内容复制到上述的共享纹理:

  • 创建命令编码器,执行复制操作:
    const encoder = device.createCommandEncoder();
    encoder.copyRenderPassToTexture(
      { texture: renderPassTexture }, // 源帧缓冲关联的纹理
      { texture: sharedTexture }, // 目标共享纹理
      [width, height, 1]
    );
    device.queue.submit([encoder.finish()]);
    
  • 等待复制完成后,再执行步骤2的导出操作。

4. 关键注意事项

  • 格式匹配:必须使用WebGPU和WebGL2共同支持的纹理格式,避免使用WebGL2不兼容的特殊格式或压缩格式。
  • 浏览器限制:目前仅Chromium系浏览器支持该特性,Firefox、Safari等暂未实现。
  • 生命周期管理:确保WebGPU纹理在WebGL2使用期间不被销毁,否则会导致WebGL纹理失效。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 09:43:09