Cleanup some silhouette edge buffers

This commit is contained in:
2025-11-11 17:45:30 +00:00
parent 4d59d521ac
commit ceba6fd533
6 changed files with 39 additions and 52 deletions
+4 -4
View File
@@ -27,8 +27,8 @@ data RenderData = RenderData
, _barrelShader :: (Shader,VBO) , _barrelShader :: (Shader,VBO)
, _grayscaleShader :: Shader , _grayscaleShader :: Shader
, _shapeShader :: Shader , _shapeShader :: Shader
, _shapeEBO :: EBO , _shapeEBO :: UintBO
, _silhouetteEBO :: EBO , _silhouetteEBO :: UintBO
, _pictureShaders :: MV.MVector (PrimState IO) (Shader,VBO) , _pictureShaders :: MV.MVector (PrimState IO) (Shader,VBO)
, _fbo2 :: (FBO, TO) , _fbo2 :: (FBO, TO)
, _fbo3 :: (FBO, TO) , _fbo3 :: (FBO, TO)
@@ -46,7 +46,7 @@ data RenderData = RenderData
, _wallSSBO :: GLuint , _wallSSBO :: GLuint
, _shapeSSBO :: GLuint , _shapeSSBO :: GLuint
, _ishapeSSBO :: GLuint , _ishapeSSBO :: GLuint
, _ieshapeSSBO :: GLuint -- , _ieshapeSSBO :: GLuint
-- , _lightsUBO :: GLuint -- BufferObject id -- , _lightsUBO :: GLuint -- BufferObject id
, _vboWindows :: VBO , _vboWindows :: VBO
, _vboShapes :: VBO , _vboShapes :: VBO
@@ -58,7 +58,7 @@ data RenderData = RenderData
-- , _wallShader :: Shader -- , _wallShader :: Shader
, _cloudVBO :: VBO , _cloudVBO :: VBO
, _cloudShader :: Shader , _cloudShader :: Shader
, _cloudEBO :: EBO , _cloudEBO :: UintBO
, _screenTextureVAO :: VAO , _screenTextureVAO :: VAO
, _dummyVAO :: VAO , _dummyVAO :: VAO
} }
+10 -28
View File
@@ -77,36 +77,33 @@ doDrawing' win pdata u = do
( pokeShape ( pokeShape
(drawShadowsByImportance $ cfig ^. gr_shadow_size) (drawShadowsByImportance $ cfig ^. gr_shadow_size)
(_vboPtr $ _vboShapes pdata) (_vboPtr $ _vboShapes pdata)
(_eboPtr $ _shapeEBO pdata) (_uiboPtr $ _shapeEBO pdata)
(_eboPtr $ _silhouetteEBO pdata) (_uiboPtr $ _silhouetteEBO pdata)
(0, 0, 0) (0, 0, 0)
ws ws
) )
(nCloudVs', nCloudIs') <- (nCloudVs', nCloudIs') <-
-- Might want to sort the clouds based on z depth, not sure -- Might want to sort the clouds based on z depth, not sure
V.foldM' V.foldM'
(pokeCloud (pdata ^. cloudVBO . vboPtr) (pdata ^. cloudEBO . eboPtr)) (pokeCloud (pdata ^. cloudVBO . vboPtr) (pdata ^. cloudEBO . uiboPtr))
(0, 0) (0, 0)
(V.fromList $ w ^. cWorld . lWorld . clouds) (V.fromList $ w ^. cWorld . lWorld . clouds)
(nCloudVs, nCloudIs) <- (nCloudVs, nCloudIs) <-
V.foldM' V.foldM'
(pokeDust (pdata ^. cloudVBO . vboPtr) (pdata ^. cloudEBO . eboPtr)) (pokeDust (pdata ^. cloudVBO . vboPtr) (pdata ^. cloudEBO . uiboPtr))
(nCloudVs', nCloudIs') (nCloudVs', nCloudIs')
(V.fromList $ w ^. cWorld . lWorld . dusts) (V.fromList $ w ^. cWorld . lWorld . dusts)
-- bind wall points, silhouette data, surface geometry -- bind wall points, silhouette data, surface geometry
bufferShaderLayers shadV pokeCounts bufferShaderLayers shadV pokeCounts
mapM_ mapM_
(uncurry bufferPokedVBO) (uncurry bufferPokedVBO)
[ --(pdata ^. vboWindows, nWins) [ (_vboShapes pdata, nShapeVs)
(pdata ^. wallVBO, trueNWalls)
, (_vboShapes pdata, nShapeVs)
, (pdata ^. cloudVBO, nCloudVs) , (pdata ^. cloudVBO, nCloudVs)
] ]
mapM_ mapM_
(uncurry bufferEBO) (uncurry bufferEBO)
[ (_cloudEBO pdata, nCloudIs) [ (_cloudEBO pdata, nCloudIs)
, (_shapeEBO pdata, nIndices) , (_shapeEBO pdata, nIndices)
, (_silhouetteEBO pdata, nSilIndices)
] ]
-- set the coordinate uniform ready for drawing elements using world coordinates -- set the coordinate uniform ready for drawing elements using world coordinates
bufferPerspectiveMatrixUBO cfig (w ^. wCam) (pdata ^. matUBO) bufferPerspectiveMatrixUBO cfig (w ^. wCam) (pdata ^. matUBO)
@@ -116,31 +113,16 @@ doDrawing' win pdata u = do
glNamedBufferSubData (pdata ^. wallSSBO) 0 glNamedBufferSubData (pdata ^. wallSSBO) 0
(fromIntegral $ trueNWalls * sizeOf (0::Float) * 8) (fromIntegral $ trueNWalls * sizeOf (0::Float) * 8)
(pdata ^. wallVBO . vboPtr) (pdata ^. wallVBO . vboPtr)
-- withArray
-- [V4 0 0 0 (1:: Float)
-- ,V4 0 0 0 0
-- ,V4 0 0 0 0
-- ,V4 1 1 0 1
-- ,V4 0 0 0 0
-- ,V4 0 0 0 0
-- ,V4 0 1 0 1
-- ,V4 0 0 0 0
-- ,V4 0 0 0 0
-- ]
-- $ glNamedBufferSubData (pdata ^. shapeSSBO) 0
-- (fromIntegral $ 9 * (sizeOf (0::Float)*12))
-- withArray [0::GLuint,1,2] $
-- glNamedBufferSubData (pdata ^. ishapeSSBO) 0
-- (fromIntegral $ 3 * (sizeOf (0::GLuint)))
glNamedBufferSubData (pdata ^. shapeSSBO) 0 glNamedBufferSubData (pdata ^. shapeSSBO) 0
(fromIntegral $ nShapeVs * (sizeOf (0::Float)*12)) (fromIntegral $ nShapeVs * (sizeOf (0::Float)*12))
(pdata ^. vboShapes . vboPtr) (pdata ^. vboShapes . vboPtr)
glNamedBufferSubData (pdata ^. ishapeSSBO) 0 glNamedBufferSubData (pdata ^. ishapeSSBO) 0
(fromIntegral $ nIndices * (sizeOf (0::GLuint))) (fromIntegral $ nIndices * (sizeOf (0::GLuint)))
(pdata ^. shapeEBO . eboPtr) (pdata ^. shapeEBO . uiboPtr)
glNamedBufferSubData (pdata ^. ieshapeSSBO) 0 bufferEBO (pdata ^. silhouetteEBO) nSilIndices
(fromIntegral $ nSilIndices * (sizeOf (0::GLuint))) -- glNamedBufferSubData (pdata ^. ieshapeSSBO) 0
(pdata ^. silhouetteEBO . eboPtr) -- (fromIntegral $ nSilIndices * (sizeOf (0::GLuint)))
-- (pdata ^. silhouetteEBO . uiboPtr)
setViewport _gr_world_res cfig setViewport _gr_world_res cfig
glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase . _1 . unFBO) glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase . _1 . unFBO)
glDepthMask GL_TRUE glDepthMask GL_TRUE
+8 -7
View File
@@ -62,6 +62,7 @@ preloadRender = do
let ieshapessbosize = fromIntegral (sizeOf (0::GLuint) * 65536) let ieshapessbosize = fromIntegral (sizeOf (0::GLuint) * 65536)
glNamedBufferStorage ieshapessbo ieshapessbosize nullPtr GL_DYNAMIC_STORAGE_BIT glNamedBufferStorage ieshapessbo ieshapessbosize nullPtr GL_DYNAMIC_STORAGE_BIT
glBindBufferBase GL_SHADER_STORAGE_BUFFER 5 ieshapessbo glBindBufferBase GL_SHADER_STORAGE_BUFFER 5 ieshapessbo
ieptr <- mallocArray 65536 -- so we can go back to glushort...
dummyvao <- mglCreate glGenVertexArrays dummyvao <- mglCreate glGenVertexArrays
@@ -83,12 +84,12 @@ preloadRender = do
shapeVerxAttributes shapeVerxAttributes
pmTriangles pmTriangles
shVBO shVBO
glVertexArrayElementBuffer (shapeshader ^. shaderVAO . vaoName) (shEBO ^. eboName) glVertexArrayElementBuffer (shapeshader ^. shaderVAO . vaoName) (shEBO ^. uiboName)
--setup silhouette edge VAO --setup silhouette edge VAO
putStrLn "Setup silhouette VAO, EBO" -- putStrLn "Setup silhouette VAO, EBO"
shedgevao <- setupVAOUsingVBO [VertexAttribute 4 GL_FLOAT GL_FALSE 0] shVBO -- shedgevao <- setupVAOUsingVBO [VertexAttribute 4 GL_FLOAT GL_FALSE 0] shVBO
shedgeebo <- setupEBO shedgevao -- shedgeebo <- setupEBO shedgevao
putStrLn "Setup wall/windows VBO, VAO, EBO, shader" putStrLn "Setup wall/windows VBO, VAO, EBO, shader"
let wallverxstrd = 8 let wallverxstrd = 8
@@ -104,7 +105,7 @@ preloadRender = do
makeShaderUsingVAO "lighting/cap" [vert] pmTriangles (VAO dummyvao) makeShaderUsingVAO "lighting/cap" [vert] pmTriangles (VAO dummyvao)
lightingLineShadowShad <- lightingLineShadowShad <-
--makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shedgevao --makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shedgevao
makeShaderUsingVAO "lighting/lineShadow" [vert] pmTriangles shedgevao makeShaderUsingVAO "lighting/lineShadow" [vert] pmTriangles (VAO dummyvao)
ceilingstencilshader <- makeShaderUsingVAO "ceiling/stencil" [vert] pmTriangles ceilingstencilshader <- makeShaderUsingVAO "ceiling/stencil" [vert] pmTriangles
(VAO dummyvao) (VAO dummyvao)
@@ -200,7 +201,7 @@ preloadRender = do
{ _pictureShaders = shadV { _pictureShaders = shadV
, _shapeShader = shapeshader -- & shaderVAO' .~ shPosColVAO , _shapeShader = shapeshader -- & shaderVAO' .~ shPosColVAO
, _shapeEBO = shEBO , _shapeEBO = shEBO
, _silhouetteEBO = shedgeebo , _silhouetteEBO = UintBO ieshapessbo ieptr
, _lightingCapShader = lightingCapShad , _lightingCapShader = lightingCapShad
, _lightingLineShadowShader = lightingLineShadowShad , _lightingLineShadowShader = lightingLineShadowShad
, _lightingWallShadShader = lightingWallShadShad , _lightingWallShadShader = lightingWallShadShad
@@ -232,7 +233,7 @@ preloadRender = do
, _wallSSBO = wallssbo , _wallSSBO = wallssbo
, _shapeSSBO = shapessbo , _shapeSSBO = shapessbo
, _ishapeSSBO = ishapessbo , _ishapeSSBO = ishapessbo
, _ieshapeSSBO = ieshapessbo -- , _ieshapeSSBO = ieshapessbo
-- , _lightsUBO = lightsubo -- , _lightsUBO = lightsubo
, _vboWindows = winvbo , _vboWindows = winvbo
, _vboShapes = shVBO , _vboShapes = shVBO
+3 -3
View File
@@ -25,13 +25,13 @@ bufferPokedVBO theVBO numVs =
(fromIntegral $ numVs * _vboVertexBytes theVBO) (fromIntegral $ numVs * _vboVertexBytes theVBO)
(_vboPtr theVBO) (_vboPtr theVBO)
bufferEBO :: EBO -> Int -> IO () bufferEBO :: UintBO -> Int -> IO ()
bufferEBO ebo numis = bufferEBO ebo numis =
glNamedBufferSubData glNamedBufferSubData
(ebo ^. eboName) (ebo ^. uiboName)
0 0
(fromIntegral $ gluintSize * numis) (fromIntegral $ gluintSize * numis)
(ebo ^. eboPtr) (ebo ^. uiboPtr)
bufferShaderLayers :: MV.MVector (PrimState IO) (Shader, VBO) -> UMV.MVector (PrimState IO) Int -> IO () bufferShaderLayers :: MV.MVector (PrimState IO) (Shader, VBO) -> UMV.MVector (PrimState IO) Int -> IO ()
bufferShaderLayers shads counts = MV.imapM_ f shads bufferShaderLayers shads counts = MV.imapM_ f shads
+4 -6
View File
@@ -59,11 +59,11 @@ makeShaderEBO ::
[VertexAttribute] -> [VertexAttribute] ->
PrimitiveMode -> PrimitiveMode ->
VBO -> VBO ->
IO (Shader, EBO) IO (Shader, UintBO)
makeShaderEBO s shaderlist sizes pm vbo = do makeShaderEBO s shaderlist sizes pm vbo = do
shad <- makeShaderUsingVBO s shaderlist sizes pm vbo shad <- makeShaderUsingVBO s shaderlist sizes pm vbo
ebo <- setupEBO (shad ^. shaderVAO) ebo <- setupEBO (shad ^. shaderVAO)
glVertexArrayElementBuffer (shad ^. shaderVAO . vaoName) (ebo ^. eboName) glVertexArrayElementBuffer (shad ^. shaderVAO . vaoName) (ebo ^. uiboName)
return (shad, ebo) return (shad, ebo)
makeShaderUsingVBO :: makeShaderUsingVBO ::
@@ -189,19 +189,17 @@ setupVAOUsingVBO vas vbo = do
(fromIntegral strd) (fromIntegral strd)
return VAO{_vaoName = vaoname} return VAO{_vaoName = vaoname}
setupEBO :: VAO -> IO EBO setupEBO :: VAO -> IO UintBO
setupEBO vao = do setupEBO vao = do
eboptr <- mallocArray 65536 -- so we can go back to glushort... eboptr <- mallocArray 65536 -- so we can go back to glushort...
eboname <- mglCreate glCreateBuffers eboname <- mglCreate glCreateBuffers
--glNamedBufferData
glNamedBufferStorage glNamedBufferStorage
eboname eboname
(fromIntegral $ gluintSize * 65536) (fromIntegral $ gluintSize * 65536)
nullPtr nullPtr
GL_DYNAMIC_STORAGE_BIT GL_DYNAMIC_STORAGE_BIT
--GL_STREAM_DRAW
glVertexArrayElementBuffer (vao ^. vaoName) eboname glVertexArrayElementBuffer (vao ^. vaoName) eboname
return $ EBO eboname eboptr return $ UintBO eboname eboptr
setupVBOVAO :: [VertexAttribute] -> IO (VAO, VBO) setupVBOVAO :: [VertexAttribute] -> IO (VAO, VBO)
setupVBOVAO vas = do setupVBOVAO vas = do
+10 -4
View File
@@ -91,9 +91,14 @@ data FloatBO = FloatBO
, _boType :: BOType , _boType :: BOType
} }
data EBO = EBO data UintBO = UintBO
{ _eboName :: GLuint { _uiboName :: GLuint
, _eboPtr :: Ptr GLuint , _uiboPtr :: Ptr GLuint
}
data SSBO a = SSBO
{ _ssboName :: GLuint
, _ssboPtr :: Ptr a
} }
-- | Datatype containing the reference to a texture object. -- | Datatype containing the reference to a texture object.
@@ -124,7 +129,8 @@ pmPatches = PrimitiveMode GL_PATCHES
makeLenses ''VAO makeLenses ''VAO
makeLenses ''VBO makeLenses ''VBO
makeLenses ''EBO makeLenses ''UintBO
makeLenses ''SSBO
makeLenses ''ShaderTexture makeLenses ''ShaderTexture
makeLenses ''Shader makeLenses ''Shader
makeLenses ''FBO makeLenses ''FBO