Cleanup render preload somewhat
This commit is contained in:
+26
-33
@@ -108,39 +108,39 @@ doDrawing' win pdata u = do
|
|||||||
setViewportSize (round winx `div` resFact) (round winy `div` resFact)
|
setViewportSize (round winx `div` resFact) (round winy `div` resFact)
|
||||||
glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase ._1 . unFBO)
|
glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase ._1 . unFBO)
|
||||||
glDepthMask GL_TRUE
|
glDepthMask GL_TRUE
|
||||||
-- the following clear may not be necessary
|
glDisable GL_BLEND
|
||||||
withArray [0, 0, 0, 1] $ \ptr ->
|
glDepthFunc GL_LESS
|
||||||
glClearNamedFramebufferfv
|
|
||||||
(pdata ^. fboBase . _1 . unFBO)
|
|
||||||
GL_COLOR
|
|
||||||
0
|
|
||||||
ptr
|
|
||||||
with 1 $ \ptr ->
|
with 1 $ \ptr ->
|
||||||
glClearNamedFramebufferfv
|
glClearNamedFramebufferfv
|
||||||
(pdata ^. fboBase . _1 . unFBO)
|
(pdata ^. fboBase . _1 . unFBO)
|
||||||
GL_DEPTH
|
GL_DEPTH
|
||||||
0
|
0
|
||||||
ptr
|
ptr
|
||||||
glDepthFunc GL_LESS
|
|
||||||
-- draw wall occlusions from the camera's point of view
|
-- draw wall occlusions from the camera's point of view
|
||||||
glUseProgram (pdata ^. lightingWallShadShader . shaderUINT)
|
unless (debugOn Remove_LOS cfig) $ do
|
||||||
glProgramUniform3f
|
glUseProgram (pdata ^. lightingWallShadShader . shaderUINT)
|
||||||
(pdata ^. lightingWallShadShader . shaderUINT)
|
glProgramUniform3f
|
||||||
0
|
(pdata ^. lightingWallShadShader . shaderUINT)
|
||||||
vfx
|
0
|
||||||
vfy
|
vfx
|
||||||
20
|
vfy
|
||||||
glProgramUniform1f
|
20
|
||||||
(pdata ^. lightingWallShadShader . shaderUINT)
|
glProgramUniform1f
|
||||||
1
|
(pdata ^. lightingWallShadShader . shaderUINT)
|
||||||
1000
|
1
|
||||||
glBindVertexArray $ pdata ^. lightingWallShadShader . shaderVAO . vaoName
|
1000
|
||||||
unless (debugOn Remove_LOS cfig) $
|
glBindVertexArray $ pdata ^. lightingWallShadShader . shaderVAO . vaoName
|
||||||
glDrawArrays
|
glDrawArrays
|
||||||
(_unPrimitiveMode $ pdata ^. lightingWallShadShader . shaderPrimitive)
|
(_unPrimitiveMode $ pdata ^. lightingWallShadShader . shaderPrimitive)
|
||||||
0
|
0
|
||||||
(fromIntegral trueNWalls)
|
(fromIntegral trueNWalls)
|
||||||
-- clear normals
|
-- clear color and normals
|
||||||
|
withArray [0, 0, 0, 1] $ \ptr ->
|
||||||
|
glClearNamedFramebufferfv
|
||||||
|
(pdata ^. fboBase . _1 . unFBO)
|
||||||
|
GL_COLOR
|
||||||
|
0
|
||||||
|
ptr
|
||||||
withArray [0, 0, 0, 0] $ \ptr ->
|
withArray [0, 0, 0, 0] $ \ptr ->
|
||||||
glClearNamedFramebufferfv
|
glClearNamedFramebufferfv
|
||||||
(pdata ^. fboBase . _1 . unFBO)
|
(pdata ^. fboBase . _1 . unFBO)
|
||||||
@@ -148,34 +148,26 @@ doDrawing' win pdata u = do
|
|||||||
2
|
2
|
||||||
ptr
|
ptr
|
||||||
--draw walls onto base buffer
|
--draw walls onto base buffer
|
||||||
glDisable GL_BLEND
|
|
||||||
-- maybe cull faces? maybe do this before?
|
-- maybe cull faces? maybe do this before?
|
||||||
--glEnable GL_CULL_FACE
|
glEnable GL_CULL_FACE
|
||||||
--glCullFace GL_BACK
|
glCullFace GL_BACK
|
||||||
glUseProgram (pdata ^. wallShader . shaderUINT)
|
glUseProgram (pdata ^. wallShader . shaderUINT)
|
||||||
glBindVertexArray $ pdata ^. wallShader . shaderVAO . vaoName
|
glBindVertexArray $ pdata ^. wallShader . shaderVAO . vaoName
|
||||||
glDrawArrays
|
glDrawArrays
|
||||||
(_unPrimitiveMode $ pdata ^. wallShader . shaderPrimitive)
|
(_unPrimitiveMode $ pdata ^. wallShader . shaderPrimitive)
|
||||||
0
|
0
|
||||||
(fromIntegral trueNWalls)
|
(fromIntegral trueNWalls)
|
||||||
--glDisable GL_CULL_FACE
|
--draw object pictures onto base buffer (are there any?!)
|
||||||
-- if cfig ^. graphics_wall_textured
|
|
||||||
-- then renderTextureWalls pdata nWalls
|
|
||||||
-- else renderBlankWalls pdata nWalls
|
|
||||||
--draw object pictures onto base buffer
|
|
||||||
renderLayer BottomLayer shadV layerCounts
|
renderLayer BottomLayer shadV layerCounts
|
||||||
--draw object shapes onto base buffer
|
--draw object shapes onto base buffer
|
||||||
let fs = _shapeShader pdata
|
let fs = _shapeShader pdata
|
||||||
glUseProgram (_shaderUINT fs)
|
glUseProgram (_shaderUINT fs)
|
||||||
glBindVertexArray $ fs ^. shaderVAO . vaoName
|
glBindVertexArray $ fs ^. shaderVAO . vaoName
|
||||||
-- glEnable GL_CULL_FACE
|
|
||||||
-- glCullFace GL_BACK
|
|
||||||
glDrawElements
|
glDrawElements
|
||||||
(_unPrimitiveMode $ _shaderPrimitive fs)
|
(_unPrimitiveMode $ _shaderPrimitive fs)
|
||||||
(fromIntegral nIndices)
|
(fromIntegral nIndices)
|
||||||
GL_UNSIGNED_SHORT
|
GL_UNSIGNED_SHORT
|
||||||
nullPtr
|
nullPtr
|
||||||
glDisable GL_CULL_FACE
|
|
||||||
--draw floor onto base buffer
|
--draw floor onto base buffer
|
||||||
glUseProgram (pdata ^. floorShader . shaderUINT)
|
glUseProgram (pdata ^. floorShader . shaderUINT)
|
||||||
glBindVertexArray $ pdata ^. floorShader . shaderVAO . vaoName
|
glBindVertexArray $ pdata ^. floorShader . shaderVAO . vaoName
|
||||||
@@ -183,6 +175,7 @@ doDrawing' win pdata u = do
|
|||||||
(_unPrimitiveMode $ pdata ^. floorShader . shaderPrimitive)
|
(_unPrimitiveMode $ pdata ^. floorShader . shaderPrimitive)
|
||||||
0
|
0
|
||||||
(fromIntegral nFls)
|
(fromIntegral nFls)
|
||||||
|
glDisable GL_CULL_FACE
|
||||||
glEnable GL_BLEND
|
glEnable GL_BLEND
|
||||||
--draw lightmap into its own buffer
|
--draw lightmap into its own buffer
|
||||||
createLightMap
|
createLightMap
|
||||||
|
|||||||
+16
-34
@@ -46,41 +46,27 @@ preloadRender = do
|
|||||||
|
|
||||||
-- setup shape geometry/cap VBO and two VAOs
|
-- setup shape geometry/cap VBO and two VAOs
|
||||||
shVBO <- setupVBO nShapeVerxComp
|
shVBO <- setupVBO nShapeVerxComp
|
||||||
shPosVAOname <- mglCreate glCreateVertexArrays
|
shPosVAO <- setupVAOUsingVBO [4] shVBO
|
||||||
glBindVertexArray shPosVAOname
|
shEBO <- setupEBO shPosVAO
|
||||||
glVertexArrayVertexBuffer shPosVAOname 0 (shVBO ^. vboName) 0 (fromIntegral $ floatSize * nShapeVerxComp)
|
-- note the shape shader vao is distinct from the position vao, but they
|
||||||
setupVertexAttribPointer shPosVAOname 0 4 0
|
-- share an EBO
|
||||||
let shPosVAO = VAO{_vaoName = shPosVAOname}
|
shapeshader <- makeShaderUsingVBO "shape/basic" [vert, frag] shapeVerxSizes pmTriangles shVBO
|
||||||
|
glVertexArrayElementBuffer (shapeshader ^. shaderVAO . vaoName) (shEBO ^. eboName)
|
||||||
|
|
||||||
--setup silhouette edge VAO
|
--setup silhouette edge VAO
|
||||||
shEBO' <- setupEBO shPosVAO
|
shedgevao <- setupVAOUsingVBO [4] shVBO
|
||||||
shEdgeVAOname <- mglCreate glCreateVertexArrays
|
shedgeebo <- setupEBO shedgevao
|
||||||
glBindVertexArray shEdgeVAOname
|
|
||||||
glVertexArrayVertexBuffer shEdgeVAOname 0 (shVBO ^. vboName) 0 (fromIntegral $ floatSize * nShapeVerxComp)
|
|
||||||
setupVertexAttribPointer shEdgeVAOname 0 4 0
|
|
||||||
--setup ebo for silhouette edges
|
|
||||||
silEBOname <- mglCreate glCreateBuffers
|
|
||||||
silEBOptr <- mallocArray numDrawableElements
|
|
||||||
glVertexArrayElementBuffer shEdgeVAOname silEBOname
|
|
||||||
glNamedBufferData
|
|
||||||
silEBOname
|
|
||||||
( fromIntegral $ glushortSize * numDrawableElements)
|
|
||||||
nullPtr
|
|
||||||
GL_STREAM_DRAW
|
|
||||||
let silEBO = EBO{_eboName = silEBOname, _eboPtr = silEBOptr}
|
|
||||||
shEdgeVAO = VAO{_vaoName = shEdgeVAOname}
|
|
||||||
|
|
||||||
let wallverxstrd = 8
|
let wallverxstrd = 8
|
||||||
wallvbo <- setupVBO wallverxstrd
|
wallvbo <- setupVBO wallverxstrd
|
||||||
lightingWallShadShad <-
|
lightingWallShadShad <-
|
||||||
makeShaderUsingVBO "lighting/wallShadow" [vert, geom, frag] [4] pmPoints wallvbo
|
makeShaderUsingVBO "lighting/wallShadow" [vert, geom] [4] pmPoints wallvbo
|
||||||
|
|
||||||
lightingCapShad <-
|
lightingCapShad <-
|
||||||
makeShaderUsingVAO "lighting/cap" [vert, geom] pmTriangles shPosVAO
|
makeShaderUsingVAO "lighting/cap" [vert, geom] pmTriangles shPosVAO
|
||||||
lightingLineShadowShad <-
|
lightingLineShadowShad <-
|
||||||
makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shEdgeVAO
|
makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shedgevao
|
||||||
|
|
||||||
shadowedgeshader <-
|
shadowedgeshader <-
|
||||||
makeShaderUsingVAO "shadow/edge" [vert, geom] pmLinesAdjacency shEdgeVAO
|
makeShaderUsingVAO "shadow/edge" [vert, geom] pmLinesAdjacency shedgevao
|
||||||
shadowcapshader <-
|
shadowcapshader <-
|
||||||
makeShaderUsingVAO "shadow/cap" [vert, geom] pmTriangles shPosVAO
|
makeShaderUsingVAO "shadow/cap" [vert, geom] pmTriangles shPosVAO
|
||||||
shadowwallshader <-
|
shadowwallshader <-
|
||||||
@@ -93,9 +79,6 @@ preloadRender = do
|
|||||||
|
|
||||||
-- 2D draw shaders
|
-- 2D draw shaders
|
||||||
bslist <- makeShaderVBO "dualTwoD/basic" [vert, frag] [3, 4] pmTriangles
|
bslist <- makeShaderVBO "dualTwoD/basic" [vert, frag] [3, 4] pmTriangles
|
||||||
bslista <- makeShaderUsingVBO "shape/basic" [vert, frag] shapeVerxSizes pmTriangles shVBO
|
|
||||||
glVertexArrayElementBuffer (bslista ^. shaderVAO . vaoName) (shEBO' ^. eboName)
|
|
||||||
--glVertexArrayElementBuffer (bslista ^. shaderVAO . vaoName) shEBOname
|
|
||||||
aslist <- makeShaderVBO "dualTwoD/arc" [vert, frag] [3, 4, 3] pmTriangles
|
aslist <- makeShaderVBO "dualTwoD/arc" [vert, frag] [3, 4, 3] pmTriangles
|
||||||
eslist <- makeShaderVBO "dualTwoD/ellipse" [vert, geom, frag] [3, 4] pmTriangles
|
eslist <- makeShaderVBO "dualTwoD/ellipse" [vert, geom, frag] [3, 4] pmTriangles
|
||||||
cslist <-
|
cslist <-
|
||||||
@@ -131,8 +114,7 @@ preloadRender = do
|
|||||||
let cloudverxsizes = [4,4,4,4]
|
let cloudverxsizes = [4,4,4,4]
|
||||||
cloudvbo <- setupVBO (sum cloudverxsizes)
|
cloudvbo <- setupVBO (sum cloudverxsizes)
|
||||||
(cloudshader, cloudebo)
|
(cloudshader, cloudebo)
|
||||||
<- makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes (sum cloudverxsizes)
|
<- makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes pmTriangles cloudvbo
|
||||||
pmTriangles cloudvbo
|
|
||||||
framebuf2 <- setupTextureFramebuffer 800 600
|
framebuf2 <- setupTextureFramebuffer 800 600
|
||||||
framebuf3 <- setupTextureFramebuffer 800 600
|
framebuf3 <- setupTextureFramebuffer 800 600
|
||||||
|
|
||||||
@@ -171,9 +153,9 @@ preloadRender = do
|
|||||||
return $
|
return $
|
||||||
RenderData
|
RenderData
|
||||||
{ _pictureShaders = shadV
|
{ _pictureShaders = shadV
|
||||||
, _shapeShader = bslista -- & shaderVAO' .~ shPosColVAO
|
, _shapeShader = shapeshader -- & shaderVAO' .~ shPosColVAO
|
||||||
, _shapeEBO = shEBO'
|
, _shapeEBO = shEBO
|
||||||
, _silhouetteEBO = silEBO
|
, _silhouetteEBO = shedgeebo
|
||||||
, _lightingCapShader = lightingCapShad
|
, _lightingCapShader = lightingCapShad
|
||||||
, _lightingLineShadowShader = lightingLineShadowShad
|
, _lightingLineShadowShader = lightingLineShadowShad
|
||||||
, _lightingWallShadShader = lightingWallShadShad
|
, _lightingWallShadShader = lightingWallShadShad
|
||||||
|
|||||||
@@ -67,10 +67,6 @@ renderLightingNoShadows positiontexture normaltexture lightPoints pdata = do
|
|||||||
GL_COLOR
|
GL_COLOR
|
||||||
0
|
0
|
||||||
ptr
|
ptr
|
||||||
-- for each of the lights:
|
|
||||||
-- 1. stencil out the shadows from this light's point of view
|
|
||||||
-- 2. calculate lighting based on each fragment's position
|
|
||||||
-- to consider: adding normals/a "material" for each fragment
|
|
||||||
glBlendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
|
glBlendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
|
||||||
glEnable GL_STENCIL_TEST
|
glEnable GL_STENCIL_TEST
|
||||||
glStencilOpSeparate GL_FRONT GL_KEEP GL_KEEP GL_INCR_WRAP
|
glStencilOpSeparate GL_FRONT GL_KEEP GL_KEEP GL_INCR_WRAP
|
||||||
|
|||||||
+13
-19
@@ -8,7 +8,7 @@ module Shader.Compile (
|
|||||||
makeShaderSized,
|
makeShaderSized,
|
||||||
makeShaderUsingVAO,
|
makeShaderUsingVAO,
|
||||||
setupVAO,
|
setupVAO,
|
||||||
setupVAOvbo,
|
setupVAOUsingVBO,
|
||||||
setupVAOvbo',
|
setupVAOvbo',
|
||||||
setupEBO,
|
setupEBO,
|
||||||
setupVertexAttribPointer,
|
setupVertexAttribPointer,
|
||||||
@@ -59,17 +59,14 @@ makeShaderEBO ::
|
|||||||
[GLenum] ->
|
[GLenum] ->
|
||||||
-- | The input vertex sizes
|
-- | The input vertex sizes
|
||||||
[Int] ->
|
[Int] ->
|
||||||
-- | The stride
|
|
||||||
Int ->
|
|
||||||
PrimitiveMode ->
|
PrimitiveMode ->
|
||||||
VBO ->
|
VBO ->
|
||||||
IO (Shader, EBO)
|
IO (Shader, EBO)
|
||||||
makeShaderEBO s shaderlist sizes strd pm vbo = do
|
makeShaderEBO s shaderlist sizes pm vbo = do
|
||||||
prog <- makeSourcedShader s shaderlist
|
shad <- makeShaderUsingVBO s shaderlist sizes pm vbo
|
||||||
vao <- setupVAOvbo sizes strd vbo
|
ebo <- setupEBO (shad ^. shaderVAO)
|
||||||
ebo <- setupEBO vao
|
glVertexArrayElementBuffer (shad ^. shaderVAO . vaoName) (ebo ^. eboName)
|
||||||
return
|
return ( shad
|
||||||
( Shader prog pm vao
|
|
||||||
, ebo
|
, ebo
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -84,10 +81,7 @@ makeShaderUsingVBO ::
|
|||||||
VBO ->
|
VBO ->
|
||||||
IO Shader
|
IO Shader
|
||||||
makeShaderUsingVBO s shaderlist sizes pm vbo = do
|
makeShaderUsingVBO s shaderlist sizes pm vbo = do
|
||||||
let strd = vbo ^. vboVertexSize
|
vao <- setupVAOUsingVBO sizes vbo
|
||||||
when (strd < sum sizes) $
|
|
||||||
error "Tried to assign vertex attributes to VBO with too small a stride."
|
|
||||||
vao <- setupVAOvbo sizes strd vbo
|
|
||||||
makeShaderUsingVAO s shaderlist pm vao
|
makeShaderUsingVAO s shaderlist pm vao
|
||||||
|
|
||||||
setupVBO :: Int -> IO VBO
|
setupVBO :: Int -> IO VBO
|
||||||
@@ -205,15 +199,15 @@ setupVAOvbo' sizes strd vbo = do
|
|||||||
{ _vaoName = vaoname
|
{ _vaoName = vaoname
|
||||||
}
|
}
|
||||||
|
|
||||||
setupVAOvbo :: [Int] -> Int -> VBO -> IO VAO
|
setupVAOUsingVBO :: [Int] -> VBO -> IO VAO
|
||||||
setupVAOvbo sizes strd vbo = do
|
setupVAOUsingVBO sizes vbo = do
|
||||||
|
let strd = vbo ^. vboVertexSize
|
||||||
|
when (strd < sum sizes) $
|
||||||
|
error "Tried to assign vertex attributes to VBO with too small a stride."
|
||||||
vaoname <- mglCreate glCreateVertexArrays
|
vaoname <- mglCreate glCreateVertexArrays
|
||||||
glBindVertexArray vaoname
|
glBindVertexArray vaoname
|
||||||
setupVertexAttribs vbo vaoname sizes strd
|
setupVertexAttribs vbo vaoname sizes strd
|
||||||
return $
|
return VAO { _vaoName = vaoname }
|
||||||
VAO
|
|
||||||
{ _vaoName = vaoname
|
|
||||||
}
|
|
||||||
|
|
||||||
setupEBO :: VAO -> IO EBO
|
setupEBO :: VAO -> IO EBO
|
||||||
setupEBO vao = do
|
setupEBO vao = do
|
||||||
|
|||||||
Reference in New Issue
Block a user