From f183686463f70124b901b5c5c1904a0243b6bddf Mon Sep 17 00:00:00 2001 From: MrZ626 <1046101471@qq.com> Date: Thu, 27 May 2021 15:48:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zframework/light/init.lua | 61 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/Zframework/light/init.lua b/Zframework/light/init.lua index 9ba5d690..b74d1acb 100644 --- a/Zframework/light/init.lua +++ b/Zframework/light/init.lua @@ -2,9 +2,9 @@ --Heavily based on mattdesl's libGDX implementation: --https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows local gc=love.graphics -local clear,translate=gc.clear,gc.translate -local setCanvas,setShader=gc.setCanvas,gc.setShader -local render=gc.draw +local clear,gc_translate=gc.clear,gc.translate +local gc_setCanvas,gc_setShader=gc.setCanvas,gc.setShader +local gc_setColor,gc_draw=gc.setColor,gc.draw local shadowMapShader=gc.newShader("Zframework/light/shadowMap.glsl")--Shader for caculating the 1D shadow map. local lightRenderShader=gc.newShader("Zframework/light/lightRender.glsl")--Shader for rendering blurred lights and shadows. @@ -15,45 +15,40 @@ end local function setPow(L,pow) L.size=pow end -local function destroy(L) - L.blackCanvas:release() - L.shadowCanvas:release() - L.renderCanvas:release() -end -local function draw(L) +local function drawLight(L) + local s=L.size + --Initialization - local r,g,b,a=gc.getColor() - setCanvas(L.blackCanvas)clear() - setCanvas(L.shadowCanvas)clear() - setCanvas(L.renderCanvas)clear() - lightRenderShader:send("xresolution",L.size) - shadowMapShader:send("yresolution",L.size) + gc_setCanvas(L.blackCanvas)clear() + gc_setCanvas(L.shadowCanvas)clear() + gc_setCanvas(L.renderCanvas)clear() + lightRenderShader:send("xresolution",s) + shadowMapShader:send("yresolution",s) --Get up-left of light - local X=L.x-L.size*.5 - local Y=L.y-L.size*.5 + local X=L.x-s*.5 + local Y=L.y-s*.5 --Render solid - translate(-X,-Y) + gc_translate(-X,-Y) L.blackCanvas:renderTo(L.blackFn) - translate(X,Y) + gc_translate(X,Y) --Render shade canvas by solid - setShader(shadowMapShader) - setCanvas(L.shadowCanvas) - render(L.blackCanvas) + gc_setShader(shadowMapShader) + gc_setCanvas(L.shadowCanvas) + gc_draw(L.blackCanvas) --Render light canvas by shade - setShader(lightRenderShader) - setCanvas(L.renderCanvas) - render(L.shadowCanvas,0,0,0,1,L.size) + gc_setShader(lightRenderShader) + gc_setCanvas(L.renderCanvas) + gc_draw(L.shadowCanvas,0,0,0,1,s) --Ready to final render - setShader()setCanvas()gc.setBlendMode('add') + gc_setShader()gc_setCanvas()gc.setBlendMode('add') - --Render to screes - gc.setColor(r,g,b,a) - render(L.renderCanvas,X,Y+L.size,0,1,-1) + --Render to screen + gc_draw(L.renderCanvas,X,Y+s,0,1,-1) --Reset gc.setBlendMode('alpha') @@ -61,13 +56,16 @@ end local LIGHT={} function LIGHT.draw() + gc_setColor(1,1,1) for i=1,#Lights do - draw(Lights[i]) + drawLight(Lights[i]) end end function LIGHT.clear() for i=#Lights,1,-1 do - Lights[i]:destroy() + Lights[i].blackCanvas:release() + Lights[i].shadowCanvas:release() + Lights[i].renderCanvas:release() Lights[i]=nil end end @@ -83,7 +81,6 @@ function LIGHT.add(x,y,radius,solidFunc) move=move, setPow=setPow, - destroy=destroy, } end return LIGHT \ No newline at end of file