-- Shader test 03 -- raster scroll modoki function love.load() love.graphics.setDefaultFilter("nearest", "nearest") scr_w, scr_h = 640, 480 canvas = love.graphics.newCanvas(scr_w, scr_h) -- load image img = love.graphics.newImage("bg_1024x1024.png") -- make shader myshader = love.graphics.newShader( [[ extern number ang; extern vec2 scrSize; extern vec2 r; extern vec2 curve; extern vec2 basePos; vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords ){ number factor_x = radians(r.x * (screen_coords.x / scrSize.x)); number factor_y = radians(r.y * (screen_coords.y / scrSize.y)); vec2 uv = texture_coords; uv.x = mod(-basePos.x + uv.x - curve.x * sin(ang + factor_y), 1.0); uv.y = mod(-basePos.y + uv.y - curve.y * sin(ang + factor_x), 1.0); vec4 pixel = Texel(texture, uv); return pixel * color; } ]] ) myshader:send("scrSize", {scr_w, scr_h}) myshader:send("r", {360.0 * 1.5, 360.0 * 1.5}) myshader:send("curve", {0.02, 0.02}) myshader:send("basePos", {0.0, 0.0}) angle = 0 bx = 0 by = 0 end function love.update(dt) bx = (bx + (64 / scr_w) * dt) % 1.0 by = (by + (64 / scr_h) * dt) % 1.0 myshader:send("basePos", {bx, by}) angle = (angle + 180 * dt) % 360.0 myshader:send("ang", math.rad(angle)) px = (scr_w - img:getWidth()) / 2 py = (scr_h - img:getHeight()) / 2 end function love.draw() love.graphics.setCanvas(canvas) love.graphics.clear(0, 0, 0, 255) love.graphics.setShader(myshader) love.graphics.setColor(255, 255, 255) love.graphics.draw(img, px, py) love.graphics.setShader() love.graphics.setCanvas() -- draw canvas to window wdw_w, wdw_h = love.graphics.getDimensions() scr_scale = math.min((wdw_w / scr_w), (wdw_h / scr_h)) scr_ofsx = (wdw_w - (scr_w * scr_scale)) / 2 scr_ofsy = (wdw_h - (scr_h * scr_scale)) / 2 love.graphics.setColor(255, 255, 255) love.graphics.draw(canvas, scr_ofsx, scr_ofsy, 0, scr_scale, scr_scale) love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10) end function love.keypressed(key, isrepeat) if key == "escape" then -- ESC to exit love.event.quit() end end