Implement something like deferred lighting
This commit is contained in:
@@ -21,6 +21,7 @@ data RenderData = RenderData
|
||||
, _wallTextureShader :: FullShader
|
||||
, _textureArrayShader :: FullShader
|
||||
, _fullscreenShader :: FullShader
|
||||
, _fullLightingShader :: FullShader
|
||||
, _fullscreenAlphaHalveShader :: FullShader
|
||||
--, _boxBlurShader :: FullShader
|
||||
, _bloomBlurShader :: FullShader
|
||||
|
||||
+2
-8
@@ -8,7 +8,7 @@ import Dodge.Data
|
||||
import Dodge.Config.Data
|
||||
import Dodge.Base.Window
|
||||
import Dodge.Render.Picture
|
||||
import Dodge.Creature.ShadowBox
|
||||
--import Dodge.Creature.ShadowBox
|
||||
import Geometry
|
||||
import Render
|
||||
import Data.Preload.Render
|
||||
@@ -19,7 +19,7 @@ import Shader.Data
|
||||
import MatrixHelper
|
||||
--import Polyhedra.Data
|
||||
import Polyhedra
|
||||
import Tuple
|
||||
--import Tuple
|
||||
|
||||
import Foreign
|
||||
--import Control.Applicative
|
||||
@@ -220,12 +220,6 @@ doDrawing pdata w = do
|
||||
eTicks <- SDL.ticks
|
||||
return (eTicks - sTicks)
|
||||
|
||||
bindTO :: TextureObject -> IO ()
|
||||
bindTO t = textureBinding Texture2D $= Just t
|
||||
|
||||
bindFBO :: FramebufferObject -> IO ()
|
||||
bindFBO fb = bindFramebuffer Framebuffer $= fb
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- note: currently assume there is only one UBO, we only bind it once at setup
|
||||
bufferUBO :: [Float] -> IO ()
|
||||
|
||||
@@ -23,7 +23,7 @@ sizeFBOs
|
||||
-> IO RenderData
|
||||
sizeFBOs xsize ysize xfull yfull rdata = do
|
||||
resizeRBO (_rboBaseBloom rdata) xsize ysize
|
||||
rdata' <- updateFBOTO2 xsize ysize minMagFilter GL_RGBA8 GL_RGBA16F rdata fboBase
|
||||
rdata' <- updateFBOTO2 xsize ysize linMinMagFilter GL_RGBA8 GL_RGBA16F rdata fboBase
|
||||
>>= flip (foldM (updateFBOTO xsize ysize minMagFilter GL_RGBA8))
|
||||
[fboColor,fboLighting,fboLightingHigh]
|
||||
rdata'' <- foldM (updateFBOTO xsize ysize linMinMagFilter GL_RGBA16F) rdata'
|
||||
@@ -94,6 +94,7 @@ resizeFBOTO2 (fboName,(toOld1,toOld2)) xsize ysize mmfilt inFormat1 inFormat2 =
|
||||
glTexStorage2D GL_TEXTURE_2D 1 inFormat2 xsize' ysize'
|
||||
textureFilter Texture2D $= mmfilt
|
||||
framebufferTexture2D Framebuffer (ColorAttachment 1) Texture2D toName2 0
|
||||
drawBuffers $= [FBOColorAttachment 0,FBOColorAttachment 1]
|
||||
fboStatus <- framebufferStatus Framebuffer
|
||||
putStrLn $ "after resize, framebuffer status:" ++ show fboStatus
|
||||
return (fboName, (toName1,toName2))
|
||||
|
||||
+10
-6
@@ -69,13 +69,13 @@ preloadRender = do
|
||||
>>= addUniforms ["lightPos"]
|
||||
-- 2D draw shaders
|
||||
bslist <- makeShader "dualTwoD/basic" [vert,frag] [3,4] ETriangles
|
||||
aslist <- makeShader "twoD/arc" [vert,frag] [3,4,3] ETriangles
|
||||
eslist <- makeShader "twoD/ellipse" [vert,geom,frag] [3,4] ETriangles
|
||||
bezierQuadShader <- makeShader "twoD/bezierQuad" [vert,frag] [3,4,4] ETriangleStrip
|
||||
cslist <- makeShader "twoD/character" [vert,frag] [3,4,2] ETriangles
|
||||
aslist <- makeShader "dualTwoD/arc" [vert,frag] [3,4,3] ETriangles
|
||||
eslist <- makeShader "dualTwoD/ellipse" [vert,geom,frag] [3,4] ETriangles
|
||||
bezierQuadShader <- makeShader "dualTwoD/bezierQuad" [vert,frag] [3,4,4] ETriangleStrip
|
||||
cslist <- makeShader "dualTwoD/character" [vert,frag] [3,4,2] ETriangles
|
||||
>>= vaddTextureNoFilter "data/texture/charMap.png"
|
||||
-- this should really be a 2d texture array
|
||||
basicTweakZShad <- makeShader "twoD/basicTweakZ" [vert,frag] [4,4] ETriangles
|
||||
basicTweakZShad <- makeShader "dualTwoD/basicTweakZ" [vert,frag] [4,4] ETriangles
|
||||
-- fullscreen shaders
|
||||
fullscreenAlphaHalveShad <- makeShaderSized "fullscreen/alphaHalve" [vert,frag] [2] 4 ETriangleStrip
|
||||
pokeArray (shadVBOptr fullscreenAlphaHalveShad) $ concat cornerListNoCoord
|
||||
@@ -83,9 +83,12 @@ preloadRender = do
|
||||
fsShad <- makeShaderSized "texture/simple" [vert,frag] [2,2] 4 ETriangleStrip
|
||||
-- note we directly poke the shader vertex data here
|
||||
pokeArray (shadVBOptr fsShad) $ concat cornerList
|
||||
|
||||
bloomBlurShad <- makeShaderUsingShaderVAO "texture/bloomBlur" [vert,frag] ETriangleStrip fsShad
|
||||
colorBlurShad <- makeShaderUsingShaderVAO "texture/colorBlur" [vert,frag] ETriangleStrip fsShad
|
||||
grayscaleShad <- makeShaderUsingShaderVAO "texture/grayscale" [vert,frag] ETriangleStrip fsShad
|
||||
fullLightingShad <- makeShaderUsingShaderVAO "lighting/texture" [vert,frag] ETriangleStrip fsShad
|
||||
>>= addUniforms ["lightPos","lumRad"]
|
||||
barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints
|
||||
-- blank wallShader
|
||||
wlBlank <- makeShader "wall/blank" [vert,geom,frag] [4,4] EPoints
|
||||
@@ -93,7 +96,7 @@ preloadRender = do
|
||||
wlTexture <- makeShader "wall/texture" [vert,geom,frag] [4,4] EPoints
|
||||
>>= addTexture "data/texture/grayscaleDirt.png"
|
||||
---- texture array shader
|
||||
textArrayShad <- makeShader "texture/array" [vert,frag] [3,3] ETriangles
|
||||
textArrayShad <- makeShader "texture/arrayPos" [vert,frag] [3,3] ETriangles
|
||||
>>= addTextureArray "data/texture/ayene_wooden_floor_transformed.png"
|
||||
-- >>= addTextureArray "data/texture/ayene_wooden_floor.png"
|
||||
-- bind fixed vertex data
|
||||
@@ -147,6 +150,7 @@ preloadRender = do
|
||||
, _wallTextureShader = wlTexture { _shaderVAO = wpColVAO }
|
||||
, _textureArrayShader = textArrayShad
|
||||
, _fullscreenShader = fsShad
|
||||
, _fullLightingShader = fullLightingShad
|
||||
, _fullscreenAlphaHalveShader = fullscreenAlphaHalveShad
|
||||
, _bloomBlurShader = bloomBlurShad
|
||||
, _colorBlurShader = colorBlurShad
|
||||
|
||||
+36
-16
@@ -95,28 +95,41 @@ createLightMap pdata lightPoints nWalls nSils nsurfVs = do
|
||||
drawShader (_lightingCapShader pdata) (nSils - 6)
|
||||
-- depthClamp $= Disabled
|
||||
|
||||
-- use Lequal to redraw surfaces above already drawn surfaces
|
||||
depthFunc $= Just Lequal
|
||||
-- draw geometry surfaces
|
||||
--cullFace $= Just Back
|
||||
depthFunc $= Just Always
|
||||
cullFace $= Nothing
|
||||
--colorMask $= Color4 Disabled Disabled Disabled Enabled
|
||||
bindTO $ snd $ snd $ _fboBase pdata
|
||||
colorMask $= Color4 Enabled Enabled Enabled Enabled
|
||||
stencilOp $= (OpKeep,OpKeep,OpKeep)
|
||||
stencilFunc $= (Equal, 0, 255)
|
||||
currentProgram $= Just (_shaderProgram $ _lightingSurfaceShader pdata)
|
||||
uniform (head $ _shaderCustomUnis $ _lightingSurfaceShader pdata)
|
||||
currentProgram $= Just (_shaderProgram $ _fullLightingShader pdata)
|
||||
uniform (head $ _shaderCustomUnis $ _fullLightingShader pdata)
|
||||
$= Vector3 x y z
|
||||
uniform (_shaderCustomUnis (_lightingSurfaceShader pdata) !! 1)
|
||||
uniform (_shaderCustomUnis (_fullLightingShader pdata) !! 1)
|
||||
$= Vector4 r g b rad
|
||||
drawShader (_lightingSurfaceShader pdata) nsurfVs
|
||||
-- draw wall light "circles"
|
||||
currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata)
|
||||
uniform (head $ _shaderCustomUnis $ _lightingWallShader pdata)
|
||||
$= Vector3 x y z
|
||||
uniform (_shaderCustomUnis (_lightingWallShader pdata) !! 1)
|
||||
$= Vector4 r g b rad
|
||||
drawShader (_lightingWallShader pdata) nWalls
|
||||
drawShader (_fullLightingShader pdata) 4
|
||||
|
||||
-- -- use Lequal to redraw surfaces above already drawn surfaces
|
||||
-- depthFunc $= Just Lequal
|
||||
-- -- draw geometry surfaces
|
||||
-- --cullFace $= Just Back
|
||||
-- cullFace $= Nothing
|
||||
-- --colorMask $= Color4 Disabled Disabled Disabled Enabled
|
||||
-- colorMask $= Color4 Enabled Enabled Enabled Enabled
|
||||
-- stencilOp $= (OpKeep,OpKeep,OpKeep)
|
||||
-- stencilFunc $= (Equal, 0, 255)
|
||||
-- currentProgram $= Just (_shaderProgram $ _lightingSurfaceShader pdata)
|
||||
-- uniform (head $ _shaderCustomUnis $ _lightingSurfaceShader pdata)
|
||||
-- $= Vector3 x y z
|
||||
-- uniform (_shaderCustomUnis (_lightingSurfaceShader pdata) !! 1)
|
||||
-- $= Vector4 r g b rad
|
||||
-- drawShader (_lightingSurfaceShader pdata) nsurfVs
|
||||
-- -- draw wall light "circles"
|
||||
-- currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata)
|
||||
-- uniform (head $ _shaderCustomUnis $ _lightingWallShader pdata)
|
||||
-- $= Vector3 x y z
|
||||
-- uniform (_shaderCustomUnis (_lightingWallShader pdata) !! 1)
|
||||
-- $= Vector4 r g b rad
|
||||
-- drawShader (_lightingWallShader pdata) nWalls
|
||||
cullFace $= Nothing
|
||||
stencilTest $= Disabled
|
||||
{- | Blur between two framebuffers.
|
||||
@@ -211,3 +224,10 @@ pokeFourOff ptr n (x,y,z,w) = do
|
||||
pokeElemOff ptr (4*n+1) y
|
||||
pokeElemOff ptr (4*n+2) z
|
||||
pokeElemOff ptr (4*n+3) w
|
||||
|
||||
bindTO :: TextureObject -> IO ()
|
||||
bindTO t = textureBinding Texture2D $= Just t
|
||||
|
||||
bindFBO :: FramebufferObject -> IO ()
|
||||
bindFBO fb = bindFramebuffer Framebuffer $= fb
|
||||
|
||||
|
||||
Reference in New Issue
Block a user