Upload wall geometry once per frame (can improve for fixed geometry)
This commit is contained in:
+31
-16
@@ -10,6 +10,7 @@ import Shader
|
||||
import Shader.Data
|
||||
import Shader.Compile
|
||||
import Shader.AuxAddition
|
||||
import Shader.Parameters
|
||||
import Data.Preload.Render
|
||||
|
||||
import Graphics.Rendering.OpenGL hiding (Point,translate,scale,imageHeight)
|
||||
@@ -19,22 +20,39 @@ import Foreign
|
||||
|
||||
preloadRender :: IO RenderData
|
||||
preloadRender = do
|
||||
|
||||
-- set up uniform buffer object
|
||||
theUBO <- genObjectName
|
||||
bindBuffer UniformBuffer $= Just theUBO
|
||||
bufferData UniformBuffer $= (64, nullPtr, DynamicDraw)
|
||||
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
|
||||
>>= addUniforms ["lightPos"]
|
||||
wlLightShad
|
||||
<- makeShaderUsingShaderVAO "lighting/wall" [vert,geom,frag] EPoints wsShad
|
||||
>>= addUniforms ["lightPos","radLum"]
|
||||
-- wlLightShad
|
||||
-- <- makeShader "lighting/wall" [vert,geom,frag] [4] EPoints pokeWPStrat
|
||||
-- >>= addUniforms ["lightPos","radLum"]
|
||||
lightingSurfaceShad
|
||||
<- makeShader "lighting/surface" [vert,frag] [3] ETriangles poke3
|
||||
>>= addUniforms ["lightPos","radLum"]
|
||||
@@ -58,12 +76,9 @@ preloadRender = do
|
||||
fsShad <- makeShader "texture/simple" [vert,frag] [2,2] ETriangleStrip $ const cornerList
|
||||
-- note we directly poke the shader vertex data here
|
||||
pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO fsShad) $ concat cornerList
|
||||
bloomBlurShad <- makeShader "texture/bloomBlur" [vert,frag] [2,2] ETriangleStrip $ const cornerList
|
||||
pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO bloomBlurShad) $ concat cornerList
|
||||
colorBlurShad <- makeShader "texture/colorBlur" [vert,frag] [2,2] ETriangleStrip $ const cornerList
|
||||
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
|
||||
bloomBlurShad <- makeShaderUsingShaderVAO "texture/bloomBlur" [vert,frag] ETriangleStrip fsShad
|
||||
colorBlurShad <- makeShaderUsingShaderVAO "texture/colorBlur" [vert,frag] ETriangleStrip fsShad
|
||||
grayscaleShad <- makeShaderUsingShaderVAO "texture/grayscale" [vert,frag] ETriangleStrip fsShad
|
||||
barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints pokeRadDist
|
||||
-- blank wallShader
|
||||
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
|
||||
>>= addTextureArray "data/texture/ayene_wooden_floor.png"
|
||||
-- bind fixed vertex data
|
||||
bindShaderBuffers [fsShad,bloomBlurShad,colorBlurShad,fullscreenAlphaHalveShad] [4,4,4,4]
|
||||
bindShaderBuffers [fsShad,fullscreenAlphaHalveShad] [4,4]
|
||||
-- framebuffer for lighting
|
||||
(fbo,fboTO,fboRBO) <- setupFramebufferWithStencil
|
||||
framebuf2 <- setupFramebufferWithStencil
|
||||
@@ -110,10 +125,10 @@ preloadRender = do
|
||||
[bslist,lslist,cslist,aslist,eslist,bezierQuadShader,basicTweakZShad]
|
||||
, _lightingSurfaceShader = lightingSurfaceShad
|
||||
, _lightingLineShadowShader = lightingLineShadowShad
|
||||
, _lightingOccludeShader = wsShad
|
||||
, _lightingWallShader = wlLightShad
|
||||
, _wallBlankShader = wlBlank
|
||||
, _wallTextureShader = wlTexture
|
||||
, _lightingOccludeShader = wsShad {_shaderVAO = wpVAO}
|
||||
, _lightingWallShader = wlLightShad {_shaderVAO = wpVAO}
|
||||
, _wallBlankShader = wlBlank { _shaderVAO = wpColVAO }
|
||||
, _wallTextureShader = wlTexture { _shaderVAO = wpColVAO }
|
||||
, _textureShader = textShad
|
||||
, _textureArrayShader = textArrayShad
|
||||
, _fullscreenShader = fsShad
|
||||
|
||||
Reference in New Issue
Block a user