Work on vertex attributes

This commit is contained in:
2023-04-12 23:11:56 +01:00
parent 2494f2cf8d
commit 11b8fe2e06
5 changed files with 55 additions and 55 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ data RenderData = RenderData
, _shadowCapShader :: Shader , _shadowCapShader :: Shader
, _shadowWallShader :: Shader , _shadowWallShader :: Shader
, _shadowLightShader :: (Shader,VBO) , _shadowLightShader :: (Shader,VBO)
, _shadowCombineShader :: (Shader,VBO) , _shadowCombineShader :: Shader
, _windowShader :: Shader , _windowShader :: Shader
, _fullscreenShader :: Shader , _fullscreenShader :: Shader
, _bloomBlurShader :: Shader , _bloomBlurShader :: Shader
+4 -3
View File
@@ -101,13 +101,14 @@ preloadRender = do
shadowwallshader <- shadowwallshader <-
makeShaderUsingVBO "shadow/wallShadow" [vert, geom] [4] pmPoints wallvbo makeShaderUsingVBO "shadow/wallShadow" [vert, geom] [4] pmPoints wallvbo
shadowlightshader <- shadowlightshader <-
makeShaderSized makeShaderFixedVertices
"shadow/light" "shadow/light"
[vert, geom, frag] [vert, geom, frag]
[1] [1]
1 1
pmPoints pmPoints
shadowcombineshader <- makeShaderSized "shadow/combine" [vert, geom, frag] [1] 1 pmPoints shadowcombineshader <- makeShaderUsingVAO "shadow/combine" [vert, geom, frag] pmPoints
(shadowlightshader ^. _1 . shaderVAO)
poke (shadVBOptr shadowlightshader) 1 poke (shadVBOptr shadowlightshader) 1
putStrLn "Setup 2D shaders" putStrLn "Setup 2D shaders"
@@ -130,7 +131,7 @@ preloadRender = do
(fromIntegral $ floatSize * length (concat cornerList)) (fromIntegral $ floatSize * length (concat cornerList))
ptr ptr
0 0
screentexturevao <- setupVAOvbo' [2, 2] 4 screentexturevbo screentexturevao <- setupVAOvbo (toFloatVAs [2, 2]) 4 screentexturevbo
alphadivideshader <- makeShaderUsingVAO "texture2D/alphaDivide" [vert, frag] pmTriangleStrip screentexturevao alphadivideshader <- makeShaderUsingVAO "texture2D/alphaDivide" [vert, frag] pmTriangleStrip screentexturevao
fsShad <- makeShaderUsingVAO "texture/simple" [vert, frag] pmTriangleStrip screentexturevao fsShad <- makeShaderUsingVAO "texture/simple" [vert, frag] pmTriangleStrip screentexturevao
bloomBlurShad <- makeShaderUsingVAO "texture/bloomBlur" [vert, frag] pmTriangleStrip screentexturevao bloomBlurShad <- makeShaderUsingVAO "texture/bloomBlur" [vert, frag] pmTriangleStrip screentexturevao
+1 -1
View File
@@ -360,7 +360,7 @@ instanceLightMap cfig nWalls nSils nCaps toPos tanormals lightPoints pdata = do
glBindTextureUnit 0 (pdata ^. fboShadow . _2 . _1 . unTO) glBindTextureUnit 0 (pdata ^. fboShadow . _2 . _1 . unTO)
glEnable GL_BLEND glEnable GL_BLEND
glBlendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR glBlendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
glUseProgram (pdata ^. shadowCombineShader . _1 . shaderUINT) glUseProgram (pdata ^. shadowCombineShader . shaderUINT)
glDrawArrays glDrawArrays
GL_POINTS GL_POINTS
0 0
+46 -47
View File
@@ -5,16 +5,17 @@ module Shader.Compile (
makeShaderVBO, makeShaderVBO,
makeShaderUsingVBO, makeShaderUsingVBO,
makeByteStringShaderUsingVAO, makeByteStringShaderUsingVAO,
makeShaderSized, makeShaderFixedVertices,
makeShaderUsingVAO, makeShaderUsingVAO,
setupVAO,
setupVAOUsingVBO, setupVAOUsingVBO,
setupVAOvbo', setupVAOvbo,
setupEBO, setupEBO,
setupVertexAttribPointer, setupVertexAttribPointer,
makeSourcedShader, makeSourcedShader,
toFloatVAs,
) where ) where
import Graphics.GL.Types
import Control.Lens import Control.Lens
import Control.Monad import Control.Monad
import qualified Data.ByteString as BS import qualified Data.ByteString as BS
@@ -43,7 +44,7 @@ makeShaderVBO ::
IO (Shader, VBO) IO (Shader, VBO)
makeShaderVBO s shaderlist sizes pm = do makeShaderVBO s shaderlist sizes pm = do
prog <- makeSourcedShader s shaderlist prog <- makeSourcedShader s shaderlist
(vao, vbo) <- setupVAO sizes (vao, vbo) <- setupVBOVAO sizes
return return
( Shader ( Shader
{ _shaderUINT = prog { _shaderUINT = prog
@@ -145,11 +146,13 @@ makeShaderUsingVAO s shaderlist pm theVAO = do
, _shaderPrimitive = pm , _shaderPrimitive = pm
} }
-- this should be changed to some FIXED STORAGE SHADER
-- I cannot think of any other reason to have it
{- | {- |
Compiles a full shader found within the shader directory. Compiles a full shader found within the shader directory.
The shader is made up of files begining with the inputted string with extensions .vert, .geom etc. The shader is made up of files begining with the inputted string with extensions .vert, .geom etc.
-} -}
makeShaderSized :: makeShaderFixedVertices ::
-- | First part of the name of the shader -- | First part of the name of the shader
String -> String ->
-- | shader types -- | shader types
@@ -160,9 +163,9 @@ makeShaderSized ::
Int -> Int ->
PrimitiveMode -> PrimitiveMode ->
IO (Shader, VBO) IO (Shader, VBO)
makeShaderSized s shaderlist sizes ndraw pm = do makeShaderFixedVertices s shaderlist sizes ndraw pm = do
prog <- makeSourcedShader s shaderlist prog <- makeSourcedShader s shaderlist
(vao, vbo) <- setupVAOSized ndraw sizes (vao, vbo) <- setupVBOVAO sizes
return return
( Shader ( Shader
{ _shaderUINT = prog { _shaderUINT = prog
@@ -188,15 +191,11 @@ shaderTypeExt GL_FRAGMENT_SHADER = ".frag"
shaderTypeExt GL_COMPUTE_SHADER = ".comp" shaderTypeExt GL_COMPUTE_SHADER = ".comp"
shaderTypeExt _ = undefined shaderTypeExt _ = undefined
-- I think that this requires that the correct shader program is bound? setupVAOvbo :: [VertexAttribute] -> Int -> GLuint -> IO VAO
setupVAO :: [Int] -> IO (VAO, VBO) setupVAOvbo sizes strd vbo = do
setupVAO = setupVAOSized numDrawableElements
setupVAOvbo' :: [Int] -> Int -> GLuint -> IO VAO
setupVAOvbo' sizes strd vbo = do
vaoname <- mglCreate glCreateVertexArrays vaoname <- mglCreate glCreateVertexArrays
glBindVertexArray vaoname glBindVertexArray vaoname
setupVertexAttribs vbo vaoname (toFloatVAs sizes) (fromIntegral strd * fromIntegral floatSize) setupVertexAttribs vbo vaoname sizes (fromIntegral strd * fromIntegral floatSize)
return $ return $
VAO VAO
{ _vaoName = vaoname { _vaoName = vaoname
@@ -223,17 +222,13 @@ setupEBO vao = do
glVertexArrayElementBuffer (vao ^. vaoName) eboname glVertexArrayElementBuffer (vao ^. vaoName) eboname
return $ EBO eboname eboptr return $ EBO eboname eboptr
setupVAOSized :: Int -> [Int] -> IO (VAO, VBO) setupVBOVAO :: [Int] -> IO (VAO, VBO)
setupVAOSized ndraw sizes = do setupVBOVAO sizes = do
vaoname <- mglCreate glCreateVertexArrays vaoname <- mglCreate glCreateVertexArrays
glBindVertexArray vaoname glBindVertexArray vaoname
theVBO <- setupVBOSized ndraw vaoname sizes vbo <- setupVBO (sum sizes)
return vao <- setupVAOvbo (toFloatVAs sizes) (sum sizes) (vbo ^. vboName)
( VAO return (vao,vbo)
{ _vaoName = vaoname
}
, theVBO
)
toFloatVAs :: [Int] -> [VertexAttribute] toFloatVAs :: [Int] -> [VertexAttribute]
toFloatVAs = go 0 toFloatVAs = go 0
@@ -242,27 +237,6 @@ toFloatVAs = go 0
go x (i:is) = VertexAttribute (fromIntegral i) GL_FLOAT GL_FALSE x go x (i:is) = VertexAttribute (fromIntegral i) GL_FLOAT GL_FALSE x
: go (x + fromIntegral floatSize*fromIntegral i) is : go (x + fromIntegral floatSize*fromIntegral i) is
setupVBOSized :: Int -> GLuint -> [Int] -> IO VBO
setupVBOSized ndraw vao sizes = do
vboname <- mglCreate glCreateBuffers
glVertexArrayVertexBuffer vao 0 vboname 0 (fromIntegral $ floatSize * strd)
zipWithM_ (setupVertexAttribPointer vao) [0..] $ toFloatVAs sizes
thePtr <- mallocArray (strd * ndraw)
-- Allocate space
glNamedBufferData
vboname
(fromIntegral $ floatSize * ndraw * strd)
nullPtr
GL_STREAM_DRAW
return $
VBO
{ _vboName = vboname
, _vboPtr = thePtr
, _vboVertexSize = sum sizes
}
where
strd = sum sizes
setupVertexAttribs :: GLuint -> GLuint -> [VertexAttribute] -> GLsizei -> IO () setupVertexAttribs :: GLuint -> GLuint -> [VertexAttribute] -> GLsizei -> IO ()
setupVertexAttribs vbo vao vas strd = do setupVertexAttribs vbo vao vas strd = do
glVertexArrayVertexBuffer vao 0 vbo 0 strd glVertexArrayVertexBuffer vao 0 vbo 0 strd
@@ -278,9 +252,9 @@ setupVertexAttribPointer ::
setupVertexAttribPointer vao loc va = do setupVertexAttribPointer vao loc va = do
glEnableVertexArrayAttrib vao loc' glEnableVertexArrayAttrib vao loc'
glVertexArrayAttribFormat vao loc' glVertexArrayAttribFormat vao loc'
(va ^. vaNumberElements) (va ^. vaCount)
(va ^. vaElementType) (va ^. vaType)
(va ^. vaToNormalize) (va ^. vaNormalize)
(va ^. vaOffset) (va ^. vaOffset)
glVertexArrayAttribBinding vao loc' 0 glVertexArrayAttribBinding vao loc' 0
where where
@@ -342,6 +316,31 @@ setShaderSource si src =
with srcLength $ \srcLengthBuf -> with srcLength $ \srcLengthBuf ->
glShaderSource si 1 srcPtrBuf srcLengthBuf glShaderSource si 1 srcPtrBuf srcLengthBuf
vasTightStride :: [VertexAttribute] -> Int
vasTightStride = go 0
where
go x [] = x
go x (v:vs)
| x /= fromIntegral (v ^. vaOffset) = error "vasTightStride: vertex offset incorrect"
| otherwise = go (x + fromIntegral (v ^. vaCount * fromIntegral (attribSize (v ^. vaType))))
vs
attribSize :: GLenum -> Int
attribSize x = case x of
GL_BYTE -> sizeOf (0 :: GLbyte )
GL_SHORT -> sizeOf (0 :: GLshort)
GL_INT -> sizeOf (0 :: GLint)
GL_FIXED -> sizeOf (0 :: GLfixed)
GL_FLOAT -> sizeOf (0 :: GLfloat)
GL_HALF_FLOAT -> sizeOf (0 :: GLhalf)
GL_DOUBLE -> sizeOf (0 :: GLdouble)
GL_UNSIGNED_BYTE -> sizeOf (0 :: GLubyte)
GL_UNSIGNED_SHORT -> sizeOf (0 :: GLushort)
GL_UNSIGNED_INT -> sizeOf (0 :: GLuint)
-- GL_INT_2_10_10_10_REV -> sizeOf (0 :: GL_INT_2_10_10_10_REV)
-- GL_UNSIGNED_INT_2_10_10_10_REV -> sizeOf (0 :: GL_UNSIGNED_INT_2_10_10_10_REV)
-- GL_UNSIGNED_INT_10F_11F_11F_REV -> sizeOf (0 :: GL_UNSIGNED_INT_10F_11F_11F_REV)
-- https://hackage.haskell.org/package/OpenGL-3.0.3.0/docs/src/Graphics.Rendering.OpenGL.GL.ByteString.html#withByteStringP -- https://hackage.haskell.org/package/OpenGL-3.0.3.0/docs/src/Graphics.Rendering.OpenGL.GL.ByteString.html#withByteStringP
withByteString :: Num t => BS.ByteString -> (Ptr b -> t -> IO a) -> IO a withByteString :: Num t => BS.ByteString -> (Ptr b -> t -> IO a) -> IO a
withByteString bs act = withByteString bs act =
+3 -3
View File
@@ -66,9 +66,9 @@ newtype VAO = VAO
} }
data VertexAttribute = VertexAttribute data VertexAttribute = VertexAttribute
{ _vaNumberElements :: GLint { _vaCount :: GLint
, _vaElementType :: GLenum , _vaType :: GLenum
, _vaToNormalize :: GLboolean , _vaNormalize :: GLboolean
, _vaOffset :: GLuint , _vaOffset :: GLuint
} }