From dc3faeed638e37ed5f062ee6b8812d42706d8779 Mon Sep 17 00:00:00 2001 From: justin Date: Fri, 10 Mar 2023 09:39:40 +0000 Subject: [PATCH] Cleanup --- shader/lighting/lineShadow.frag | 2 +- src/Data/Preload/Render.hs | 1 + src/Dodge/Data/Config.hs | 5 +- src/Dodge/Render.hs | 9 +-- src/Preload/Render.hs | 46 +++++++------- src/Preload/Update.hs | 2 +- src/Render.hs | 105 ++++++++++++++++++++++++++++---- src/Shader/Data.hs | 14 ++--- 8 files changed, 138 insertions(+), 46 deletions(-) diff --git a/shader/lighting/lineShadow.frag b/shader/lighting/lineShadow.frag index e23c1116d..883591f08 100644 --- a/shader/lighting/lineShadow.frag +++ b/shader/lighting/lineShadow.frag @@ -2,5 +2,5 @@ out vec4 fColor; void main() { - fColor = vec4 (0,0,0,0); +// fColor = vec4 (0,0,0,0); } diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index 831662006..a8904eaad 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -50,6 +50,7 @@ data RenderData = RenderData , _rboBaseBloom :: GLuint -- RenderbufferObject id , _matUBO :: GLuint -- BufferObject id , _isoMatUBO :: GLuint -- BufferObject id + , _lightsUBO :: GLuint -- BufferObject id } makeLenses ''RenderData diff --git a/src/Dodge/Data/Config.hs b/src/Dodge/Data/Config.hs index b1d21e57b..49f1893e7 100644 --- a/src/Dodge/Data/Config.hs +++ b/src/Dodge/Data/Config.hs @@ -85,7 +85,10 @@ data DebugBool data ResFactor = FullRes | HalfRes | QuarterRes deriving (Show, Eq, Ord, Enum, Bounded) -data ObjectShadows = GeoObjShads | CPUObjShads | NoObjShads +data ObjectShadows = GeoObjShads + | InstancingShads + | CPUObjShads + | NoObjShads deriving (Show, Eq, Ord, Enum, Bounded) data RoomClipping = NoRoomClipBoundaries | AllRoomClipBoundaries | IntersectingRoomClipBoundaries diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index 1e7127a8d..ef193b94c 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -95,7 +95,8 @@ doDrawing win pdata u = do (_eboPtr $ _silhouetteEBO pdata) -- set the coordinate uniform ready for drawing elements using world coordinates glBindBufferBase GL_UNIFORM_BUFFER 0 (pdata ^. matUBO) - bufferUBO (pdata ^. matUBO) $ perspectiveMatrixb rot camzoom trans wins viewFroms + withArray (perspectiveMatrixb rot camzoom trans wins viewFroms) $ \ptr -> + glNamedBufferSubData (pdata ^. matUBO) 0 64 ptr setViewportSize (round winx `div` resFact) (round winy `div` resFact) --bindFramebuffer Framebuffer $= fst (_fboBase pdata) glBindFramebuffer GL_FRAMEBUFFER (_unFBO (fst (_fboBase pdata))) @@ -317,9 +318,9 @@ fpsText x = color col $ text $ "ms/frame " ++ show x -------------------------------------------------------------------------------- -- note: currently assume there is only one UBO, we only bind it once at setup -bufferUBO :: GLuint -> [Float] -> IO () -bufferUBO ubo mat = withArray mat $ \ptr -> - glNamedBufferSubData ubo 0 64 ptr +--bufferUBO :: GLuint -> [Float] -> IO () +--bufferUBO ubo mat = withArray mat $ \ptr -> +-- glNamedBufferSubData ubo 0 64 ptr setViewportSize :: Int -> Int -> IO () setViewportSize x y = diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 57d473f54..d8551d954 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -35,7 +35,10 @@ preloadRender = do isoUBO <- mglCreate glCreateBuffers withArray (isoMatrix 0 1 (V2 0 0) (V2 2 2)) $ \ptr -> glNamedBufferStorage isoUBO 64 ptr 0 - glBindBufferBase GL_UNIFORM_BUFFER 1 theUBO + + lightsubo <- mglCreate glCreateBuffers + glNamedBufferData lightsubo 560 nullPtr GL_STREAM_DRAW + glBindBufferBase GL_UNIFORM_BUFFER 1 lightsubo -- setup wall points VBO, VAOs and shaders wpVBOname <- mglCreate glCreateBuffers @@ -127,54 +130,54 @@ preloadRender = do shEdgeVAO = VAO{_vaoName = shEdgeVAOname, _vaoVBO = shVBO} -- lighting shaders lightingWallShadShad <- - makeShaderUsingVAO "lighting/wallShadow" [vert', geom', frag'] EPoints wpVAO + makeShaderUsingVAO "lighting/wallShadow" [vert, geom, frag] EPoints wpVAO >>= addUniforms ["lightPos"] lightingCapShad <- - makeShaderUsingVAO "lighting/cap" [vert', geom', frag'] ETriangles shPosVAO + makeShaderUsingVAO "lighting/cap" [vert, geom] ETriangles shPosVAO >>= addUniforms ["lightPos"] lightingLineShadowShad <- - makeShaderUsingVAO "lighting/lineShadow" [vert', geom', frag'] ELinesAdjacency shEdgeVAO + makeShaderUsingVAO "lighting/lineShadow" [vert, geom] ELinesAdjacency shEdgeVAO >>= addUniforms ["lightPos", "radiusUniform"] -- positional shader - positionalBlankShad <- makeShader "positional/blank" [vert', frag'] [3] ETriangles + positionalBlankShad <- makeShader "positional/blank" [vert, frag] [3] ETriangles -- 2D draw shaders - bslist <- makeShader "dualTwoD/basic" [vert', frag'] [3, 4] ETriangles - bslista <- makeShader "dualTwoD/basic" [vert', frag'] [3, 4] 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 + bslist <- makeShader "dualTwoD/basic" [vert, frag] [3, 4] ETriangles + bslista <- makeShader "dualTwoD/basic" [vert, frag] [3, 4] 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 + makeShader "dualTwoD/character" [vert, frag] [3, 4, 2] ETriangles >>= vaddTextureNoFilter "data/texture/charMap.png" -- this should really be a 2d texture array - basicTweakZShad <- makeShader "dualTwoD/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 -- texture shaders, no textures attached - fsShad <- makeShaderSized "texture/simple" [vert', frag'] [2, 2] 4 ETriangleStrip + fsShad <- makeShaderSized "texture/simple" [vert, frag] [2, 2] 4 ETriangleStrip -- note we directly poke the shader vertex data here -- could possibly use an indirect draw call pokeArray (shadVBOptr' fsShad) $ concat cornerList let fsshadvao = fsShad ^. shadVAO' - bloomBlurShad <- makeShaderUsingVAO "texture/bloomBlur" [vert', frag'] ETriangleStrip fsshadvao - colorBlurShad <- makeShaderUsingVAO "texture/colorBlur" [vert', frag'] ETriangleStrip fsshadvao - grayscaleShad <- makeShaderUsingVAO "texture/grayscale" [vert', frag'] ETriangleStrip fsshadvao + bloomBlurShad <- makeShaderUsingVAO "texture/bloomBlur" [vert, frag] ETriangleStrip fsshadvao + colorBlurShad <- makeShaderUsingVAO "texture/colorBlur" [vert, frag] ETriangleStrip fsshadvao + grayscaleShad <- makeShaderUsingVAO "texture/grayscale" [vert, frag] ETriangleStrip fsshadvao lightingTextureShad <- - makeShaderUsingVAO "lighting/texture" [vert', frag'] ETriangleStrip fsshadvao + makeShaderUsingVAO "lighting/texture" [vert, frag] ETriangleStrip fsshadvao >>= addUniforms ["lightPos", "lumRad"] - barrelShad <- makeShader "texture/barrel" [vert', geom', frag'] [2, 2, 2, 1] EPoints + barrelShad <- makeShader "texture/barrel" [vert, geom, frag] [2, 2, 2, 1] EPoints -- blank wallShader - wallBlankShad <- makeShaderUsingVAO "wall/blank" [vert', geom', frag'] EPoints wpColVAO + wallBlankShad <- makeShaderUsingVAO "wall/blank" [vert, geom, frag] EPoints wpColVAO -- textured wallShader wallTextureShad <- - makeShaderUsingVAO "wall/texture" [vert', geom', frag'] EPoints wpColVAO + makeShaderUsingVAO "wall/texture" [vert, geom, frag] EPoints wpColVAO >>= addTexture "data/texture/grayscaleDirt.png" ---- texture array shader textArrayShad <- - makeShader "texture/arrayPos" [vert', frag'] [3, 3] ETriangles + 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 @@ -257,6 +260,7 @@ preloadRender = do , _rboBaseBloom = rboBaseBloomName , _matUBO = theUBO , _isoMatUBO = isoUBO + , _lightsUBO = lightsubo } --------------------end preloadRender diff --git a/src/Preload/Update.hs b/src/Preload/Update.hs index 1e1777527..b3405d227 100644 --- a/src/Preload/Update.hs +++ b/src/Preload/Update.hs @@ -50,7 +50,7 @@ renderDataResizeUpdate xsize ysize xfull yfull rdata = do bbShad <- makeByteStringShaderUsingVAO "bloomBlur" - [(vert', bbVert), (frag', bbFrag')] + [(vert, bbVert), (frag, bbFrag')] ETriangleStrip (rdata ^. fullscreenShader . shadVAO') return (rdata'{_bloomBlurShader = bbShad}) diff --git a/src/Render.hs b/src/Render.hs index 679fd1760..8e466c378 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -42,7 +42,9 @@ createLightMap :: TO -> (Point3 -> Float -> IO ()) -> -- attempt at drawing shadow not using geo shader IO () -createLightMap pdata lightPoints nWalls nSils nCaps drawObjShads toPos drawCPUShadows = do +createLightMap pdata lightPoints nWalls nSils nCaps shadsdrawtype toPos drawCPUShadows = case shadsdrawtype of + InstancingShads -> instanceLightMap pdata lightPoints nWalls nSils nCaps toPos + _ -> do let llinesShad = _lightingLineShadowShader pdata lcapShad = _lightingCapShader pdata lwallShad = _lightingWallShadShader pdata @@ -85,16 +87,12 @@ createLightMap pdata lightPoints nWalls nSils nCaps drawObjShads toPos drawCPUSh (marshalEPrimitiveMode $ _shadPrim' lwallShad) 0 (fromIntegral nWalls) - case drawObjShads of + case shadsdrawtype of GeoObjShads -> do --draw silhouette shadows - --currentProgram $= Just (_shadProg llinesShad) - --uniform (_shadUnis llinesShad V.! 0) $= Vector3 x y z - --uniform (_shadUnis llinesShad V.! 1) $= rad glUseProgram (_shadProg' llinesShad) glUniform3f (_shadUnis' llinesShad V.! 0) x y z glUniform1f (_shadUnis' llinesShad V.! 1) rad - --bindVertexArrayObject $= Just (_vaoName $ _shadVAO' llinesShad) glBindVertexArray (_vaoName $ _shadVAO' llinesShad) glDrawElements (marshalEPrimitiveMode $ _shadPrim' llinesShad) @@ -104,12 +102,8 @@ createLightMap pdata lightPoints nWalls nSils nCaps drawObjShads toPos drawCPUSh --draw caps on the near plane as required glEnable GL_CULL_FACE glCullFace GL_BACK - --cullFace $= Just Back - --currentProgram $= Just (_shadProg lcapShad) - --uniform (_shadUnis lcapShad V.! 0) $= Vector3 x y z glUseProgram (_shadProg' lcapShad) glUniform3f (_shadUnis' lcapShad V.! 0) x y z - --bindVertexArrayObject $= lcapShad ^? shadVAO' . vaoName --Just (_vao $ _shadVAO lcapShad) glBindVertexArray $ lcapShad ^. shadVAO' . vaoName --Just (_vao $ _shadVAO lcapShad) glDrawElements (marshalEPrimitiveMode $ _shadPrim' lcapShad) @@ -117,7 +111,96 @@ createLightMap pdata lightPoints nWalls nSils nCaps drawObjShads toPos drawCPUSh GL_UNSIGNED_SHORT nullPtr CPUObjShads -> drawCPUShadows (V3 x y z) rad - _ -> return () + NoObjShads -> return () + --draw lightmap itself + glEnable GL_DEPTH_TEST + glDepthFunc GL_ALWAYS + --depthFunc $= Just Always + -- bind world position texture + bindTO toPos + glColorMask GL_TRUE GL_TRUE GL_TRUE GL_TRUE + --stencilOp $= (OpKeep, OpKeep, OpKeep) + glStencilFunc GL_EQUAL 0 255 + --currentProgram $= ltextShad ^? shadProg --Just (_shadProg ltextShad) + --uniform (_shadUnis ltextShad V.! 0) $= Vector3 x y z + --uniform (_shadUnis ltextShad V.! 1) $= Vector4 r g b rad + glUseProgram (ltextShad ^. shadProg') --Just (_shadProg ltextShad) + glUniform3f (_shadUnis' ltextShad V.! 0) x y z + glUniform4f (_shadUnis' ltextShad V.! 1) r g b rad + --bindVertexArrayObject $= ltextShad ^? shadVAO' . vaoName -- Just (_vao $ _shadVAO ltextShad) + glBindVertexArray $ ltextShad ^. shadVAO' . vaoName -- Just (_vao $ _shadVAO ltextShad) + glDrawArrays + (marshalEPrimitiveMode (_shadPrim' ltextShad)) + 0 + (fromIntegral (4 :: Int)) + --cleanup: may not be necessary, depending on what comes after... + glDisable GL_CULL_FACE + glDisable GL_STENCIL_TEST + +instanceLightMap pdata lightPoints nWalls nSils nCaps toPos = do + let llinesShad = _lightingLineShadowShader pdata + lcapShad = _lightingCapShader pdata + lwallShad = _lightingWallShadShader pdata + ltextShad = _lightingTextureShader pdata + -- we assume that the renderbuffer's depth has been correctly set elsewhere + -- we will not be changing that here + glDepthMask GL_FALSE + -- clearColor is specified differently in preloadRender + -- the colors are inverted + glClearColor 1 1 1 1 + glClear GL_COLOR_BUFFER_BIT + -- for each of the lights: + -- 1. stencil out the shadows from this light's point of view + -- 2. calculate lighting based on each fragment's position + -- to consider: adding normals/a "material" for each fragment + glBlendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR + glEnable GL_STENCIL_TEST + --stencilTest $= Enabled + glStencilOpSeparate GL_FRONT GL_KEEP GL_KEEP GL_INCR_WRAP + --stencilOpSeparate Front $= (OpKeep, OpKeep, OpIncrWrap) + --stencilOpSeparate Back $= (OpKeep, OpKeep, OpDecrWrap) + glStencilOpSeparate GL_BACK GL_KEEP GL_KEEP GL_DECR_WRAP + flip VFSM.mapM_ (VFSM.fromList lightPoints) $ \(V3 x y z, rad, V3 r g b) -> do + glDepthFunc GL_LESS + -- setup stencil + glColorMask GL_FALSE GL_FALSE GL_FALSE GL_FALSE + glClear GL_STENCIL_BUFFER_BIT + glDisable GL_CULL_FACE + --cullFace $= Nothing + glStencilFunc GL_ALWAYS 0 255 + --draw wall shadows + --currentProgram $= Just (_shadProg lwallShad) + glUseProgram (_shadProg' lwallShad) + --uniform (_shadUnis lwallShad V.! 0) + -- $= Vector3 x y z + glUniform3f (_shadUnis' lwallShad V.! 0) x y z + --bindVertexArrayObject $= lwallShad ^? shadVAO' . vaoName -- Just (_vao $ _shadVAO lwallShad) + glBindVertexArray $ lwallShad ^. shadVAO' . vaoName -- Just (_vao $ _shadVAO lwallShad) + glDrawArrays + (marshalEPrimitiveMode $ _shadPrim' lwallShad) + 0 + (fromIntegral nWalls) + --draw silhouette shadows + glUseProgram (_shadProg' llinesShad) + glUniform3f (_shadUnis' llinesShad V.! 0) x y z + glUniform1f (_shadUnis' llinesShad V.! 1) rad + glBindVertexArray (_vaoName $ _shadVAO' llinesShad) + glDrawElements + (marshalEPrimitiveMode $ _shadPrim' llinesShad) + (fromIntegral nSils) + GL_UNSIGNED_SHORT + nullPtr + --draw caps on the near plane as required + glEnable GL_CULL_FACE + glCullFace GL_BACK + glUseProgram (_shadProg' lcapShad) + glUniform3f (_shadUnis' lcapShad V.! 0) x y z + glBindVertexArray $ lcapShad ^. shadVAO' . vaoName --Just (_vao $ _shadVAO lcapShad) + glDrawElements + (marshalEPrimitiveMode $ _shadPrim' lcapShad) + (fromIntegral nCaps) + GL_UNSIGNED_SHORT + nullPtr --draw lightmap itself glEnable GL_DEPTH_TEST glDepthFunc GL_ALWAYS diff --git a/src/Shader/Data.hs b/src/Shader/Data.hs index 203bcdb21..f365670b2 100644 --- a/src/Shader/Data.hs +++ b/src/Shader/Data.hs @@ -25,9 +25,9 @@ module Shader.Data , shadTex' , shadUnis' -- | Synonyms - , vert' - , geom' - , frag' + , vert + , geom + , frag ) where import Data.Vector (Vector) import Graphics.GL.Core45 @@ -80,10 +80,10 @@ data EPrimitiveMode | EPolygon | EPatches -- | Short synonyms for shader types -vert', geom', frag' :: GLenum -vert' = GL_VERTEX_SHADER -geom' = GL_GEOMETRY_SHADER -frag' = GL_FRAGMENT_SHADER +vert, geom, frag :: GLenum +vert = GL_VERTEX_SHADER +geom = GL_GEOMETRY_SHADER +frag = GL_FRAGMENT_SHADER makeLenses ''VAO makeLenses ''VBO makeLenses ''FullShader