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

wgpu-rs运行触发panic:`Texture[1] does not exist` 如何解决?

问题原因
  • 核心原因是SurfaceFrame的生命周期提前结束,导致其持有的屏幕纹理被提前释放。你当前的代码里直接通过链式调用self.surface.get_current_frame()?.output.texture.create_view(...),没有将get_current_frame()返回的SurfaceFrame实例绑定到变量持有,链式调用结束后临时的SurfaceFrame对象会被自动销毁,其内部的纹理资源也会被回收,后续创建的TextureView就指向了已不存在的纹理资源,触发panic。
  • 补充:你代码中的begin_render_pas存在笔误,正确拼写应为begin_render_pass,该问题会导致编译失败,不属于本次运行时panic的诱因。
修复方案

修改代码,将SurfaceFrame绑定到变量持有,保证在命令提交完成前SurfaceFrame不会被销毁,参考修改后的代码:

// 先获取SurfaceFrame并持有,避免提前释放
let frame = self.surface.get_current_frame()?;
let texture_view = frame
    .output
    .texture
    .create_view(&wgpu::TextureViewDescriptor::default());

// 再创建命令编码器(顺序也可以调整,只要保证frame在提交前有效即可)
let mut encoder = self.device.create_command_encoder(...);

let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
    color_attachments: &[wgpu::RenderPassColorAttachment { 
        view: &texture_view,
        resolve_target: None,
        ops: wgpu::Operations {
            load: wgpu::LoadOp::Clear(wgpu::Color::BLACK),
            store: true,
        }
    }],
    depth_stencil_attachment: None,
});

render_pass.set_/* pipeline, bind_group, vertex_buffer, index_buffer */(...);  
render_pass.draw_indexed(...);
// 手动drop render_pass,避免encoder.finish()时出现资源借用冲突
drop(render_pass);

self.queue.submit(std::iter::once(encoder.finish()));
// frame变量在此处作用域结束才会被销毁,保证纹理在整个渲染流程中有效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:45:03