Upload wall geometry once per frame (can improve for fixed geometry)

This commit is contained in:
jgk
2021-07-11 17:32:23 +02:00
parent 37d3e0ce63
commit 26c6c3e426
4 changed files with 77 additions and 57 deletions
+31 -16
View File
@@ -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