自定义 Material 与 Shader
前面的章节里,你一直在用 StandardMaterial——它是 Bevy 为 PBR 渲染预制的"万能材质"。颜色、金属度、法线贴图、透明度,全靠它一个结构体搞定。但总有些效果是 PBR 公式给不了的:卡通着色、溶解消失、扫描线、全息投影……这时候你需要自己写 Shader,自己定义 Material。
这一章你会从零搭建一个自定义材质的完整链路:用 Rust 结构体描述 GPU 数据布局,用 WGSL 编写着色器程序,把两者通过 Material trait 对接起来。最后用一个溶解特效把所有知识点串在一起。
本章的配套代码在 code/ch36-shaders。各阶段版本这样运行:
console
cargo run -p ch36-shaders --example listing-36-01 # 最简材质
cargo run -p ch36-shaders --example listing-36-02 # 自定义顶点着色器
cargo run -p ch36-shaders # 最终版:溶解效果本章内容:
- WGSL 入门:着色器语言基础、Bevy 的 Shader 模块系统、
VertexOutput的结构 - Material trait:自定义材质:
AsBindGroup、#[uniform]、MaterialPlugin,以及最简材质的完整实现 - ShaderType 与 Uniform:向 Shader 传递复杂结构化数据;在 Rust 侧每帧更新 uniform
- 纹理与采样器:在自定义材质中绑定纹理和采样器;shader_defs 条件编译
- 热重载:修改 WGSL 文件即时看到效果,无需重启应用
- 综合案例:溶解效果:噪声函数、阈值动画、边缘发光——把本章所有知识融为一体
- 小结与练习
0.19 模块化变更:
Shader资产和ShaderRef现在由独立的bevy_shadercrate 提供;材质抽象层(AlphaMode、绑定组布局、特化函数)现在由独立的bevy_materialcrate 承载。这些类型此前分散在bevy_render和bevy_pbr中,拆分后提升了模块化程度。详见 Material trait 一节末尾的说明。