Replace explicit matrix uniforms with single ubo
This commit is contained in:
+1
-8
@@ -56,6 +56,7 @@ doDrawing pdata w = do
|
||||
pic = worldPictures w
|
||||
wallPoints = map fst wallPointsCol
|
||||
|
||||
-- set the coordinate uniform ready for drawing elements using world coordinates
|
||||
let pmat = perspectiveMatrixb rot camzoom trans wins viewFroms
|
||||
withArray pmat $ \ptr ->
|
||||
bufferData UniformBuffer $=
|
||||
@@ -64,9 +65,6 @@ doDrawing pdata w = do
|
||||
,StreamDraw
|
||||
)
|
||||
|
||||
-- set the coordinate uniforms ready for drawing elements using world coordinates
|
||||
--setIsoMatrixUniforms pdata rot camzoom trans wins
|
||||
setPerpMatrixUniforms pdata rot camzoom trans wins viewFroms
|
||||
depthFunc $= Just Less
|
||||
-- draw the lightmap. Probably changes the bound framebufferObject
|
||||
createLightMap pdata (w ^. config . shadow_resolution) wallPoints lightPoints viewFroms
|
||||
@@ -109,7 +107,6 @@ doDrawing pdata w = do
|
||||
renderBlankWalls pdata windowPoints
|
||||
|
||||
depthMask $= Enabled
|
||||
forM_ (_pictureShaders pdata) $ setPerpMatUniform rot camzoom trans wins viewFroms
|
||||
depthFunc $= Just Lequal
|
||||
_ <- renderFoldable pdata $ picToLTree (Just 0) (foregroundPics w)
|
||||
|
||||
@@ -132,10 +129,6 @@ doDrawing pdata w = do
|
||||
drawShader (_grayscaleShader pdata) 4
|
||||
blend $= Enabled
|
||||
|
||||
-- reset the coordinate uniforms for pictures that are drawn wrt to window
|
||||
-- coordinates
|
||||
resetShaderUniforms (map extractProgAndUnis $ _pictureShaders pdata)
|
||||
|
||||
let pmata = perspectiveMatrixc 0 1 (0,0) (2,2)
|
||||
withArray pmata $ \ptr ->
|
||||
bufferData UniformBuffer $=
|
||||
|
||||
@@ -195,26 +195,6 @@ renderBackground pdata rot camZoom (tranx,trany) (winx,winy) = do
|
||||
textureBinding Texture2D $= _textureObject <$> _shaderTexture (_backgroundShader pdata)
|
||||
drawArrays Points 0 1
|
||||
|
||||
setPerpMatrixUniforms
|
||||
:: RenderData
|
||||
-> Float -- ^ Rotation
|
||||
-> Float -- ^ Zoom
|
||||
-> (Float,Float) -- ^ Translation
|
||||
-> (Float,Float) -- ^ Window size
|
||||
-> (Float,Float) -- ^ ViewFrom
|
||||
-> IO ()
|
||||
setPerpMatrixUniforms pdata rot czoom trans wins vfs = mapM_ (setPerpMatUniform rot czoom trans wins vfs)
|
||||
( _lightingFloorShader pdata
|
||||
: _lightingWallShader pdata
|
||||
: _lightingOccludeShader pdata
|
||||
: _backgroundShader pdata
|
||||
: _textureShader pdata
|
||||
: _textureArrayShader pdata
|
||||
: _wallBlankShader pdata
|
||||
: _wallTextureShader pdata
|
||||
: _pictureShaders pdata
|
||||
)
|
||||
|
||||
renderShader
|
||||
:: Foldable f
|
||||
=> FullShader
|
||||
|
||||
@@ -56,15 +56,12 @@ preloadRender = do
|
||||
-- textured wallShader
|
||||
wlTexture <- makeShader "wall/texture" [vert,geom,frag] [4,4] Points pokeWPColStrat
|
||||
>>= addTexture "data/texture/grayscaleDirt.png"
|
||||
|
||||
---- texture shader
|
||||
textShad <- makeShader "texture/simpleWorld" [vert,frag] [3,2] Triangles poke32
|
||||
>>= addTexture "data/texture/ayene_wooden_floor.png"
|
||||
|
||||
---- texture array shader
|
||||
textArrayShad <- makeShader "texture/array" [vert,frag] [3,3] Triangles poke33
|
||||
>>= addTextureArray "data/texture/ayene_wooden_floor.png"
|
||||
|
||||
-- framebuffer for lighting
|
||||
(fbo,fboTO,fboRBO) <- setupFramebufferWithStencil
|
||||
framebuf2 <- setupFramebufferWithStencil
|
||||
@@ -91,7 +88,6 @@ preloadRender = do
|
||||
, _fbo3 = framebuf3
|
||||
, _matUBO = theUBO
|
||||
}
|
||||
|
||||
cornerList :: [[Float]]
|
||||
cornerList =
|
||||
[[-1, 1,0,1]
|
||||
@@ -99,17 +95,6 @@ cornerList =
|
||||
,[-1,-1,0,0]
|
||||
,[ 1,-1,1,0]
|
||||
]
|
||||
-- potential drawing setup
|
||||
---- swapInterval $= ImmediateUpdates
|
||||
-- GL.blend $= GL.Enabled
|
||||
---- GL.depthMask $= GL.Enabled
|
||||
-- GL.blendEquation $= GL.FuncAdd
|
||||
-- GL.blendFunc $= (GL.SrcAlpha,GL.OneMinusSrcAlpha)
|
||||
-- GL.clearColor $= GL.Color4 0 0.5 0 1
|
||||
-- GL.clearDepth $= (200)
|
||||
-- swapInterval $= ImmediateUpdates
|
||||
-- GL.lineSmooth $= GL.Enabled
|
||||
|
||||
--------------------end preloadRender
|
||||
|
||||
setupFramebufferWithStencil :: IO (FramebufferObject, TextureObject,RenderbufferObject)
|
||||
|
||||
@@ -3,11 +3,7 @@ module Shader
|
||||
, bindShaderBuffers
|
||||
, drawShader
|
||||
, drawShaders
|
||||
, setShaderUniforms
|
||||
, resetShaderUniforms
|
||||
, extractProgAndUnis
|
||||
, freeShaderPointers
|
||||
, setPerpMatUniform
|
||||
) where
|
||||
import Geometry.Data
|
||||
import Shader.Data
|
||||
@@ -21,9 +17,6 @@ import Graphics.Rendering.OpenGL hiding (Point,translate,scale,imageHeight)
|
||||
import Linear.Matrix
|
||||
import Linear.V4
|
||||
|
||||
extractProgAndUnis :: FullShader -> (Program,UniformLocation)
|
||||
extractProgAndUnis s = (_shaderProgram s, _shaderMatrixUniform s)
|
||||
|
||||
bindArrayBuffers :: Int -> VBO -> IO ()
|
||||
bindArrayBuffers numVs theVBO = do
|
||||
bindBuffer ArrayBuffer $= Just (_vbo theVBO)
|
||||
@@ -49,49 +42,5 @@ drawShader fs i = do
|
||||
_ -> return ()
|
||||
drawArrays (_shaderDrawPrimitive fs) 0 (fromIntegral i)
|
||||
|
||||
resetShaderUniforms :: [(Program, UniformLocation)] -> IO ()
|
||||
{-# INLINE resetShaderUniforms #-}
|
||||
resetShaderUniforms = setShaderUniforms 0 1 (0,0) (2,2)
|
||||
|
||||
setShaderUniforms :: Float -> Float -> Point2 -> Point2 -> [(Program,UniformLocation)] -> IO ()
|
||||
{-# INLINE setShaderUniforms #-}
|
||||
setShaderUniforms rot czoom (tranx,trany) (winx,winy) fss = do
|
||||
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)
|
||||
let 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)
|
||||
let 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)
|
||||
let wmat = scalMat !*! rotMat !*! tranMat
|
||||
vToL (V4 a b c d) = [a,b,c,d]
|
||||
wmata <- (newMatrix RowMajor $ concatMap vToL $ vToL wmat) :: IO (GLmatrix GLfloat)
|
||||
-- set common uniforms
|
||||
forM_ fss $ \shad -> do
|
||||
currentProgram $= Just (fst shad)
|
||||
uniform (snd shad) $= wmata
|
||||
|
||||
setPerpMatUniform
|
||||
:: Float -- ^ rotation
|
||||
-> Float -- ^ zoom
|
||||
-> Point2 -- ^ translation
|
||||
-> Point2 -- ^ window size
|
||||
-> Point2 -- ^ viewfrom point
|
||||
-> FullShader
|
||||
-> IO ()
|
||||
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 (_shaderMatrixUniform shad) $= pmat
|
||||
return ()
|
||||
|
||||
freeShaderPointers :: FullShader -> IO ()
|
||||
freeShaderPointers fs = free $ _vboPointer $ _vaoVBO $ _shaderVAO fs
|
||||
|
||||
@@ -25,11 +25,10 @@ makeShader
|
||||
-> (RenderType -> [[Float]]) -- ^ Poke strategy: method for creating a list of vertex data to be bound
|
||||
-> IO FullShader
|
||||
makeShader s shaderlist sizes pm renStrat = do
|
||||
(prog,unis) <- makeSourcedShader s shaderlist
|
||||
vaob <- setupVAO sizes
|
||||
prog <- makeSourcedShader s shaderlist
|
||||
vaob <- setupVAO sizes
|
||||
return $ FullShader
|
||||
{ _shaderProgram = prog
|
||||
, _shaderMatrixUniform = unis
|
||||
, _shaderVAO = vaob
|
||||
, _shaderPokeStrategy = renStrat
|
||||
, _shaderDrawPrimitive = pm
|
||||
@@ -40,12 +39,11 @@ makeShader s shaderlist sizes pm renStrat = do
|
||||
-- | Compile shader and get its uniform locations.
|
||||
-- supposes the shader code is in the shader folder, with the string names
|
||||
-- followed by .vert/.geom/.frag.
|
||||
makeSourcedShader :: String -> [ShaderType] -> IO (Program, UniformLocation)
|
||||
makeSourcedShader :: String -> [ShaderType] -> IO Program
|
||||
makeSourcedShader s sts = do
|
||||
sources <- forM sts $ \st -> BS.readFile ("shader/" ++ s ++ shaderTypeExt st)
|
||||
prog <- makeShaderProgram s $ zip sts sources
|
||||
uniformLocations <- uniformLocation prog "worldMat"
|
||||
return (prog,uniformLocations)
|
||||
return prog
|
||||
|
||||
shaderTypeExt :: ShaderType -> String
|
||||
shaderTypeExt VertexShader = ".vert"
|
||||
|
||||
@@ -12,7 +12,6 @@ module Shader.Data
|
||||
, vaoVBO
|
||||
|
||||
, shaderProgram
|
||||
, shaderMatrixUniform
|
||||
, shaderVAO
|
||||
, shaderPokeStrategy
|
||||
, shaderDrawPrimitive
|
||||
@@ -45,7 +44,6 @@ data VBO = VBO
|
||||
{- | Datatype containing the necessary information for a single shader. -}
|
||||
data FullShader = FullShader
|
||||
{ _shaderProgram :: Program
|
||||
, _shaderMatrixUniform :: UniformLocation
|
||||
, _shaderVAO :: VAO
|
||||
, _shaderPokeStrategy :: RenderType -> [[Float]]-- -> F.FoldM IO RenderType Int
|
||||
, _shaderDrawPrimitive :: PrimitiveMode
|
||||
|
||||
Reference in New Issue
Block a user