From 9a66a09f96cea04634b145196c4ad85c176cae53 Mon Sep 17 00:00:00 2001 From: justin Date: Thu, 23 Mar 2023 23:42:09 +0000 Subject: [PATCH] Work on lightmaps, add file --- data/texture/charMapVertBig.png | Bin 0 -> 9629 bytes shader/shadow/light.frag | 24 +++- src/Data/Preload/Render.hs | 1 - src/Dodge/Render.hs | 15 +-- src/Dodge/Render/Walls.hs | 7 +- src/Preload/Render.hs | 65 +++------- src/Render.hs | 209 ++++++++++++++++---------------- src/Shader/Compile.hs | 10 +- src/Shader/Poke.hs | 9 +- 9 files changed, 157 insertions(+), 183 deletions(-) create mode 100644 data/texture/charMapVertBig.png diff --git a/data/texture/charMapVertBig.png b/data/texture/charMapVertBig.png new file mode 100644 index 0000000000000000000000000000000000000000..1d64d05f69a91f0c25ba8bfc906037c9e35a2717 GIT binary patch literal 9629 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 T=r4^dQ_r>U=&6^h+D85l4?5|- literal 0 HcmV?d00001 diff --git a/shader/shadow/light.frag b/shader/shadow/light.frag index d4357591f..7ea159f59 100644 --- a/shader/shadow/light.frag +++ b/shader/shadow/light.frag @@ -7,16 +7,30 @@ layout (std140, binding = 1) uniform LightsBlock //uniform int lightID; vec3 lightPos = posBool[gl_Layer].xyz; vec4 lumRad = colRad[gl_Layer]; -uniform sampler2D screenTexture; +layout (binding = 0) uniform sampler2D screenTexture; +layout (binding = 1) uniform sampler2D normals; in vec2 gTexPos; out vec4 fColor; void main() { +float rad = lumRad.a; vec3 distVec = texture(screenTexture,gTexPos).xyz - lightPos; float dist = dot(distVec,distVec); if (dist > lumRad.a) {discard;} - float x = 1 - dist / lumRad.a ; - vec3 c = (x * x * x) * lumRad.rgb ; - fColor = vec4(c,0); - //fColor = vec4(0.05,0,0,0); + // float x = 1 - dist / lumRad.a ; + // vec3 c = (x * x * x) * lumRad.rgb ; + // fColor = vec4(c,0); + // //fColor = vec4(0.05,0,0,0); + vec4 normbit = texture(normals, gTexPos); + vec3 norm = normbit.xyz; + float y1 = dot(normalize(norm), normalize(distVec)); + float y2 = float(y1 > 0 ? 1 : 0); + //float y3 = clamp(0.5 * (y1 + 1),0,1) ; + float y3 = clamp(2*y1 + 1,0,1) ; + //float y3 = clamp(0.5 * (y1 + 2),0,1) ; + //float y = float(normbit.w == 0 ? y3 : y2); + float y = y2; + float x = 1 - dist / rad; + vec3 c = y* (x * x * x) * lumRad.rgb; + fColor = vec4(c, 0); } diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index 1cafed059..755fd2c67 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -46,7 +46,6 @@ data RenderData = RenderData , _matUBO :: GLuint -- BufferObject id , _orthonormalMatUBO :: GLuint -- BufferObject id , _lightsUBO :: GLuint -- BufferObject id - , _vboWalls :: VBO , _vboWindows :: VBO , _vboShapes :: VBO , _floorVBO :: VBO diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index b414c2b19..4f8aff43c 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -51,7 +51,7 @@ doDrawing' win pdata u = do trans = w ^. cWorld . camPos . camCenter wins@(V2 winx winy) = V2 (_windowX cfig) (_windowY cfig) resFact = resFactorNum $ cfig ^. graphics_resolution_factor - (wallPointsCol, windowPoints, wallSPics, wallsToPoke) = wallsToDraw w + ( windowPoints, wallSPics, wallsToPoke) = wallsToDraw w lightPoints = lightsToRender cfig (w ^. cWorld . camPos) (w ^. cWorld . lWorld) viewFroms@(V2 vfx vfy) = w ^. cWorld . camPos . camViewFrom shadV = _pictureShaders pdata @@ -61,7 +61,7 @@ doDrawing' win pdata u = do layerCounts <- UMV.replicate (numLayers * 6) 0 -- attempt to poke in parallel let (ws, wp) = wallSPics <> worldSPic cfig u - ((nWalls, nWins,trueNWalls), (nShapeVs, nIndices, nSilIndices)) <- + (( nWins,trueNWalls), (nShapeVs, nIndices, nSilIndices)) <- MP.bindM3 (\_ a b -> return (a, b)) ( pokeLayVerxs @@ -70,10 +70,8 @@ doDrawing' win pdata u = do wp ) ( pokeWallsWindows - ( pdata ^. vboWalls . vboPtr) ( pdata ^. vboWindows . vboPtr) ( pdata ^. wallVBO . vboPtr) - wallPointsCol windowPoints wallsToPoke ) @@ -88,8 +86,7 @@ doDrawing' win pdata u = do bufferShaderLayers shadV layerCounts uncurry (zipWithM_ bufferPokedVBO) $ unzip - [ (pdata ^. vboWalls, nWalls) - , (pdata ^. vboWindows, nWins) + [ (pdata ^. vboWindows, nWins) , (pdata ^. wallVBO, trueNWalls) ] bufferPokedVBO (_vboShapes pdata) nShapeVs @@ -141,7 +138,7 @@ doDrawing' win pdata u = do glDrawArrays (_unPrimitiveMode $ pdata ^. lightingWallShadShader . shaderPrimitive) 0 - (fromIntegral nWalls) + (fromIntegral trueNWalls) -- clear normals withArray [0,0,0,0] $ \ptr -> glClearNamedFramebufferfv (pdata ^. fboBase . _1 . unFBO) @@ -189,7 +186,7 @@ doDrawing' win pdata u = do createLightMap cfig (u ^. uvConfig . graphics_object_shadows) - nWalls + (fromIntegral trueNWalls) nSilIndices nIndices (pdata ^. fboBase . _2 . _2) @@ -305,7 +302,7 @@ doDrawing' win pdata u = do createLightMap cfig (_graphics_object_shadows $ _uvConfig u) - nWalls + (fromIntegral trueNWalls) nSilIndices nIndices (pdata ^. fboPos . _2) diff --git a/src/Dodge/Render/Walls.hs b/src/Dodge/Render/Walls.hs index 29dfa05af..3e3356045 100644 --- a/src/Dodge/Render/Walls.hs +++ b/src/Dodge/Render/Walls.hs @@ -14,11 +14,10 @@ import Geometry import ShapePicture -- not necessary: should just poke all walls to their wanted places -wallsToDraw :: World -> ([((Point2, Point2), Point4)], [((Point2, Point2), Point4)], SPic, [Wall]) +wallsToDraw :: World -> ( [((Point2, Point2), Point4)], SPic, [Wall]) wallsToDraw w = L.fold - ( (,,,) - <$> L.prefilter wlOpaqueDraw (L.premap f L.list) - <*> L.prefilter wlSeeThroughDraw (L.premap f L.list) + ( (,,) + <$>L.prefilter wlSeeThroughDraw (L.premap f L.list) <*> L.premap getWallSPic L.mconcat <*> L.prefilter wlOpaqueDraw L.list ) diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 62019a70d..e25df89f8 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -29,9 +29,6 @@ import Graphics.GL.Core45 50 charMapVert -} -numDrawableWalls :: Int -numDrawableWalls = 5000 - preloadRender :: IO RenderData preloadRender = do -- set up uniform buffer object @@ -47,40 +44,6 @@ preloadRender = do glNamedBufferData lightsubo 640 nullPtr GL_STREAM_DRAW glBindBufferBase GL_UNIFORM_BUFFER 1 lightsubo - -- setup wall points VBO, VAOs and shaders - wpVBOname <- mglCreate glCreateBuffers - wpVBOptr <- mallocArray (8 * numDrawableWalls) - glNamedBufferData wpVBOname - ( fromIntegral $ floatSize * numDrawableWalls * 8) - nullPtr - GL_STREAM_DRAW - let wpVBO = VBO{_vboName = wpVBOname, _vboPtr = wpVBOptr, _vboVertexSize = 8} - wpVAOname <- mglCreate glCreateVertexArrays - glBindVertexArray wpVAOname - glVertexArrayVertexBuffer wpVAOname 0 wpVBOname 0 (fromIntegral $ floatSize * 8) - setupVertexAttribPointer wpVAOname 0 4 0 - wpColVAOname <- mglCreate glCreateVertexArrays - glBindVertexArray wpColVAOname - glVertexArrayVertexBuffer wpColVAOname 0 wpVBOname 0 (fromIntegral $ floatSize * 8) - setupVertexAttribPointer wpColVAOname 0 4 0 - setupVertexAttribPointer wpColVAOname 1 4 4 - let wpVAO = VAO{_vaoName = wpVAOname} - wpColVAO = VAO{_vaoName = wpColVAOname} - -- setup window points VBO, VAOs and shaders - winVBOname <- mglCreate glCreateBuffers - winVBOptr <- mallocArray (8 * numDrawableWalls) - glNamedBufferData wpVBOname - ( fromIntegral $ floatSize * numDrawableWalls * 8) - nullPtr - GL_STREAM_DRAW - let winVBO = VBO{_vboName = winVBOname, _vboPtr = winVBOptr, _vboVertexSize = 8} - winColVAOname <- mglCreate glCreateVertexArrays - glBindVertexArray winColVAOname - glVertexArrayVertexBuffer winColVAOname 0 winVBOname 0 (fromIntegral $ floatSize * 8) - setupVertexAttribPointer winColVAOname 0 4 0 - setupVertexAttribPointer winColVAOname 1 4 4 - let winColVAO = VAO - {_vaoName = winColVAOname} -- setup shape geometry/cap VBO and two VAOs shVBO <- setupVBO nShapeVerxComp shPosVAOname <- mglCreate glCreateVertexArrays @@ -105,10 +68,12 @@ preloadRender = do GL_STREAM_DRAW let silEBO = EBO{_eboName = silEBOname, _eboPtr = silEBOptr} shEdgeVAO = VAO{_vaoName = shEdgeVAOname} --- shEdgeVAO is unecessary? - -- lighting shaders + + let wallverxstrd = 8 + wallvbo <- setupVBO wallverxstrd lightingWallShadShad <- - makeShaderUsingVAO "lighting/wallShadow" [vert, geom, frag] pmPoints wpVAO + makeShaderUsingVBO "lighting/wallShadow" [vert, geom, frag] [4] pmPoints wallvbo + lightingCapShad <- makeShaderUsingVAO "lighting/cap" [vert, geom] pmTriangles shPosVAO lightingLineShadowShad <- @@ -119,7 +84,7 @@ preloadRender = do shadowcapshader <- makeShaderUsingVAO "shadow/cap" [vert, geom] pmTriangles shPosVAO shadowwallshader <- - makeShaderUsingVAO "shadow/wallShadow" [vert, geom] pmPoints wpVAO + makeShaderUsingVBO "shadow/wallShadow" [vert, geom] [4] pmPoints wallvbo shadowlightshader <- makeShaderSized "shadow/light" [vert, geom, frag] [1] 1 pmPoints @@ -128,14 +93,14 @@ preloadRender = do -- 2D draw shaders bslist <- makeShaderVBO "dualTwoD/basic" [vert, frag] [3, 4] pmTriangles - bslista <- makeShaderUsingVBO "shape/basic" [vert, frag] shapeVerxSizes nShapeVerxComp pmTriangles shVBO + bslista <- makeShaderUsingVBO "shape/basic" [vert, frag] shapeVerxSizes pmTriangles shVBO glVertexArrayElementBuffer (bslista ^. shaderVAO . vaoName) (shEBO' ^. eboName) --glVertexArrayElementBuffer (bslista ^. shaderVAO . vaoName) shEBOname aslist <- makeShaderVBO "dualTwoD/arc" [vert, frag] [3, 4, 3] pmTriangles eslist <- makeShaderVBO "dualTwoD/ellipse" [vert, geom, frag] [3, 4] pmTriangles cslist <- makeShaderVBO "picture/charArray" [vert, frag] [3, 4, 4] pmTriangles - initTexture2DArray 50 "data/texture/charMapVert.png" 2 16 32 95 GL_NEAREST_MIPMAP_LINEAR GL_LINEAR + initTexture2DArray 50 "data/texture/charMapVertBig.png" 2 32 64 95 GL_NEAREST_MIPMAP_LINEAR GL_LINEAR screentexturevbo <- mglCreate glCreateBuffers withArray (concat cornerList) $ \ptr -> @@ -154,13 +119,12 @@ preloadRender = do makeShaderUsingVAO "lighting/texture" [vert, frag] pmTriangleStrip screentexturevao barrelShad <- makeShaderVBO "texture/barrel" [vert, geom, frag] [2, 2, 2, 1] pmPoints -- blank wallShader - wallBlankShad <- makeShaderUsingVAO "wall/blank" [vert, geom, frag] pmPoints wpColVAO - let wallverxstrd = 8 - wallvbo <- setupVBO wallverxstrd - wallshader <- makeShaderUsingVBO "wall/basic" [vert,geom,frag] [4,4] wallverxstrd pmPoints wallvbo + winvbo <- setupVBO 8 + windowshader <- makeShaderUsingVBO "wall/blank" [vert, geom, frag] [4,4] pmPoints winvbo + wallshader <- makeShaderUsingVBO "wall/basic" [vert,geom,frag] [4,4] pmPoints wallvbo let floorverxstrd = 8 floorvbo <- setupVBOStatic floorverxstrd - floorshader <- makeShaderUsingVBO "floor/arrayPos" [vert, frag] [4,4] floorverxstrd pmTriangles floorvbo + floorshader <- makeShaderUsingVBO "floor/arrayPos" [vert, frag] [4,4] pmTriangles floorvbo initTexture2DArraySquare 40 3 GL_LINEAR_MIPMAP_LINEAR GL_LINEAR "data/normalMaps/diffuseArray.png" initTexture2DArraySquare 41 3 GL_LINEAR_MIPMAP_LINEAR GL_LINEAR "data/normalMaps/normalArray.png" @@ -218,7 +182,7 @@ preloadRender = do , _shadowWallShader = shadowwallshader , _shadowLightShader = shadowlightshader , _shadowCombineShader = shadowcombineshader - , _windowShader = wallBlankShad{_shaderVAO = winColVAO} + , _windowShader = windowshader , _fullscreenShader = fsShad , _alphaDivideShader = alphadivideshader , _lightingTextureShader = lightingTextureShad @@ -241,8 +205,7 @@ preloadRender = do , _matUBO = theUBO , _orthonormalMatUBO = orthonormalUBO , _lightsUBO = lightsubo - , _vboWalls = wpVBO - , _vboWindows = winVBO + , _vboWindows = winvbo , _vboShapes = shVBO , _floorVBO = floorvbo , _floorShader = floorshader diff --git a/src/Render.hs b/src/Render.hs index d933edb8c..e66f6fd7a 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -28,9 +28,8 @@ import Shader.Data createLightMap :: Configuration -> ShadowRendering -> - -- | number of walls - Int -> + GLsizei -> -- | number of silhoutte lines to draw Int -> -- | number of "caps" to attempt to draw @@ -43,10 +42,10 @@ createLightMap :: RenderData -> IO () createLightMap cfig shadrendertype = case shadrendertype of - InstancingShads -> instanceLightMap cfig - NoShadows -> const . const . const renderLightingNoShadows - NoLighting -> const . const . const . const . const . const renderFlatLighting - _ -> renderShadows shadrendertype + InstancingShads -> instanceLightMap cfig + NoShadows -> const . const . const renderLightingNoShadows + NoLighting -> const . const . const . const . const . const renderFlatLighting + _ -> renderShadows shadrendertype renderLightingNoShadows :: TO -> @@ -110,113 +109,117 @@ renderLightingNoShadows positiontexture normaltexture lightPoints pdata = do renderFlatLighting :: RenderData -> IO () renderFlatLighting pdata = do glBindFramebuffer GL_FRAMEBUFFER (_unFBO (fst (_fboLighting pdata))) - withArray [1, 1, 1, 1] $ \ptr -> + withArray [0, 0, 0, 1] $ \ptr -> glClearNamedFramebufferfv (pdata ^. fboLighting . _1 . unFBO) GL_COLOR 0 ptr - with 1 $ \ptr -> - glClearNamedFramebufferfv - (pdata ^. fboLighting . _1 . unFBO) - GL_DEPTH - 0 - ptr glDisable GL_CULL_FACE glDepthFunc GL_ALWAYS glDepthMask GL_FALSE +renderShadows :: + ShadowRendering -> + GLsizei -> + Int -> + Int -> + TO -> + TO -> + [(Point3, Float, Point3)] -> + RenderData -> + IO () renderShadows shadrendertype nWalls nSils nCaps positiontexture normaltexture lightPoints pdata = do - glBindFramebuffer GL_FRAMEBUFFER (_unFBO (fst (_fboLighting pdata))) - 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 - withArray [1, 1, 1, 1] $ \ptr -> - glClearNamedFramebufferfv - (pdata ^. fboLighting . _1 . unFBO) - GL_COLOR - 0 - ptr - -- 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 - glStencilOpSeparate GL_FRONT GL_KEEP GL_KEEP GL_INCR_WRAP - 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 - with 0 $ \ptr -> - glClearNamedFramebufferiv - (pdata ^. fboLighting . _1 . unFBO) - GL_STENCIL - 0 - ptr - glDisable GL_CULL_FACE - glStencilFunc GL_ALWAYS 0 255 - --draw wall shadows - glUseProgram (_shaderUINT lwallShad) + glBindFramebuffer GL_FRAMEBUFFER (_unFBO (fst (_fboLighting pdata))) + 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 + withArray [1, 1, 1, 1] $ \ptr -> + glClearNamedFramebufferfv + (pdata ^. fboLighting . _1 . unFBO) + GL_COLOR + 0 + ptr + -- 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 + glStencilOpSeparate GL_FRONT GL_KEEP GL_KEEP GL_INCR_WRAP + 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 + with 0 $ \ptr -> + glClearNamedFramebufferiv + (pdata ^. fboLighting . _1 . unFBO) + GL_STENCIL + 0 + ptr + glDisable GL_CULL_FACE + glStencilFunc GL_ALWAYS 0 255 + --draw wall shadows + glUseProgram (_shaderUINT lwallShad) + glUniform3f 0 x y z + glUniform1f 1 rad + glBindVertexArray $ lwallShad ^. shaderVAO . vaoName -- Just (_vao $ _shadVAO lwallShad) + glDrawArrays + (_unPrimitiveMode $ _shaderPrimitive lwallShad) + 0 + nWalls + case shadrendertype of + GeoObjShads -> do + --draw silhouette shadows + glEnable GL_DEPTH_CLAMP + glUseProgram (_shaderUINT llinesShad) glUniform3f 0 x y z glUniform1f 1 rad - glBindVertexArray $ lwallShad ^. shaderVAO . vaoName -- Just (_vao $ _shadVAO lwallShad) - glDrawArrays - (_unPrimitiveMode $ _shaderPrimitive lwallShad) - 0 - (fromIntegral nWalls) - case shadrendertype of - GeoObjShads -> do - --draw silhouette shadows - glEnable GL_DEPTH_CLAMP - glUseProgram (_shaderUINT llinesShad) - glUniform3f 0 x y z - glUniform1f 1 rad - glBindVertexArray (_vaoName $ _shaderVAO llinesShad) - glDrawElements - (_unPrimitiveMode $ _shaderPrimitive llinesShad) - (fromIntegral nSils) - GL_UNSIGNED_SHORT - nullPtr - --draw caps on the near plane as required - glEnable GL_CULL_FACE - glCullFace GL_BACK - glCullFace GL_FRONT - glUseProgram (_shaderUINT lcapShad) - glUniform3f 0 x y z - glBindVertexArray $ lcapShad ^. shaderVAO . vaoName --Just (_vao $ _shadVAO lcapShad) - glDrawElements - (_unPrimitiveMode $ _shaderPrimitive lcapShad) - (fromIntegral nCaps) - GL_UNSIGNED_SHORT - nullPtr - glDisable GL_DEPTH_CLAMP - NoObjShads -> return () - --draw lightmap itself - glDepthFunc GL_ALWAYS - -- bind world position texture - glDisable GL_CULL_FACE - glBindTextureUnit 0 (positiontexture ^. unTO) - glBindTextureUnit 1 (normaltexture ^. unTO) - glColorMask GL_TRUE GL_TRUE GL_TRUE GL_TRUE - glStencilFunc GL_EQUAL 0 255 - glUseProgram (ltextShad ^. shaderUINT) --Just (_shadProg ltextShad) + glBindVertexArray (_vaoName $ _shaderVAO llinesShad) + glDrawElements + (_unPrimitiveMode $ _shaderPrimitive llinesShad) + (fromIntegral nSils) + GL_UNSIGNED_SHORT + nullPtr + --draw caps on the near plane as required + glEnable GL_CULL_FACE + glCullFace GL_BACK + glCullFace GL_FRONT + glUseProgram (_shaderUINT lcapShad) glUniform3f 0 x y z - glUniform4f 1 r g b rad - glBindVertexArray $ ltextShad ^. shaderVAO . vaoName -- Just (_vao $ _shadVAO ltextShad) - glDrawArrays - (_unPrimitiveMode (_shaderPrimitive ltextShad)) - 0 - (fromIntegral (4 :: Int)) - --cleanup: may not be necessary, depending on what comes after... - glDisable GL_STENCIL_TEST + glBindVertexArray $ lcapShad ^. shaderVAO . vaoName --Just (_vao $ _shadVAO lcapShad) + glDrawElements + (_unPrimitiveMode $ _shaderPrimitive lcapShad) + (fromIntegral nCaps) + GL_UNSIGNED_SHORT + nullPtr + glDisable GL_DEPTH_CLAMP + _ -> return () + --draw lightmap itself + glDepthFunc GL_ALWAYS + -- bind world position texture + glDisable GL_CULL_FACE + glBindTextureUnit 0 (positiontexture ^. unTO) + glBindTextureUnit 1 (normaltexture ^. unTO) + glColorMask GL_TRUE GL_TRUE GL_TRUE GL_TRUE + glStencilFunc GL_EQUAL 0 255 + glUseProgram (ltextShad ^. shaderUINT) --Just (_shadProg ltextShad) + glUniform3f 0 x y z + glUniform4f 1 r g b rad + glBindVertexArray $ ltextShad ^. shaderVAO . vaoName -- Just (_vao $ _shadVAO ltextShad) + glDrawArrays + (_unPrimitiveMode (_shaderPrimitive ltextShad)) + 0 + (fromIntegral (4 :: Int)) + --cleanup: may not be necessary, depending on what comes after... + glDisable GL_STENCIL_TEST lightsToArray :: [(Point3, Float, Point3)] -> [Float] lightsToArray xs = @@ -228,9 +231,8 @@ lightsToArray xs = instanceLightMap :: Configuration -> - -- | number of walls - Int -> + GLsizei -> -- | number of silhoutte lines to draw Int -> -- | number of "caps" to attempt to draw @@ -293,7 +295,7 @@ instanceLightMap cfig nWalls nSils nCaps toPos tanormals lightPoints pdata = do glDrawArrays (_unPrimitiveMode $ pdata ^. shadowWallShader . shaderPrimitive) 0 - (fromIntegral nWalls) + nWalls --draw silhouette shadows glUseProgram $ pdata ^. shadowEdgeShader . shaderUINT glBindVertexArray $ pdata ^. shadowEdgeShader . shaderVAO . vaoName @@ -320,6 +322,7 @@ instanceLightMap cfig nWalls nSils nCaps toPos tanormals lightPoints pdata = do glUseProgram (pdata ^. shadowLightShader . _1 . shaderUINT) -- bind world position texture glBindTextureUnit 0 (toPos ^. unTO) + glBindTextureUnit 1 (tanormals ^. unTO) glDrawArrays (_unPrimitiveMode $ pdata ^. shadowLightShader . _1 . shaderPrimitive) 0 diff --git a/src/Shader/Compile.hs b/src/Shader/Compile.hs index afb6a726c..271617348 100644 --- a/src/Shader/Compile.hs +++ b/src/Shader/Compile.hs @@ -80,13 +80,15 @@ makeShaderUsingVBO :: [GLenum] -> -- | The input vertex sizes [Int] -> - -- | The stride - Int -> PrimitiveMode -> VBO -> IO Shader -makeShaderUsingVBO s shaderlist sizes strd pm vbo = setupVAOvbo sizes strd vbo - >>= makeShaderUsingVAO s shaderlist pm +makeShaderUsingVBO s shaderlist sizes pm vbo = do + let strd = vbo ^. vboVertexSize + when (strd < sum sizes) $ + error "Tried to assign vertex attributes to VBO with too small a stride." + vao <- setupVAOvbo sizes strd vbo + makeShaderUsingVAO s shaderlist pm vao setupVBO :: Int -> IO VBO setupVBO vertexsize = do diff --git a/src/Shader/Poke.hs b/src/Shader/Poke.hs index 47ad5f8fd..d81a19e8c 100644 --- a/src/Shader/Poke.hs +++ b/src/Shader/Poke.hs @@ -47,16 +47,13 @@ pokeVerx vbos offsets Verx{_vxPos = thePos, _vxCol = theCol, _vxExt = ext, _vxSh pokeWallsWindows :: Ptr Float -> Ptr Float -> - Ptr Float -> - [((Point2, Point2), Point4)] -> [((Point2, Point2), Point4)] -> [Wall] -> - IO (Int, Int, Int) -pokeWallsWindows wlptr wiptr truewlptr wls wis truewls = do - wlcounts1 <- VFSM.foldlM' (pokeW wlptr) 0 (VFSM.fromList wls) + IO (Int, Int) +pokeWallsWindows wiptr truewlptr wis truewls = do wlcounts2 <- VFSM.foldlM' (pokeW wiptr) 0 (VFSM.fromList wis) wlcounts3 <- VFSM.foldlM' (pokeWall truewlptr) 0 (VFSM.fromList truewls) - return (wlcounts1, wlcounts2, wlcounts3) + return ( wlcounts2, wlcounts3) pokeFloors :: Ptr Float -> [(Point3, Point3)] ->