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
, _shadowWallShader :: Shader
, _shadowLightShader :: (Shader,VBO)
, _shadowCombineShader :: (Shader,VBO)
, _shadowCombineShader :: Shader
, _windowShader :: Shader
, _fullscreenShader :: Shader
, _bloomBlurShader :: Shader
+4 -3
View File
@@ -101,13 +101,14 @@ preloadRender = do
shadowwallshader <-
makeShaderUsingVBO "shadow/wallShadow" [vert, geom] [4] pmPoints wallvbo
shadowlightshader <-
makeShaderSized
makeShaderFixedVertices
"shadow/light"
[vert, geom, frag]
[1]
1
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
putStrLn "Setup 2D shaders"
@@ -130,7 +131,7 @@ preloadRender = do
(fromIntegral $ floatSize * length (concat cornerList))
ptr
0
screentexturevao <- setupVAOvbo' [2, 2] 4 screentexturevbo
screentexturevao <- setupVAOvbo (toFloatVAs [2, 2]) 4 screentexturevbo
alphadivideshader <- makeShaderUsingVAO "texture2D/alphaDivide" [vert, frag] pmTriangleStrip screentexturevao
fsShad <- makeShaderUsingVAO "texture/simple" [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)
glEnable GL_BLEND
glBlendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
glUseProgram (pdata ^. shadowCombineShader . _1 . shaderUINT)
glUseProgram (pdata ^. shadowCombineShader . shaderUINT)
glDrawArrays
GL_POINTS
0
+46 -47
View File
@@ -5,16 +5,17 @@ module Shader.Compile (
makeShaderVBO,
makeShaderUsingVBO,
makeByteStringShaderUsingVAO,
makeShaderSized,
makeShaderFixedVertices,
makeShaderUsingVAO,
setupVAO,
setupVAOUsingVBO,
setupVAOvbo',
setupVAOvbo,
setupEBO,
setupVertexAttribPointer,
makeSourcedShader,
toFloatVAs,
) where
import Graphics.GL.Types
import Control.Lens
import Control.Monad
import qualified Data.ByteString as BS
@@ -43,7 +44,7 @@ makeShaderVBO ::
IO (Shader, VBO)
makeShaderVBO s shaderlist sizes pm = do
prog <- makeSourcedShader s shaderlist
(vao, vbo) <- setupVAO sizes
(vao, vbo) <- setupVBOVAO sizes
return
( Shader
{ _shaderUINT = prog
@@ -145,11 +146,13 @@ makeShaderUsingVAO s shaderlist pm theVAO = do
, _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.
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
String ->
-- | shader types
@@ -160,9 +163,9 @@ makeShaderSized ::
Int ->
PrimitiveMode ->
IO (Shader, VBO)
makeShaderSized s shaderlist sizes ndraw pm = do
makeShaderFixedVertices s shaderlist sizes ndraw pm = do
prog <- makeSourcedShader s shaderlist
(vao, vbo) <- setupVAOSized ndraw sizes
(vao, vbo) <- setupVBOVAO sizes
return
( Shader
{ _shaderUINT = prog
@@ -188,15 +191,11 @@ shaderTypeExt GL_FRAGMENT_SHADER = ".frag"
shaderTypeExt GL_COMPUTE_SHADER = ".comp"
shaderTypeExt _ = undefined
-- I think that this requires that the correct shader program is bound?
setupVAO :: [Int] -> IO (VAO, VBO)
setupVAO = setupVAOSized numDrawableElements
setupVAOvbo' :: [Int] -> Int -> GLuint -> IO VAO
setupVAOvbo' sizes strd vbo = do
setupVAOvbo :: [VertexAttribute] -> Int -> GLuint -> IO VAO
setupVAOvbo sizes strd vbo = do
vaoname <- mglCreate glCreateVertexArrays
glBindVertexArray vaoname
setupVertexAttribs vbo vaoname (toFloatVAs sizes) (fromIntegral strd * fromIntegral floatSize)
setupVertexAttribs vbo vaoname sizes (fromIntegral strd * fromIntegral floatSize)
return $
VAO
{ _vaoName = vaoname
@@ -223,17 +222,13 @@ setupEBO vao = do
glVertexArrayElementBuffer (vao ^. vaoName) eboname
return $ EBO eboname eboptr
setupVAOSized :: Int -> [Int] -> IO (VAO, VBO)
setupVAOSized ndraw sizes = do
setupVBOVAO :: [Int] -> IO (VAO, VBO)
setupVBOVAO sizes = do
vaoname <- mglCreate glCreateVertexArrays
glBindVertexArray vaoname
theVBO <- setupVBOSized ndraw vaoname sizes
return
( VAO
{ _vaoName = vaoname
}
, theVBO
)
vbo <- setupVBO (sum sizes)
vao <- setupVAOvbo (toFloatVAs sizes) (sum sizes) (vbo ^. vboName)
return (vao,vbo)
toFloatVAs :: [Int] -> [VertexAttribute]
toFloatVAs = go 0
@@ -242,27 +237,6 @@ toFloatVAs = go 0
go x (i:is) = VertexAttribute (fromIntegral i) GL_FLOAT GL_FALSE x
: 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 vbo vao vas strd = do
glVertexArrayVertexBuffer vao 0 vbo 0 strd
@@ -278,9 +252,9 @@ setupVertexAttribPointer ::
setupVertexAttribPointer vao loc va = do
glEnableVertexArrayAttrib vao loc'
glVertexArrayAttribFormat vao loc'
(va ^. vaNumberElements)
(va ^. vaElementType)
(va ^. vaToNormalize)
(va ^. vaCount)
(va ^. vaType)
(va ^. vaNormalize)
(va ^. vaOffset)
glVertexArrayAttribBinding vao loc' 0
where
@@ -342,6 +316,31 @@ setShaderSource si src =
with srcLength $ \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
withByteString :: Num t => BS.ByteString -> (Ptr b -> t -> IO a) -> IO a
withByteString bs act =
+3 -3
View File
@@ -66,9 +66,9 @@ newtype VAO = VAO
}
data VertexAttribute = VertexAttribute
{ _vaNumberElements :: GLint
, _vaElementType :: GLenum
, _vaToNormalize :: GLboolean
{ _vaCount :: GLint
, _vaType :: GLenum
, _vaNormalize :: GLboolean
, _vaOffset :: GLuint
}