From 02511afa80296faa8a553fa5e352fb70fd20b356 Mon Sep 17 00:00:00 2001 From: jgk Date: Thu, 10 Jun 2021 18:07:26 +0200 Subject: [PATCH] Remove unnecessary uniforms --- shader/lighting/occlude.geom | 57 ++++++------------------------------ shader/lighting/wall.geom | 10 +++---- shader/wall/blank.geom | 10 +++---- shader/wall/texture.geom | 10 +++---- src/Dodge/Render.hs | 4 +-- src/MatrixHelper.hs | 33 +++++++++++++++++---- src/Picture/Preload.hs | 7 ++--- src/Picture/Render.hs | 17 +++++------ src/Shader.hs | 10 +++---- src/Shader/Data.hs | 4 +-- 10 files changed, 69 insertions(+), 93 deletions(-) diff --git a/shader/lighting/occlude.geom b/shader/lighting/occlude.geom index a029e1180..4f86b6432 100644 --- a/shader/lighting/occlude.geom +++ b/shader/lighting/occlude.geom @@ -3,11 +3,9 @@ layout (points) in; layout (triangle_strip, max_vertices = 11) out; uniform vec2 lightPos; -uniform mat4 perpMat; uniform mat4 worldMat; -uniform float facesToDraw; -vec2 lightPosa = ( perpMat * vec4(lightPos,0,1) ).xy; +vec2 lightPosa = ( worldMat * vec4(lightPos,0,1) ).xy; vec4 shift (vec4 p) { return vec4 (p.xy + (200 * (p.xy-lightPos)), 0 , 1); @@ -30,19 +28,14 @@ vec4 p6 = shift(p2); vec4 p7 = vec4 (p6.xy,-0.5,1); vec4 p8 = vec4 (p5.xy,-0.5,1); -vec4 a1 = perpMat * p1; -vec4 a2 = perpMat * p2; -vec4 a3 = perpMat * p3; -vec4 a4 = perpMat * p4; -vec4 a5 = perpMat * p5; -vec4 a6 = perpMat * p6; -vec4 a7 = perpMat * p7; -vec4 a8 = perpMat * p8; - -// gl_Position = a1; EmitVertex(); -// gl_Position = a5; EmitVertex(); -// gl_Position = a2; EmitVertex(); -// gl_Position = a6; EmitVertex(); +vec4 a1 = worldMat * p1; +vec4 a2 = worldMat * p2; +vec4 a3 = worldMat * p3; +vec4 a4 = worldMat * p4; +vec4 a5 = worldMat * p5; +vec4 a6 = worldMat * p6; +vec4 a7 = worldMat * p7; +vec4 a8 = worldMat * p8; gl_Position = a4; EmitVertex(); gl_Position = a3; EmitVertex(); @@ -59,35 +52,3 @@ vec4 a8 = perpMat * p8; EndPrimitive(); } else {} } - -// // void main() -// // { -// // vec4 frontL4 = worldMat * vec4(gl_in[0].gl_Position.xy, 0 ,1); -// // vec4 frontR4 = worldMat * vec4(gl_in[0].gl_Position.zw, 0 ,1); -// // vec2 frontL = frontL4.xy; -// // vec2 frontR = frontR4.xy; -// // -// // emitLine (frontR); -// // emitLine (frontL); -// // EndPrimitive(); -// // } -// gl_Position = perspective * worldMat * p4; EmitVertex(); -// gl_Position = perspective * worldMat * p3; EmitVertex(); -// gl_Position = perspective * worldMat * p7; EmitVertex(); -// gl_Position = perspective * worldMat * p8; EmitVertex(); -// gl_Position = perspective * worldMat * p5; EmitVertex(); -// gl_Position = perspective * worldMat * p3; EmitVertex(); -// gl_Position = perspective * worldMat * p1; EmitVertex(); -// gl_Position = perspective * worldMat * p4; EmitVertex(); -// gl_Position = perspective * worldMat * p2; EmitVertex(); -// gl_Position = perspective * worldMat * p7; EmitVertex(); -// gl_Position = perspective * worldMat * p6; EmitVertex(); -// gl_Position = perspective * worldMat * p5; EmitVertex(); -//void emitLine (vec2 pa) -//{ -// gl_Position = vec4 (pa, 0, 1); -// EmitVertex(); -// gl_Position = shift (vec4 (pa,0,1)); //vec4 (pa + (200 * (pa - lightPosa)), 0 , 1); -// EmitVertex(); -//} - diff --git a/shader/lighting/wall.geom b/shader/lighting/wall.geom index 2a56b70bf..56ff79df5 100644 --- a/shader/lighting/wall.geom +++ b/shader/lighting/wall.geom @@ -6,7 +6,7 @@ out vec3 dField; out float lum; uniform vec2 lightPos; -uniform mat4 perpMat; +uniform mat4 worldMat; uniform vec2 radLum; float isLHS (vec2 startV, vec2 testV) @@ -31,10 +31,10 @@ if (isLHS (p1.xy - lightPos, p2.xy - lightPos) < 0) vec2 d1 = p1.xy - lightPos; vec2 d2 = p2.xy - lightPos; - vec4 a1 = shiftCloser( perpMat * p1 ); - vec4 a2 = shiftCloser( perpMat * p2 ); - vec4 a3 = shiftCloser( perpMat * p3 ); - vec4 a4 = shiftCloser( perpMat * p4 ); + vec4 a1 = shiftCloser( worldMat * p1 ); + vec4 a2 = shiftCloser( worldMat * p2 ); + vec4 a3 = shiftCloser( worldMat * p3 ); + vec4 a4 = shiftCloser( worldMat * p4 ); dField = vec3( d1.x/rad, d1.y/rad, 0); gl_Position = a1; diff --git a/shader/wall/blank.geom b/shader/wall/blank.geom index 5e371044a..aa7f69468 100644 --- a/shader/wall/blank.geom +++ b/shader/wall/blank.geom @@ -5,7 +5,7 @@ layout (triangle_strip, max_vertices = 4) out; in vec4 vColor []; out vec4 gColor; -uniform mat4 perpMat; +uniform mat4 worldMat; // consider using isLHS to check if the wall is facing the center // this needs the view from point @@ -21,16 +21,16 @@ void main() vec4 p1 = vec4 (gl_in[0].gl_Position.xy,0,1); vec4 p2 = vec4 (gl_in[0].gl_Position.zw,0,1); - vec4 a1 = perpMat * p1; - vec4 a2 = perpMat * p2; + vec4 a1 = worldMat * p1; + vec4 a2 = worldMat * p2; // if (0 > isLHS (a1.xy - a2.xy, a1.xy - "viewFromPoint")) { vec4 p3 = vec4 (p1.xy,-0.5,1); vec4 p4 = vec4 (p2.xy,-0.5,1); - vec4 a3 = perpMat * p3; - vec4 a4 = perpMat * p4; + vec4 a3 = worldMat * p3; + vec4 a4 = worldMat * p4; gl_Position = a1; EmitVertex(); gl_Position = a3; EmitVertex(); diff --git a/shader/wall/texture.geom b/shader/wall/texture.geom index 9f16874c8..266ba158f 100644 --- a/shader/wall/texture.geom +++ b/shader/wall/texture.geom @@ -6,7 +6,7 @@ in vec4 vColor []; out vec4 gColor; out vec2 tPos; -uniform mat4 perpMat; +uniform mat4 worldMat; // consider using isLHS to check if the wall is facing the center float isLHS (vec2 startV, vec2 testV) @@ -23,10 +23,10 @@ vec4 p2 = vec4 (gl_in[0].gl_Position.zw,0,1); vec4 p3 = vec4 (p1.xy,-0.3,1); vec4 p4 = vec4 (p2.xy,-0.3,1); -vec4 a1 = perpMat * p1; -vec4 a2 = perpMat * p2; -vec4 a3 = perpMat * p3; -vec4 a4 = perpMat * p4; +vec4 a1 = worldMat * p1; +vec4 a2 = worldMat * p2; +vec4 a3 = worldMat * p3; +vec4 a4 = worldMat * p4; tPos = vec2 ( 1,-1) ; gl_Position = a1; EmitVertex(); tPos = vec2 ( 1, 1) ; gl_Position = a3; EmitVertex(); diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index ea94ef692..44139eb08 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -138,7 +138,7 @@ renderBlankWalls pdata wps pmat = do n <- F.foldM (pokeShader $ _wallBlankShader pdata) wps bindShaderBuffers [_wallBlankShader pdata] [n] currentProgram $= Just (_shaderProgram $ _wallBlankShader pdata) - uniform (head ( _shaderCustomUnis $ _wallBlankShader pdata) ) + uniform (( _shaderMatrixUniform $ _wallBlankShader pdata) ) $= pmat cullFace $= Just Back drawShader (_wallBlankShader pdata) n @@ -153,7 +153,7 @@ renderTextureWalls pdata wps pmat = do n <- F.foldM (pokeShader $ _wallTextureShader pdata) wps bindShaderBuffers [_wallTextureShader pdata] [n] currentProgram $= Just (_shaderProgram $ _wallTextureShader pdata) - uniform (head ( _shaderCustomUnis $ _wallTextureShader pdata) ) + uniform (( _shaderMatrixUniform $ _wallTextureShader pdata) ) $= pmat cullFace $= Just Back drawShader (_wallTextureShader pdata) n diff --git a/src/MatrixHelper.hs b/src/MatrixHelper.hs index a170edc4d..17042ed80 100644 --- a/src/MatrixHelper.hs +++ b/src/MatrixHelper.hs @@ -1,5 +1,6 @@ module MatrixHelper ( perspectiveMatrix + , isoMatrix ) where import Geometry @@ -25,11 +26,6 @@ perspectiveMatrix rot zoom (tranx,trany) (winx,winy) (viewFromx,viewFromy) = (V4 (sin rot) (cos rot) 0 0) (V4 0 0 1 0) (V4 0 0 0 1) - --tranMat3 = Linear.Matrix.transpose $ - -- V4 (V4 1 0 0 0) - -- (V4 0 1 0 0) - -- (V4 0 0 1 0) - -- (V4 (-tranx) (-trany) 0 1) tranMat2 = Linear.Matrix.transpose $ V4 (V4 1 0 0 0) (V4 0 1 0 0) @@ -48,3 +44,30 @@ perspectiveMatrix rot zoom (tranx,trany) (winx,winy) (viewFromx,viewFromy) = wmat = scalMat !*! rotMat !*! tranMat2 !*! perMat !*! tranMat1 vToL (V4 a b c d) = [a,b,c,d] in concatMap vToL $ vToL wmat +{- | A matrix that gives a top down view with no perspective. -} +isoMatrix + :: Float -- ^ Rotation + -> Float -- ^ Zoom + -> Point2 -- ^ Translation + -> Point2 -- ^ Window size + -> Point2 -- ^ View froms + -> [GLfloat] +isoMatrix rot czoom (tranx,trany) (winx,winy) _ = + let scalMat = Linear.Matrix.transpose $ + V4 (V4 (2*czoom/winx) 0 0 (0::GLfloat)) + (V4 0 (2*czoom/winy) 0 0) + (V4 0 0 1 0) + (V4 0 0 0 1) + rotMat = Linear.Matrix.transpose $ + V4 (V4 (cos rot) (sin (-rot)) 0 0) + (V4 (sin rot) (cos rot) 0 0) + (V4 0 0 1 0) + (V4 0 0 0 1) + tranMat = Linear.Matrix.transpose $ + V4 (V4 1 0 0 0) + (V4 0 1 0 0) + (V4 0 0 1 0) + (V4 (-tranx) (-trany) 0 1) + wmat = scalMat !*! rotMat !*! tranMat + vToL (V4 a b c d) = [a,b,c,d] + in concatMap vToL $ vToL wmat diff --git a/src/Picture/Preload.hs b/src/Picture/Preload.hs index ed1cde0d1..2e4c3ebf4 100644 --- a/src/Picture/Preload.hs +++ b/src/Picture/Preload.hs @@ -40,10 +40,10 @@ preloadRender = do lsShad <- makeShader "lighting/floor" [vert,geom,frag] [(0,4)] Points (return . return . flat4) wsShad <- makeShader "lighting/occlude" [vert,geom,frag] [(0,4)] Points pokeWPStrat - >>= addUniforms ["lightPos","perpMat","facesToDraw"] + >>= addUniforms ["lightPos"] wlLightShad <- makeShader "lighting/wall" [vert,geom,frag] [(0,4)] Points pokeWPStrat - >>= addUniforms ["lightPos","perpMat","radLum"] + >>= addUniforms ["lightPos","radLum"] -- 2D draw shaders bslist <- makeShader "twoD/basic" [vert,frag] [(0,3),(1,4)] Triangles pokeTriStrat lslist <- makeShader "twoD/basic" [vert,frag] [(0,3),(1,4)] Lines pokeLineStrat @@ -82,12 +82,9 @@ preloadRender = do -- >>= addTexture "data/texture/smudgedDirt.png" -- blank wallShader wlBlank <- makeShader "wall/blank" [vert,geom,frag] [(0,4),(1,4)] Points pokeWPColStrat --- >>= addTexture "data/texture/grayscaleDirt.png" - >>= addUniforms ["perpMat"] -- textured wallShader wlTexture <- makeShader "wall/texture" [vert,geom,frag] [(0,4),(1,4)] Points pokeWPColStrat >>= addTexture "data/texture/grayscaleDirt.png" - >>= addUniforms ["perpMat"] -- framebuffer for lighting (fbo,fboTO,fboRBO) <- setupFramebufferWithStencil framebuf2 <- setupFramebufferWithStencil diff --git a/src/Picture/Render.hs b/src/Picture/Render.hs index d53a380a6..a0b4f224e 100644 --- a/src/Picture/Render.hs +++ b/src/Picture/Render.hs @@ -38,12 +38,11 @@ setWallDepth pdata wallPoints (viewFromx,viewFromy) pmat = do bindShaderBuffers [_lightingOccludeShader pdata] [nWalls] currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata) - uniform (head $ _shaderCustomUnis $ _lightingOccludeShader pdata) + -- reseting this uniform appears to be necessary + uniform (head $ _shaderCustomUnis $ _lightingOccludeShader pdata) $= Vector2 viewFromx viewFromy - uniform ( (_shaderCustomUnis $ _lightingOccludeShader pdata) !! 1) - $= pmat - uniform ( (_shaderCustomUnis $ _lightingOccludeShader pdata) !! 2) - $= (0 :: Float) +-- uniform ( (_shaderMatrixUniform $ _lightingOccludeShader pdata)) +-- $= pmat -- cullFace $= Just Front drawShader (_lightingOccludeShader pdata) nWalls colorMask $= Color4 Enabled Enabled Enabled Enabled @@ -81,7 +80,7 @@ createLightMap pdata resDiv wallPoints lightPoints (viewFromx,viewFromy) pmat _ bindShaderBuffers [_lightingOccludeShader pdata] [nWalls] -- set uniforms for shader that draws lights currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata) - uniform ( (_shaderCustomUnis $ _lightingWallShader pdata) !! 1) + uniform (_shaderMatrixUniform $ _lightingWallShader pdata) $= pmat -- clear buffer to full alpha and furthest depth clearColor $= Color4 0 0 0 1 @@ -93,10 +92,8 @@ createLightMap pdata resDiv wallPoints lightPoints (viewFromx,viewFromy) pmat _ currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata) uniform (head $ _shaderCustomUnis $ _lightingOccludeShader pdata) $= Vector2 viewFromx viewFromy - uniform ( (_shaderCustomUnis $ _lightingOccludeShader pdata) !! 1) + uniform ( (_shaderMatrixUniform $ _lightingOccludeShader pdata)) $= pmat - uniform ( (_shaderCustomUnis $ _lightingOccludeShader pdata) !! 2) - $= (0 :: Float) cullFace $= Just Back drawShader (_lightingOccludeShader pdata) nWalls @@ -142,7 +139,7 @@ createLightMap pdata resDiv wallPoints lightPoints (viewFromx,viewFromy) pmat _ currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata) uniform (head $ _shaderCustomUnis $ _lightingWallShader pdata) $= Vector2 x y - uniform ((_shaderCustomUnis $ _lightingWallShader pdata) !! 2) + uniform (_shaderCustomUnis (_lightingWallShader pdata) !! 1) $= Vector2 r lum drawShader (_lightingWallShader pdata) nWallLights cullFace $= Nothing diff --git a/src/Shader.hs b/src/Shader.hs index 4fc4add65..b609052ad 100644 --- a/src/Shader.hs +++ b/src/Shader.hs @@ -37,7 +37,7 @@ import Linear.Matrix import Linear.V4 extractProgAndUnis :: FullShader a -> (Program,UniformLocation) -extractProgAndUnis s = (_shaderProgram s, _shaderUniform s) +extractProgAndUnis s = (_shaderProgram s, _shaderMatrixUniform s) pokeShaders :: [FullShader a] -> F.FoldM IO a [Int] pokeShaders = traverse pokeShader @@ -124,7 +124,7 @@ makeShader s shaderlist alocs pm renStrat = do (prog,unis) <- makeSourcedShader s shaderlist vaob <- setupVAO alocs return $ FullShader { _shaderProgram = prog - , _shaderUniform = unis + , _shaderMatrixUniform = unis , _shaderVAO = vaob , _shaderPokeStrategy = renStrat , _shaderDrawPrimitive = pm @@ -184,7 +184,6 @@ addUniforms uniStrings shad = do uniLocs <- mapM (uniformLocation $ _shaderProgram shad) uniStrings return $ shad & shaderCustomUnis %~ (++ uniLocs) - shaderTypeExt :: ShaderType -> String shaderTypeExt VertexShader = ".vert" shaderTypeExt GeometryShader = ".geom" @@ -202,7 +201,6 @@ makeShaderProgram str sources = do unless linkingSuccess $ do infoLog <- get (programInfoLog theShaderProgram) putStrLn $ str ++ ": Program Linking" ++ infoLog - return theShaderProgram compileAndCheckShader :: String -> (ShaderType,BS.ByteString) -> IO Shader @@ -217,8 +215,8 @@ compileAndCheckShader str (theShaderType,sourceCode) = do return theShader resetShaderUniforms :: [(Program, UniformLocation)] -> IO () -resetShaderUniforms = setShaderUniforms 0 1 (0,0) (2,2) {-# INLINE resetShaderUniforms #-} +resetShaderUniforms = setShaderUniforms 0 1 (0,0) (2,2) setShaderUniforms :: Float -> Float -> Point2 -> Point2 -> [(Program,UniformLocation)] -> IO () {-# INLINE setShaderUniforms #-} @@ -257,7 +255,7 @@ setPerpMatUniform setPerpMatUniform rot czoom trans wins vFrom shad = do pmat <- (newMatrix RowMajor $ perspectiveMatrix rot czoom trans wins vFrom) :: IO (GLmatrix GLfloat) currentProgram $= Just (_shaderProgram shad) - uniform (_shaderUniform shad) $= pmat + uniform (_shaderMatrixUniform shad) $= pmat return () freeShaderPointers :: FullShader a -> IO () diff --git a/src/Shader/Data.hs b/src/Shader/Data.hs index 061d8a413..919bfe0af 100644 --- a/src/Shader/Data.hs +++ b/src/Shader/Data.hs @@ -11,7 +11,7 @@ module Shader.Data , vaoBufferTargets , shaderProgram - , shaderUniform + , shaderMatrixUniform , shaderVAO , shaderPokeStrategy , shaderDrawPrimitive @@ -32,7 +32,7 @@ data VAO = VAO {- | Datatype containing the necessary information for a single shader. -} data FullShader a = FullShader { _shaderProgram :: Program - , _shaderUniform :: UniformLocation + , _shaderMatrixUniform :: UniformLocation , _shaderVAO :: VAO , _shaderPokeStrategy :: a -> [[[Float]]]-- -> F.FoldM IO RenderType Int , _shaderDrawPrimitive :: PrimitiveMode