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

Rust wgpu绑定Storage Buffer报错:VERTEX_WRITABLE_STORAGE未启用

解决方案

1. 启用VERTEX_WRITABLE_STORAGE特性

错误核心原因是:你在顶点着色器阶段使用了可写的Storage Buffer,但该特性默认未在wgpu设备中启用,需在创建设备时显式开启:

// 获取adapter后创建device的代码示例
let (device, queue) = adapter.request_device(
    &wgpu::DeviceDescriptor {
        label: None,
        features: wgpu::Features::VERTEX_WRITABLE_STORAGE, // 添加该特性
        limits: wgpu::Limits::default(),
    },
    None,
).await?;

2. 修正Bind Group的Binding不匹配

你的storage_bind_group中设置的binding: 1,但对应的storage_bind_group_layout里的entry是binding: 0,两者必须一致。修改storage_bind_group的entry:

let storage_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
    layout: &storage_bind_group_layout,
    entries: &[
        wgpu::BindGroupEntry {
            binding: 0, // 与layout中的binding保持一致
            resource: storage_buffer.as_entire_binding(),
        }
    ],
});

3. 修正着色器与Bind Group的Group匹配

渲染代码中你将storage_bind_group设置为group 1,但着色器里cellState标注的是@group(0),两者不对应。修改着色器代码:

@group(0) @binding(0) var<uniform> grid: vec4<f32>;
@group(1) @binding(0) var<storage, read_write> cellState: array<u32>; // 修正group为1,binding为0,显式标注读写权限更清晰

4. 补充BufferInitDescriptor的contents字段

create_buffer_init必须提供contents字段来初始化数据,否则会编译报错,补充该字段:

let storage_buffer = device.create_buffer_init(
    &wgpu::util::BufferInitDescriptor {
        label: Some("Storage Buffer"),
        contents: bytemuck::cast_slice(&[0u32; 64]), // 示例数据,根据需求替换
        usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
    }
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:42:07