From 11b8fe2e06787f4f4d5a371636cdaaa045026417 Mon Sep 17 00:00:00 2001 From: justin Date: Wed, 12 Apr 2023 23:11:56 +0100 Subject: [PATCH] Work on vertex attributes --- src/Data/Preload/Render.hs | 2 +- src/Preload/Render.hs | 7 +-- src/Render.hs | 2 +- src/Shader/Compile.hs | 93 +++++++++++++++++++------------------- src/Shader/Data.hs | 6 +-- 5 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index 4cc0f7e51..61b2b0327 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -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 diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 475de4e7d..654274dd9 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -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 diff --git a/src/Render.hs b/src/Render.hs index f9f6cffcf..dba2fe071 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -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 diff --git a/src/Shader/Compile.hs b/src/Shader/Compile.hs index f0937640b..0dc99d9e7 100644 --- a/src/Shader/Compile.hs +++ b/src/Shader/Compile.hs @@ -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 = diff --git a/src/Shader/Data.hs b/src/Shader/Data.hs index a71eb6797..72b85a8d9 100644 --- a/src/Shader/Data.hs +++ b/src/Shader/Data.hs @@ -66,9 +66,9 @@ newtype VAO = VAO } data VertexAttribute = VertexAttribute - { _vaNumberElements :: GLint - , _vaElementType :: GLenum - , _vaToNormalize :: GLboolean + { _vaCount :: GLint + , _vaType :: GLenum + , _vaNormalize :: GLboolean , _vaOffset :: GLuint }