-- Shader test 04 -- palette change 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("colorbar_circle01.png") -- make shader myshader = love.graphics.newShader( [[ extern number factor; extern vec3 checkcolor; extern vec3 replacecolor; vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords ){ vec4 pixel = Texel(texture, texture_coords); if (pixel.r == checkcolor.r && pixel.g == checkcolor.g && pixel.b == checkcolor.b) { pixel.r = pixel.r * (1.0 - factor) + replacecolor.r * factor; pixel.g = pixel.g * (1.0 - factor) + replacecolor.g * factor; pixel.b = pixel.b * (1.0 - factor) + replacecolor.b * factor; } return pixel * color; } ]] ) myshader:send("checkcolor", {0.0, 1.0, 0.0}) -- R,G,B myshader:send("replacecolor", {0.0, 0.0, 0.0}) -- R,G,B angle = 0 end function love.update(dt) angle = (angle + 90 * dt) % 360.0 local v = 1.0 - math.abs(math.sin(math.rad(angle))) myshader:send("factor", v) -- set 0.0 - 1.0 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