Bevy 0.13.2实现3D像素化渲染时片段着色器运行报错
解决Bevy 0.13.2中像素化后处理的wgpu验证错误
问题原因
Bevy的Material2d系统会自动在组0的绑定0添加内置的模型变换uniform(ModelUniform),你手动指定的#[uniform(0)]和这个内置绑定冲突,导致绑定编号错位:原本应该分配给纹理的绑定1被你的uniform buffer占用,着色器中期望的texture_2d类型与管线布局中的Buffer类型不匹配,触发了wgpu验证错误。
解决方案
将自定义材质的所有绑定移到单独的绑定组(比如组1),避免和内置绑定冲突:
修改Rust端材质定义
#[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] pub struct PostProcessingMaterial { #[uniform(0)] #[bind_group(1)] // 指定自定义绑定到组1 pixel_size: f32, #[texture(1)] #[sampler(2)] #[bind_group(1)] // 纹理和采样器也放到组1 source_image: Handle<Image>, } // 其余setup等代码保持不变
修改WGSL着色器绑定
调整着色器中的绑定组编号,与Rust端对应:
struct VertexOutput { @location(0) uv: vec2<f32>, @builtin(position) position: vec4<f32>, }; // 绑定组改为1,绑定编号对应调整 @group(1) @binding(0) var<uniform> pixel_size: f32; @group(1) @binding(1) var texture0: texture_2d<f32>; @group(1) @binding(2) var sampler0: sampler; @fragment fn fragment(in: VertexOutput) -> @location(0) vec4<f32> { let uv: vec2<f32> = in.uv; let pixelatedUV: vec2<f32> = vec2<f32>( floor(uv.x * pixel_size) / pixel_size, floor(uv.y * pixel_size) / pixel_size ); let color: vec4<f32> = textureSample(texture0, sampler0, pixelatedUV); return color; }
额外优化建议
- 你创建的图像格式是
Bgra8UnormSrgb(sRGB颜色空间),着色器中纹理类型建议改为texture_2d<f32, srgb>,以正确处理颜色转换:@group(1) @binding(1) var texture0: texture_2d<f32, srgb>; - 确认
RenderImage资源已正确关联到主相机的渲染目标,确保后处理材质能获取到场景的渲染结果。
内容的提问来源于stack exchange,提问作者NewUser69420
相关产品推荐
相关产品推荐

