38 lines
1.3 KiB
Plaintext
38 lines
1.3 KiB
Plaintext
shader_type spatial;
|
|
render_mode cull_disabled;
|
|
|
|
uniform vec3 color: source_color;
|
|
uniform vec3 shade: source_color;
|
|
uniform sampler2D noise: source_color;
|
|
uniform float noiseScale = 1.0;
|
|
uniform float windSpeedScale = 1.0;
|
|
uniform float windVertexOffsetScale = 1.0;
|
|
|
|
varying vec3 worldPos;
|
|
varying vec3 instance_origin;
|
|
|
|
void vertex() {
|
|
worldPos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
|
instance_origin = MODELVIEW_MATRIX[3].xyz;
|
|
|
|
vec2 timeOffset = vec2(TIME/windSpeedScale);
|
|
float noiseLevel = texture(noise, timeOffset + worldPos.xz/noiseScale).r;
|
|
float vertexWindOffset = noiseLevel * worldPos.y * windVertexOffsetScale;
|
|
VERTEX += vec3(1.0, 0.0, 1.0)*vertexWindOffset;
|
|
// billboarding
|
|
// MODELVIEW_MATRIX = VIEW_MATRIX * mat4(INV_VIEW_MATRIX[0],INV_VIEW_MATRIX[1],INV_VIEW_MATRIX[2],MODEL_MATRIX[3]);
|
|
}
|
|
|
|
void fragment() {
|
|
vec2 timeOffset = vec2(TIME/windSpeedScale);
|
|
float noiseLevel = texture(noise, timeOffset + worldPos.xz/noiseScale).r;
|
|
NORMAL = (VIEW_MATRIX * vec4(0.0, 1.0, 0.0, 0.0)).xyz;
|
|
ALBEDO = mix(color, shade, UV.y) * mix(color, shade, noiseLevel);
|
|
LIGHT_VERTEX = instance_origin;
|
|
}
|
|
|
|
void light() {
|
|
float lambert = clamp(dot(NORMAL, LIGHT), 0.0, 1.0);
|
|
float halfLambert = pow(lambert*0.5 + 0.5, 5);
|
|
DIFFUSE_LIGHT += halfLambert * ATTENUATION * LIGHT_COLOR / PI;
|
|
} |