Work on vertex attributes
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user