| | if not love then os.execute "love ." os.exit() end -- https://love2d.org
local app,g={ P=3, CL=8 }, love.graphics
app.pixel_shader=string.format([[
#define CL %d
#define W %d
uniform float noise[W*W];
vec4 effect(vec4 c,Image tex,vec2 uv,vec2 xy){
vec4 p=Texel(tex,uv);
int idx=int(mod(floor(xy.x),W)+W*mod(floor(xy.y),W));
float e=noise[idx]/CL;
vec4 q=p*c+vec4(e,e,e,0);
q=floor(q*CL)/(CL-1);
return q;
}
]],app.CL,2^app.P)
function love.load()
app.shader=g.newShader(app.pixel_shader)
app.shader:send("noise",unpack(gen_noise_table(app.P)))
app.image=g.newImage "OrderedSample.png"
-- app.image=g.newImage "LinRGB2.png"
end
function love.draw()
g.setShader(app.shader) g.draw(app.image,8,8) g.setShader()
g.draw(app.image,8,208)
end
function love.keypressed(key)
if key=='escape' then love.event.quit() end
end
function gen_noise_table(p) -- https://en.wikipedia.org/wiki/Ordered_dithering
local function f(x,y,n) local r=0
for i=1,n do r=r+r+x%2 x=bit.rshift(x,1) r=r+r+y%2 y=bit.rshift(y,1) end
return r
end
local r,n,k = {}, 2^p, 2/(4^p-1)
for y=0,n-1 do for x=0,n-1 do table.insert(r,f(bit.bxor(x,y),y,p)*k-1) end end
return r
end
|