Texture reduction
Posted: Wed May 24, 2017 11:38 am
Hello,
To continue a very interesting discussion on #love, i present you my attempt of texture reduction.
Thanks to Amadiro, Slime, and z0rg , i've made a lot of progress.
The goal is to reduce a canvas to a more exploitable thing, to do color quantization.
It can be done without shader, but i've been told than with a shader, the results will be more accurate.
I present you my version without custom shader (it uses the default pixel shader of love).
It's just copying pixels of the "big" canvas into a smaller canvas (1/8th of the big canvas).
For keeping the code small, i did not implemented the "color counting" part, but it's just a question of extracting data from canvas with "Canvas:newImageData" and then read the string with getString on the image data.
Here is the code, it's working but it can be done better, so i'm waiting for your comments
To continue a very interesting discussion on #love, i present you my attempt of texture reduction.
Thanks to Amadiro, Slime, and z0rg , i've made a lot of progress.
The goal is to reduce a canvas to a more exploitable thing, to do color quantization.
It can be done without shader, but i've been told than with a shader, the results will be more accurate.
I present you my version without custom shader (it uses the default pixel shader of love).
It's just copying pixels of the "big" canvas into a smaller canvas (1/8th of the big canvas).
For keeping the code small, i did not implemented the "color counting" part, but it's just a question of extracting data from canvas with "Canvas:newImageData" and then read the string with getString on the image data.
Here is the code, it's working but it can be done better, so i'm waiting for your comments
Code: Select all
local win_dim = 512
local canvas -- will be 512x512, same as win dimensions
local mini_canvas -- 1/8 of the canvas
local shader_mini_canvas
function love.draw()
mini_canvas:renderTo(
function()
love.graphics.draw(canvas, 0,0, 0, 1/8, 1/8)
end
)
love.graphics.draw(mini_canvas)
end
function love.load()
love.window.setMode(win_dim, win_dim) --a square window
-- now create the big canvas (same dimensions than window)
canvas = love.graphics.newCanvas(win_dim, win_dim)
canvas:renderTo(
function()
local rec_dim = win_dim/2
local colors={ {255,0,0},{0,255,0},{0,0,255}, {255,255,255} }
local pos={ 0,0, rec_dim,0, 0,rec_dim, rec_dim,rec_dim }
for i=1,#colors do
love.graphics.setColor(colors[i])
love.graphics.rectangle("fill", pos[i*2-1], pos[i*2], rec_dim,rec_dim)
end
end
)
mini_canvas = love.graphics.newCanvas(win_dim/8,win_dim/8)
end
function love.keypressed(key, scancode, isrepeated)
if key == "escape" then love.event.quit() end
end