Work on vertex attributes
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -66,9 +66,9 @@ newtype VAO = VAO
|
||||
}
|
||||
|
||||
data VertexAttribute = VertexAttribute
|
||||
{ _vaNumberElements :: GLint
|
||||
, _vaElementType :: GLenum
|
||||
, _vaToNormalize :: GLboolean
|
||||
{ _vaCount :: GLint
|
||||
, _vaType :: GLenum
|
||||
, _vaNormalize :: GLboolean
|
||||
, _vaOffset :: GLuint
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user