Skip to content

小结与练习

小结

这一章从零搭建了 Bevy 自定义材质的完整链路:

  • WGSL 是 Bevy 的默认着色器语言。#import 机制让你复用 Bevy 内置的着色器模块;@group / @binding 声明资源绑定点;#{MATERIAL_BIND_GROUP} 宏自动替换为正确的绑定组索引
  • Material trait 是自定义材质的入口。AsBindGroup derive 宏把 Rust 结构体映射为 GPU 绑定组;fragment_shader()vertex_shader() 指向着色器代码;alpha_mode()specialize() 等方法控制渲染行为
  • #[uniform(N)]ShaderType 结构体传给着色器作为 uniform buffer;#[texture(N)] / #[sampler(N)] 绑定纹理和采样器;对齐规则要求手动补齐 padding
  • Shader defs 通过 #[bind_group_data] + specialize() 实现管线特化,在着色器侧用 #ifdef 条件编译——编译期决定,运行时无分支开销
  • 热重载在开发阶段提供秒级反馈:修改 .wgsl 文件,保存,效果即时更新
  • 溶解效果综合运用了所有知识:ShaderType uniform 驱动动画、哈希噪声生成随机图案、discard 丢弃像素、边缘发光混合

练习

  1. 渐变材质:写一个自定义材质,用 UV 坐标的 y 分量在两种颜色之间做线性插值。提示:在 WGSL 里用 mix(color_a, color_b, mesh.uv.y)

  2. 顶点位移:自定义顶点着色器,让球体的顶点沿法线方向做正弦位移(波浪效果)。提示:用 globals.time 驱动位移幅度,vertex.normal 作为位移方向。

  3. 多纹理混合:材质绑定两张纹理和一个 blend_factor: f32 uniform,在着色器里按比例混合两张纹理。每帧用系统修改 blend_factor,实现渐变切换效果。

  4. 扫描线效果:基于溶解效果改造——不是随机噪声,而是用 UV 的 y 分量和 globals.time 做一个从下到上的扫描线,扫描线经过的地方颜色高亮。提示:abs(mesh.uv.y - fract(globals.time * 0.2)) 可以得到一条移动的线。