Upload wall geometry once per frame (can improve for fixed geometry)
This commit is contained in:
+23
-13
@@ -54,7 +54,10 @@ doDrawing pdata w = do
|
|||||||
--viewFroms@(viewFromx,viewFromy) = _cameraViewFrom w
|
--viewFroms@(viewFromx,viewFromy) = _cameraViewFrom w
|
||||||
viewFroms = _cameraViewFrom w
|
viewFroms = _cameraViewFrom w
|
||||||
pic = worldPictures w
|
pic = worldPictures w
|
||||||
wallPoints = map fst wallPointsCol
|
|
||||||
|
-- bind wall points and colors to vbo
|
||||||
|
nWalls <- F.foldM (pokeShader $ _wallTextureShader pdata) (map Render22x4 wallPointsCol)
|
||||||
|
bindShaderBuffers [_wallTextureShader pdata] [nWalls]
|
||||||
-- set the coordinate uniform ready for drawing elements using world coordinates
|
-- set the coordinate uniform ready for drawing elements using world coordinates
|
||||||
bufferUBO $ perspectiveMatrixb rot camzoom trans wins viewFroms
|
bufferUBO $ perspectiveMatrixb rot camzoom trans wins viewFroms
|
||||||
bindFramebuffer Framebuffer $= (fst $ _fboBase pdata)
|
bindFramebuffer Framebuffer $= (fst $ _fboBase pdata)
|
||||||
@@ -62,8 +65,8 @@ doDrawing pdata w = do
|
|||||||
clear [ColorBuffer,DepthBuffer]
|
clear [ColorBuffer,DepthBuffer]
|
||||||
depthFunc $= Just Less
|
depthFunc $= Just Less
|
||||||
if w ^. config . wall_textured
|
if w ^. config . wall_textured
|
||||||
then renderTextureWalls pdata wallPointsCol
|
then renderTextureWalls pdata nWalls
|
||||||
else renderBlankWalls pdata wallPointsCol
|
else renderBlankWalls pdata nWalls
|
||||||
-- _ <- setWallDepth pdata wallPoints (viewFromx,viewFromy)
|
-- _ <- setWallDepth pdata wallPoints (viewFromx,viewFromy)
|
||||||
_ <- renderFoldable pdata $ picToLTree (Just 0) (polysToPic $ foregroundPics w)
|
_ <- renderFoldable pdata $ picToLTree (Just 0) (polysToPic $ foregroundPics w)
|
||||||
_ <- renderFoldable pdata $ picToLTree (Just 0) pic
|
_ <- renderFoldable pdata $ picToLTree (Just 0) pic
|
||||||
@@ -108,8 +111,8 @@ doDrawing pdata w = do
|
|||||||
|
|
||||||
bindFramebuffer Framebuffer $= (fst $ _fboLighting pdata)
|
bindFramebuffer Framebuffer $= (fst $ _fboLighting pdata)
|
||||||
let scPol = screenPolygon w
|
let scPol = screenPolygon w
|
||||||
createLightMap pdata (w ^. config . shadow_resolution) wallPoints lightPoints
|
createLightMap pdata (w ^. config . shadow_resolution) lightPoints
|
||||||
(foregroundPics w) scPol
|
(foregroundPics w) scPol nWalls
|
||||||
colorMask $= Color4 Enabled Enabled Enabled Enabled
|
colorMask $= Color4 Enabled Enabled Enabled Enabled
|
||||||
clearColor $= Color4 0 0 0 0
|
clearColor $= Color4 0 0 0 0
|
||||||
|
|
||||||
@@ -136,7 +139,7 @@ doDrawing pdata w = do
|
|||||||
|
|
||||||
depthFunc $= Just Lequal
|
depthFunc $= Just Lequal
|
||||||
_ <- renderFoldable pdata $ picToLTree (Just 2) pic
|
_ <- renderFoldable pdata $ picToLTree (Just 2) pic
|
||||||
renderBlankWalls pdata windowPoints
|
renderWindows pdata windowPoints
|
||||||
|
|
||||||
depthFunc $= Just Always
|
depthFunc $= Just Always
|
||||||
blendFunc $= (One,Zero)
|
blendFunc $= (One,Zero)
|
||||||
@@ -208,11 +211,21 @@ bufferUBO mat = withArray mat $ \ptr ->
|
|||||||
bufferSubData UniformBuffer WriteToBuffer 0 64 ptr
|
bufferSubData UniformBuffer WriteToBuffer 0 64 ptr
|
||||||
|
|
||||||
renderBlankWalls
|
renderBlankWalls
|
||||||
|
:: RenderData
|
||||||
|
-> Int -- ^ number of walls
|
||||||
|
-- -> GLmatrix GLfloat
|
||||||
|
-> IO ()
|
||||||
|
renderBlankWalls pdata nWalls = do
|
||||||
|
cullFace $= Just Back
|
||||||
|
drawShader (_wallBlankShader pdata) nWalls
|
||||||
|
cullFace $= Nothing
|
||||||
|
|
||||||
|
renderWindows
|
||||||
:: RenderData
|
:: RenderData
|
||||||
-> [((Point2,Point2),Point4)] -- ^ List: wall positions and color
|
-> [((Point2,Point2),Point4)] -- ^ List: wall positions and color
|
||||||
-- -> GLmatrix GLfloat
|
-- -> GLmatrix GLfloat
|
||||||
-> IO ()
|
-> IO ()
|
||||||
renderBlankWalls pdata wps = do
|
renderWindows pdata wps = do
|
||||||
n <- F.foldM (pokeShader $ _wallBlankShader pdata) (map Render22x4 wps)
|
n <- F.foldM (pokeShader $ _wallBlankShader pdata) (map Render22x4 wps)
|
||||||
bindShaderBuffers [_wallBlankShader pdata] [n]
|
bindShaderBuffers [_wallBlankShader pdata] [n]
|
||||||
currentProgram $= Just (_shaderProgram $ _wallBlankShader pdata)
|
currentProgram $= Just (_shaderProgram $ _wallBlankShader pdata)
|
||||||
@@ -222,12 +235,9 @@ renderBlankWalls pdata wps = do
|
|||||||
|
|
||||||
renderTextureWalls
|
renderTextureWalls
|
||||||
:: RenderData
|
:: RenderData
|
||||||
-> [((Point2,Point2),Point4)] -- ^ List: wall positions and color
|
-> Int -- ^ number of walls
|
||||||
-> IO ()
|
-> IO ()
|
||||||
renderTextureWalls pdata wps = do
|
renderTextureWalls pdata nWalls = do
|
||||||
n <- F.foldM (pokeShader $ _wallTextureShader pdata) (map Render22x4 wps)
|
|
||||||
bindShaderBuffers [_wallTextureShader pdata] [n]
|
|
||||||
currentProgram $= Just (_shaderProgram $ _wallTextureShader pdata)
|
|
||||||
cullFace $= Just Back
|
cullFace $= Just Back
|
||||||
drawShader (_wallTextureShader pdata) n
|
drawShader (_wallTextureShader pdata) nWalls
|
||||||
cullFace $= Nothing
|
cullFace $= Nothing
|
||||||
|
|||||||
+30
-15
@@ -10,6 +10,7 @@ import Shader
|
|||||||
import Shader.Data
|
import Shader.Data
|
||||||
import Shader.Compile
|
import Shader.Compile
|
||||||
import Shader.AuxAddition
|
import Shader.AuxAddition
|
||||||
|
import Shader.Parameters
|
||||||
import Data.Preload.Render
|
import Data.Preload.Render
|
||||||
|
|
||||||
import Graphics.Rendering.OpenGL hiding (Point,translate,scale,imageHeight)
|
import Graphics.Rendering.OpenGL hiding (Point,translate,scale,imageHeight)
|
||||||
@@ -19,12 +20,32 @@ import Foreign
|
|||||||
|
|
||||||
preloadRender :: IO RenderData
|
preloadRender :: IO RenderData
|
||||||
preloadRender = do
|
preloadRender = do
|
||||||
|
|
||||||
-- set up uniform buffer object
|
-- set up uniform buffer object
|
||||||
theUBO <- genObjectName
|
theUBO <- genObjectName
|
||||||
bindBuffer UniformBuffer $= Just theUBO
|
bindBuffer UniformBuffer $= Just theUBO
|
||||||
bufferData UniformBuffer $= (64, nullPtr, DynamicDraw)
|
bufferData UniformBuffer $= (64, nullPtr, DynamicDraw)
|
||||||
bindBufferBase IndexedUniformBuffer 0 $= Just theUBO
|
bindBufferBase IndexedUniformBuffer 0 $= Just theUBO
|
||||||
|
-- setup wall points VBO, VAOs and shaders
|
||||||
|
wpVBOname <- genObjectName
|
||||||
|
wpVBOptr <- mallocArray (8 * numDrawableElements)
|
||||||
|
bindBuffer ArrayBuffer $= Just wpVBOname
|
||||||
|
bufferData ArrayBuffer $=
|
||||||
|
(fromIntegral $ floatSize * numDrawableElements * 8
|
||||||
|
, nullPtr
|
||||||
|
, DynamicDraw
|
||||||
|
)
|
||||||
|
let wpVBO = VBO {_vbo = wpVBOname, _vboPointer = wpVBOptr, _vboAttribSizes = [4,4]}
|
||||||
|
wpVAOname <- genObjectName
|
||||||
|
bindVertexArrayObject $= Just wpVAOname
|
||||||
|
bindBuffer ArrayBuffer $= Just wpVBOname
|
||||||
|
setupVertexAttribPointer 0 4 8 0
|
||||||
|
wpColVAOname <- genObjectName
|
||||||
|
bindVertexArrayObject $= Just wpColVAOname
|
||||||
|
bindBuffer ArrayBuffer $= Just wpVBOname
|
||||||
|
setupVertexAttribPointer 0 4 8 0
|
||||||
|
setupVertexAttribPointer 1 4 8 4
|
||||||
|
let wpVAO = VAO {_vao = wpVAOname, _vaoVBO = wpVBO}
|
||||||
|
wpColVAO = VAO {_vao = wpColVAOname, _vaoVBO = wpVBO}
|
||||||
|
|
||||||
-- lighting shaders
|
-- lighting shaders
|
||||||
wsShad <- makeShader "lighting/occlude" [vert,geom,frag] [4] EPoints pokeWPStrat
|
wsShad <- makeShader "lighting/occlude" [vert,geom,frag] [4] EPoints pokeWPStrat
|
||||||
@@ -32,9 +53,6 @@ preloadRender = do
|
|||||||
wlLightShad
|
wlLightShad
|
||||||
<- makeShaderUsingShaderVAO "lighting/wall" [vert,geom,frag] EPoints wsShad
|
<- makeShaderUsingShaderVAO "lighting/wall" [vert,geom,frag] EPoints wsShad
|
||||||
>>= addUniforms ["lightPos","radLum"]
|
>>= addUniforms ["lightPos","radLum"]
|
||||||
-- wlLightShad
|
|
||||||
-- <- makeShader "lighting/wall" [vert,geom,frag] [4] EPoints pokeWPStrat
|
|
||||||
-- >>= addUniforms ["lightPos","radLum"]
|
|
||||||
lightingSurfaceShad
|
lightingSurfaceShad
|
||||||
<- makeShader "lighting/surface" [vert,frag] [3] ETriangles poke3
|
<- makeShader "lighting/surface" [vert,frag] [3] ETriangles poke3
|
||||||
>>= addUniforms ["lightPos","radLum"]
|
>>= addUniforms ["lightPos","radLum"]
|
||||||
@@ -58,12 +76,9 @@ preloadRender = do
|
|||||||
fsShad <- makeShader "texture/simple" [vert,frag] [2,2] ETriangleStrip $ const cornerList
|
fsShad <- makeShader "texture/simple" [vert,frag] [2,2] ETriangleStrip $ const cornerList
|
||||||
-- note we directly poke the shader vertex data here
|
-- note we directly poke the shader vertex data here
|
||||||
pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO fsShad) $ concat cornerList
|
pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO fsShad) $ concat cornerList
|
||||||
bloomBlurShad <- makeShader "texture/bloomBlur" [vert,frag] [2,2] ETriangleStrip $ const cornerList
|
bloomBlurShad <- makeShaderUsingShaderVAO "texture/bloomBlur" [vert,frag] ETriangleStrip fsShad
|
||||||
pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO bloomBlurShad) $ concat cornerList
|
colorBlurShad <- makeShaderUsingShaderVAO "texture/colorBlur" [vert,frag] ETriangleStrip fsShad
|
||||||
colorBlurShad <- makeShader "texture/colorBlur" [vert,frag] [2,2] ETriangleStrip $ const cornerList
|
grayscaleShad <- makeShaderUsingShaderVAO "texture/grayscale" [vert,frag] ETriangleStrip fsShad
|
||||||
pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO colorBlurShad) $ concat cornerList
|
|
||||||
grayscaleShad <- makeShader "texture/grayscale" [vert,frag] [2,2] ETriangleStrip $ const cornerList
|
|
||||||
pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO grayscaleShad) $ concat cornerList
|
|
||||||
barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints pokeRadDist
|
barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints pokeRadDist
|
||||||
-- blank wallShader
|
-- blank wallShader
|
||||||
wlBlank <- makeShader "wall/blank" [vert,geom,frag] [4,4] EPoints pokeWPColStrat
|
wlBlank <- makeShader "wall/blank" [vert,geom,frag] [4,4] EPoints pokeWPColStrat
|
||||||
@@ -77,7 +92,7 @@ preloadRender = do
|
|||||||
textArrayShad <- makeShader "texture/array" [vert,frag] [3,3] ETriangles poke33
|
textArrayShad <- makeShader "texture/array" [vert,frag] [3,3] ETriangles poke33
|
||||||
>>= addTextureArray "data/texture/ayene_wooden_floor.png"
|
>>= addTextureArray "data/texture/ayene_wooden_floor.png"
|
||||||
-- bind fixed vertex data
|
-- bind fixed vertex data
|
||||||
bindShaderBuffers [fsShad,bloomBlurShad,colorBlurShad,fullscreenAlphaHalveShad] [4,4,4,4]
|
bindShaderBuffers [fsShad,fullscreenAlphaHalveShad] [4,4]
|
||||||
-- framebuffer for lighting
|
-- framebuffer for lighting
|
||||||
(fbo,fboTO,fboRBO) <- setupFramebufferWithStencil
|
(fbo,fboTO,fboRBO) <- setupFramebufferWithStencil
|
||||||
framebuf2 <- setupFramebufferWithStencil
|
framebuf2 <- setupFramebufferWithStencil
|
||||||
@@ -110,10 +125,10 @@ preloadRender = do
|
|||||||
[bslist,lslist,cslist,aslist,eslist,bezierQuadShader,basicTweakZShad]
|
[bslist,lslist,cslist,aslist,eslist,bezierQuadShader,basicTweakZShad]
|
||||||
, _lightingSurfaceShader = lightingSurfaceShad
|
, _lightingSurfaceShader = lightingSurfaceShad
|
||||||
, _lightingLineShadowShader = lightingLineShadowShad
|
, _lightingLineShadowShader = lightingLineShadowShad
|
||||||
, _lightingOccludeShader = wsShad
|
, _lightingOccludeShader = wsShad {_shaderVAO = wpVAO}
|
||||||
, _lightingWallShader = wlLightShad
|
, _lightingWallShader = wlLightShad {_shaderVAO = wpVAO}
|
||||||
, _wallBlankShader = wlBlank
|
, _wallBlankShader = wlBlank { _shaderVAO = wpColVAO }
|
||||||
, _wallTextureShader = wlTexture
|
, _wallTextureShader = wlTexture { _shaderVAO = wpColVAO }
|
||||||
, _textureShader = textShad
|
, _textureShader = textShad
|
||||||
, _textureArrayShader = textArrayShad
|
, _textureArrayShader = textArrayShad
|
||||||
, _fullscreenShader = fsShad
|
, _fullscreenShader = fsShad
|
||||||
|
|||||||
+22
-28
@@ -22,26 +22,26 @@ import Data.Tuple.Extra
|
|||||||
--import qualified Data.IntMap.Strict as IM
|
--import qualified Data.IntMap.Strict as IM
|
||||||
import qualified SDL
|
import qualified SDL
|
||||||
|
|
||||||
setWallDepth
|
--setWallDepth
|
||||||
:: RenderData
|
-- :: RenderData
|
||||||
-> [(Point2,Point2)] -- ^ Wall points
|
-- -> [(Point2,Point2)] -- ^ Wall points
|
||||||
-> (Float,Float) -- ^ View from point
|
-- -> (Float,Float) -- ^ View from point
|
||||||
-> IO Word32
|
-- -> IO Word32
|
||||||
setWallDepth pdata wallPoints (viewFromx,viewFromy) = do
|
--setWallDepth pdata wallPoints (viewFromx,viewFromy) = do
|
||||||
startTicks <- SDL.ticks
|
-- startTicks <- SDL.ticks
|
||||||
colorMask $= Color4 Disabled Disabled Disabled Disabled
|
-- colorMask $= Color4 Disabled Disabled Disabled Disabled
|
||||||
nWalls <- F.foldM (pokeShader $ _lightingOccludeShader pdata) (map Render22 wallPoints)
|
-- nWalls <- F.foldM (pokeShader $ _lightingOccludeShader pdata) (map Render22 wallPoints)
|
||||||
bindShaderBuffers [_lightingOccludeShader pdata] [nWalls]
|
-- bindShaderBuffers [_lightingOccludeShader pdata] [nWalls]
|
||||||
|
--
|
||||||
currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata)
|
-- currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata)
|
||||||
-- reseting this uniform appears to be necessary
|
-- -- reseting this uniform appears to be necessary
|
||||||
uniform (head $ _shaderCustomUnis $ _lightingOccludeShader pdata)
|
-- uniform (head $ _shaderCustomUnis $ _lightingOccludeShader pdata)
|
||||||
$= Vector2 viewFromx viewFromy
|
-- $= Vector2 viewFromx viewFromy
|
||||||
-- cullFace $= Just Front
|
---- cullFace $= Just Front
|
||||||
drawShader (_lightingOccludeShader pdata) nWalls
|
-- drawShader (_lightingOccludeShader pdata) nWalls
|
||||||
colorMask $= Color4 Enabled Enabled Enabled Enabled
|
-- colorMask $= Color4 Enabled Enabled Enabled Enabled
|
||||||
endTicks <- SDL.ticks
|
-- endTicks <- SDL.ticks
|
||||||
return $ endTicks - startTicks
|
-- return $ endTicks - startTicks
|
||||||
|
|
||||||
divideSize :: Int -> Size -> Size
|
divideSize :: Int -> Size -> Size
|
||||||
divideSize i (Size x y) = Size (div x $ fromIntegral i) (div y $ fromIntegral i)
|
divideSize i (Size x y) = Size (div x $ fromIntegral i) (div y $ fromIntegral i)
|
||||||
@@ -55,12 +55,12 @@ Determine where light is shining in the world.
|
|||||||
createLightMap
|
createLightMap
|
||||||
:: RenderData
|
:: RenderData
|
||||||
-> Int -- Resolution division
|
-> Int -- Resolution division
|
||||||
-> [(Point2,Point2)] -- Wall pairs
|
|
||||||
-> [(Point3,Float,Float)] -- Lights
|
-> [(Point3,Float,Float)] -- Lights
|
||||||
-> [Polyhedra] -- foreground geometry
|
-> [Polyhedra] -- foreground geometry
|
||||||
-> [Point2]
|
-> [Point2]
|
||||||
|
-> Int -- ^ number of walls
|
||||||
-> IO ()
|
-> IO ()
|
||||||
createLightMap pdata resDiv wallPoints lightPoints fpics scPol = do
|
createLightMap pdata resDiv lightPoints fpics scPol nWalls = do
|
||||||
depthFunc $= Just Less
|
depthFunc $= Just Less
|
||||||
-- get viewport size so we can reset it later
|
-- get viewport size so we can reset it later
|
||||||
(vppos,vpsize) <- get viewport
|
(vppos,vpsize) <- get viewport
|
||||||
@@ -68,11 +68,6 @@ createLightMap pdata resDiv wallPoints lightPoints fpics scPol = do
|
|||||||
let vsize = divideSize resDiv vpsize
|
let vsize = divideSize resDiv vpsize
|
||||||
viewport $= (vppos, vsize)
|
viewport $= (vppos, vsize)
|
||||||
textureBinding Texture2D $= Just (snd $ _fboLighting pdata)
|
textureBinding Texture2D $= Just (snd $ _fboLighting pdata)
|
||||||
-- store wall and light positions into buffer
|
|
||||||
-- nWallLights <- F.foldM (pokeShader $ _lightingWallShader pdata) (map Render22 wallPoints)
|
|
||||||
-- bindShaderBuffers [_lightingWallShader pdata] [nWallLights]
|
|
||||||
nWalls <- F.foldM (pokeShader $ _lightingOccludeShader pdata) (map Render22 wallPoints)
|
|
||||||
bindShaderBuffers [_lightingOccludeShader pdata] [nWalls]
|
|
||||||
-- store foreground silhouette geometry into buffer
|
-- store foreground silhouette geometry into buffer
|
||||||
nSils <- F.foldM (pokeShader $ _lightingLineShadowShader pdata) (concatMap polyToRender fpics)
|
nSils <- F.foldM (pokeShader $ _lightingLineShadowShader pdata) (concatMap polyToRender fpics)
|
||||||
bindShaderBuffers [_lightingLineShadowShader pdata] [nSils]
|
bindShaderBuffers [_lightingLineShadowShader pdata] [nSils]
|
||||||
@@ -152,7 +147,6 @@ createLightMap pdata resDiv wallPoints lightPoints fpics scPol = do
|
|||||||
$= Vector3 x y z
|
$= Vector3 x y z
|
||||||
uniform (_shaderCustomUnis (_lightingWallShader pdata) !! 1)
|
uniform (_shaderCustomUnis (_lightingWallShader pdata) !! 1)
|
||||||
$= Vector2 r lum
|
$= Vector2 r lum
|
||||||
--drawShader (_lightingWallShader pdata) nWallLights
|
|
||||||
drawShader (_lightingWallShader pdata) nWalls
|
drawShader (_lightingWallShader pdata) nWalls
|
||||||
cullFace $= Nothing
|
cullFace $= Nothing
|
||||||
stencilTest $= Disabled
|
stencilTest $= Disabled
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ module Shader.Compile
|
|||||||
, makeShaderUsingShaderVAO
|
, makeShaderUsingShaderVAO
|
||||||
, makeSourcedShader
|
, makeSourcedShader
|
||||||
, setupVAO
|
, setupVAO
|
||||||
|
, setupVertexAttribPointer
|
||||||
) where
|
) where
|
||||||
import Shader.Data
|
import Shader.Data
|
||||||
import Shader.Parameters
|
import Shader.Parameters
|
||||||
|
|||||||
Reference in New Issue
Block a user