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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:14:52