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

