使用演示
实现解析
Godot Shader 代码
glsl
shader_type spatial;
render_mode cull_disabled; //禁用面剔除
uniform float sway = 0.5; //摆动强度
uniform float bent = 0.2; //弯曲幅度
uniform float scale = 0.01; //噪音缩放比例
uniform float time_scale =0.1; //速度
uniform vec3 sway_dir = vec3(1.0,0.0,1.0); //风力方向
uniform float color_scale = 0.04; //颜色强度
uniform vec4 top_color : source_color; //顶部颜色
uniform vec4 bot_color : source_color; //底部颜色
uniform sampler2D sway_noise; //噪音贴图
varying vec3 vert; //储存初始位置
void vertex() //摆动计算
{
vert = VERTEX; //储存初始位置
NORMAL = vec3(0.0, 1.0, 0.0); // 统一法向
vec4 sway_dir_world = vec4(sway_dir, 0.0) * MODEL_MATRIX; // 将风力方向由模型空间转换为世界空间(统一朝向)
vec3 world_vertex = (MODEL_MATRIX * vec4(VERTEX,1.0)).xyz; // 顶点在世界空间的位置(充当 UV)
float curent_wind = texture(sway_noise, world_vertex.xz * scale - TIME * time_scale * sway_dir.xz).x; //根据世界位置采样风力噪声贴图,得到风力值
VERTEX.xz += normalize(sway_dir_world.xz) * sway * curent_wind * VERTEX.y; //根据风力值和高度,在风力方向上偏移顶点位置
VERTEX.y -= VERTEX.y * bent * length(vec2(VERTEX.x, VERTEX.z)); // 根据x轴位置,使顶点上下摆动
}
void fragment() // 颜色和粗糙度计算
{
ALBEDO = mix(bot_color, top_color, clamp(vert.y * color_scale, 0.0, 1.0)).xyz;
NORMAL *= FRONT_FACING ? 1.0 : -1.0; // 是否面朝相机设置法相
}
草的面片模型
模型 在该页面按下 Ctrl + Shift + S 键,即可下载该模型