Last active
January 21, 2021 01:52
-
-
Save jordanlis/7d21abf8857a465ac48126a8425f7f7a to your computer and use it in GitHub Desktop.
godot 2D wind shader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// original wind shader from https://github.com/Maujoe/godot-simple-wind-shader-2d/tree/master/assets/maujoe.simple_wind_shader_2d | |
// original script modified by HungryProton so that the assets are moving differently : https://pastebin.com/VL3AfV8D | |
// | |
// speed - The speed of the wind movement. | |
// minStrength - The minimal strength of the wind movement. | |
// maxStrength - The maximal strength of the wind movement. | |
// strengthScale - Scalefactor for the wind strength. | |
// interval - The time between minimal and maximal strength changes. | |
// detail - The detail (number of waves) of the wind movement. | |
// distortion - The strength of geometry distortion. | |
// heightOffset - The height where the wind begins to move. By default 0.0. | |
shader_type canvas_item; | |
render_mode blend_mix; | |
// Wind settings. | |
uniform float speed = 1.0; | |
uniform float minStrength : hint_range(0.0, 1.0); | |
uniform float maxStrength : hint_range(0.0, 1.0); | |
uniform float strengthScale = 100.0; | |
uniform float interval = 3.5; | |
uniform float detail = 1.0; | |
uniform float distortion : hint_range(0.0, 1.0); | |
uniform float heightOffset : hint_range(0.0, 1.0); | |
// With the offset value, you can if you want different moves for each asset. Just put a random value (1, 2, 3) in the editor. Don't forget to mark the material as unique if you use this | |
uniform float offset = 0; | |
float getWind(vec2 vertex, vec2 uv, float time){ | |
float diff = pow(maxStrength - minStrength, 2.0); | |
float strength = clamp(minStrength + diff + sin(time / interval) * diff, minStrength, maxStrength) * strengthScale; | |
float wind = (sin(time) + cos(time * detail)) * strength * max(0.0, (1.0-uv.y) - heightOffset); | |
return wind; | |
} | |
void vertex() { | |
vec4 pos = WORLD_MATRIX * vec4(0.0, 0.0, 0.0, 1.0); | |
float time = TIME * speed + offset; | |
//float time = TIME * speed + pos.x * pos.y ; not working when moving... | |
VERTEX.x += getWind(VERTEX.xy, UV, time); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In game example