Skip to content

Instantly share code, notes, and snippets.

@lemonad
Created August 31, 2019 15:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lemonad/e4bc757b8ec3c2673279c0914d5c027d to your computer and use it in GitHub Desktop.
Save lemonad/e4bc757b8ec3c2673279c0914d5c027d to your computer and use it in GitHub Desktop.
Love2D shader for waves (very much WIP)
local WIDTH = 800
local HEIGHT = 600
local shader_code = [[
extern vec2 screen_dims;
extern number time;
number pi = atan(1.0) * 4.0;
vec4 effect(vec4 color, Image image, vec2 uvs, vec2 screen_coords) {
vec2 screen_coords_norm = vec2(
screen_coords.x / screen_dims.x,
screen_coords.y / screen_dims.y
);
number y = 40 + sin(4.18 + 1.9 * time + pi * 8.3 * screen_coords_norm.x) * 10 +
sin(screen_coords_norm.x * pi + time * 0.5) * cos(1.33 + pi * screen_coords_norm.x + pi * 0.7 * time) * 5;
number y2 = 33 + y + sin(3.58 + 1.6 * time + pi * 5.2 * screen_coords_norm.x) * 11 +
sin(time * 0.9) * cos(2.33 + pi * screen_coords_norm.x + pi * 1.9 * time) * 6;
number y3 = 37 + y2 + sin(1.88 + 1.7 * time + pi * 6.5 * screen_coords_norm.x) * 12 +
sin(time * 0.95) * cos(2.33 + pi * 2 * screen_coords_norm.x + pi * 1.2 * time) * 8;
number y4 = 38 + y3 + sin(9.66 + 1.4 * time + pi * 5.1 * screen_coords_norm.x) * 10 +
sin(time) * cos(5.33 + pi * 2 * screen_coords_norm.x + pi * 1.2 * time) * 12;
number y5 = 44 + y4 + sin(1.66 + 2.4 * time + pi * 3.9 * screen_coords_norm.x) * 8 +
sin(time * 0.8) * cos(1.88 + pi * 2.3 * screen_coords_norm.x + pi * 1.9 * time) * 11;
number y6 = 37 + y5 + sin(2.11 + 3.0 * time + pi * 2.7 * screen_coords_norm.x) * 5 +
sin(time * 0.82) * cos(6.19 + pi * 3.33 * screen_coords_norm.x + pi * 2.4 * time) * 14;
if (screen_coords.y < screen_dims.y - y6) {
return vec4(0.0, 0.0, 0.6, 1.0);
} else if (screen_coords.y < screen_dims.y - y5) {
return vec4(0.0, 0.0, 0.65, 1.0);
} else if (screen_coords.y < screen_dims.y - y4) {
return vec4(0.0, 0.0, 0.7, 1.0);
} else if (screen_coords.y < screen_dims.y - y3) {
return vec4(0.0, 0.0, 0.75, 1.0);
} else if (screen_coords.y < screen_dims.y - y2) {
return vec4(0.0, 0.0, 0.8, 1.0);
} else if (screen_coords.y < screen_dims.y - y) {
return vec4(0.0, 0.0, 0.85, 1.0);
} else {
return vec4(0.0, 0.0, 0.9, 1.0);
}
}
]]
function love.load()
-- image_data = love.image.newImageData(WIDTH, HEIGHT)
-- image = love.graphics.newImage(image_data)
shader = love.graphics.newShader(shader_code)
end
local t = 0
function love.update(dt)
t = t + dt
shader:send("time", t)
end
function love.draw()
love.graphics.setShader(shader)
shader:send("screen_dims", {
love.graphics.getWidth(),
love.graphics.getHeight()
})
love.graphics.rectangle('fill', 0, 0, WIDTH, HEIGHT)
love.graphics.setShader()
end
function love.keypressed(k)
if k == "r" then love.event.quit "restart" end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment