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
相关产品推荐
相关产品推荐

