feature/shadows #25
18
assets/shaders/blur.glsl
Normal file
18
assets/shaders/blur.glsl
Normal file
@ -0,0 +1,18 @@
|
||||
extern vec2 direction; // (1.0, 0.0) для X, (0.0, 1.0) для Y
|
||||
extern number radius; // радиус размытия
|
||||
|
||||
vec4 effect(vec4 vcolor, Image tex, vec2 texture_coords, vec2 screen_coords)
|
||||
{
|
||||
vec4 sum = vec4(0.0);
|
||||
float weightTotal = 0.0;
|
||||
|
||||
for (int i = -10; i <= 10; i++) {
|
||||
float offset = float(i);
|
||||
float weight = exp(-offset * offset / (2.0 * radius * radius));
|
||||
vec2 shift = direction * offset / love_ScreenSize.xy;
|
||||
sum += Texel(tex, texture_coords + shift) * weight;
|
||||
weightTotal += weight;
|
||||
}
|
||||
|
||||
return sum / weightTotal;
|
||||
}
|
||||
@ -72,7 +72,7 @@ function sprite:draw()
|
||||
local mesh = makeGradientMesh(0.4, 1.5, { 0, 0, 0, 0.5 }, { 0, 0, 0, 0 })
|
||||
love.graphics.push()
|
||||
love.graphics.translate(position.x, position.y)
|
||||
love.graphics.rotate(-3 * math.pi / 4)
|
||||
love.graphics.rotate(love.timer.getTime())
|
||||
love.graphics.translate(-0.2, 0)
|
||||
love.graphics.draw(mesh)
|
||||
love.graphics.pop()
|
||||
|
||||
@ -8,7 +8,7 @@ render.__index = render
|
||||
|
||||
function render:clear()
|
||||
love.graphics.setCanvas(self.shadowLayer)
|
||||
love.graphics.clear(1, 1, 1, 0)
|
||||
love.graphics.clear()
|
||||
love.graphics.setCanvas(self.spriteLayer)
|
||||
love.graphics.clear()
|
||||
love.graphics.setCanvas(self.floorLayer)
|
||||
@ -17,13 +17,37 @@ function render:clear()
|
||||
love.graphics.clear()
|
||||
end
|
||||
|
||||
local function applyBlur(input, radius)
|
||||
local blurShader = Tree.assets.files.shaders.blur
|
||||
local tmp = love.graphics.newCanvas(1280, 720)
|
||||
|
||||
-- Горизонтальный проход
|
||||
blurShader:send("direction", { 1.0, 0.0 })
|
||||
blurShader:send("radius", radius)
|
||||
|
||||
tmp:renderTo(function()
|
||||
love.graphics.setShader(blurShader)
|
||||
love.graphics.draw(input)
|
||||
love.graphics.setShader()
|
||||
end)
|
||||
|
||||
-- Вертикальный проход
|
||||
love.graphics.setShader(blurShader)
|
||||
blurShader:send("direction", { 0.0, 1.0 })
|
||||
love.graphics.draw(tmp)
|
||||
love.graphics.setShader()
|
||||
end
|
||||
|
||||
function render:draw()
|
||||
-- пол -> тени -> спрайты -> оверлей
|
||||
love.graphics.draw(self.floorLayer)
|
||||
love.graphics.setBlendMode("multiply", "premultiplied")
|
||||
love.graphics.draw(self.shadowLayer)
|
||||
love.graphics.setBlendMode("alpha")
|
||||
|
||||
applyBlur(self.shadowLayer, 10)
|
||||
-- love.graphics.draw(self.shadowLayer)
|
||||
love.graphics.setShader()
|
||||
|
||||
love.graphics.draw(self.spriteLayer)
|
||||
|
||||
love.graphics.draw(self.overlayLayer)
|
||||
end
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user