add simple cone shadows (blurred)

This commit is contained in:
PeaAshMeter 2025-12-27 04:37:32 +03:00
parent b259aa3839
commit 0c1332afb3
3 changed files with 47 additions and 5 deletions

18
assets/shaders/blur.glsl Normal file
View 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;
}

View File

@ -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()

View File

@ -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