diff --git a/shader/dualTwoD/arc.frag b/shader/dualTwoD/arc.frag index 0569dd281..41f3dae48 100644 --- a/shader/dualTwoD/arc.frag +++ b/shader/dualTwoD/arc.frag @@ -1,13 +1,13 @@ #version 430 core -in vec4 vColor; -in vec3 vPosition; +in vec4 vCol; +in vec3 vPos; in vec3 vparams; -layout (location=0) out vec4 fColor; -layout (location=1) out vec3 fPosition; +layout (location=0) out vec4 fCol; +layout (location=1) out vec4 fPos; void main() { float d = (dot(vec2(vparams.xy),vec2(vparams.xy))); if ( d > 1 || d < vparams.z ) {discard;} - fColor = vColor; - fPosition = vPosition; + fCol = vCol; + fPos = vec4(vPos,1); } diff --git a/shader/dualTwoD/arc.vert b/shader/dualTwoD/arc.vert index 76bf8c806..1c946f7df 100644 --- a/shader/dualTwoD/arc.vert +++ b/shader/dualTwoD/arc.vert @@ -1,14 +1,14 @@ #version 430 core -layout (location = 0) in vec3 position; -layout (location = 1) in vec4 color; +layout (location = 0) in vec3 pos; +layout (location = 1) in vec4 col; layout (location = 2) in vec3 boxXboxYwidth; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; -out vec4 vColor; -out vec3 vPosition; +out vec4 vCol; +out vec3 vPos; out vec3 vparams; void main() { - gl_Position = theMat * vec4(position,1); - vColor = color; + gl_Position = theMat * vec4(pos,1); + vCol = col; vparams = boxXboxYwidth; - vPosition = position; + vPos = pos; } diff --git a/shader/dualTwoD/basic.frag b/shader/dualTwoD/basic.frag index 5e63ac83b..285781782 100644 --- a/shader/dualTwoD/basic.frag +++ b/shader/dualTwoD/basic.frag @@ -2,9 +2,9 @@ in vec4 vCol; in vec3 vPos; layout (location=0) out vec4 fCol; -layout (location=1) out vec3 fPos; +layout (location=1) out vec4 fPos; void main() { fCol = vCol; - fPos = vPos; + fPos = vec4(vPos,1); } diff --git a/shader/dualTwoD/basicTweakZ.frag b/shader/dualTwoD/basicTweakZ.frag index aedc197fd..28a4dba68 100644 --- a/shader/dualTwoD/basicTweakZ.frag +++ b/shader/dualTwoD/basicTweakZ.frag @@ -1,7 +1,9 @@ #version 430 core -in vec4 vColor; -out vec4 fColor; -void main() -{ - fColor = vColor; +layout (location=0) out vec4 fCol; +layout (location=1) out vec4 fPos; +in vec4 vCol; +in vec3 vPos; +void main() { + fCol = vCol; + fPos = vec4(vPos,1) ; } diff --git a/shader/dualTwoD/basicTweakZ.vert b/shader/dualTwoD/basicTweakZ.vert index b371bf9d4..d7322a162 100644 --- a/shader/dualTwoD/basicTweakZ.vert +++ b/shader/dualTwoD/basicTweakZ.vert @@ -2,11 +2,13 @@ layout (location = 0) in vec4 position; layout (location = 1) in vec4 color; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; -out vec4 vColor; +out vec4 vCol; +out vec3 vPos; void main() { vec4 posxy = theMat * vec4(position.xyz,1); vec4 posz = theMat * vec4(position.xyw,1); gl_Position = vec4(posxy.xy,posz.z,1); - vColor = color; + vCol = color; + vPos = position.xyz; } diff --git a/shader/dualTwoD/bezierQuad.frag b/shader/dualTwoD/bezierQuad.frag index f0ee9d08e..484d99ee6 100644 --- a/shader/dualTwoD/bezierQuad.frag +++ b/shader/dualTwoD/bezierQuad.frag @@ -3,7 +3,8 @@ in vec4 vColor; in vec2 boxOut; in vec2 boxIn; -out vec4 fColor; +layout (location=0) out vec4 fCol; +layout (location=1) out vec4 fPos; void main() { @@ -12,5 +13,6 @@ void main() // float e = sqrt(f(x,wStart)) + sqrt(f(y,wEnd)) - 1.0; float e = sqrt(boxIn.x) + sqrt(boxIn.y) - 1.0; if ( d < 0 || e > 0) { discard; } - fColor = vColor; + fCol = vColor; + fPos = vec4(0,0,0,0) ; } diff --git a/shader/dualTwoD/character.frag b/shader/dualTwoD/character.frag index 5f5e495d4..6bffa7e30 100644 --- a/shader/dualTwoD/character.frag +++ b/shader/dualTwoD/character.frag @@ -1,15 +1,11 @@ #version 430 core -out vec4 FragColor; - +layout (location=0) out vec4 fCol; +layout (location=1) out vec4 fPos; +uniform sampler2D aTexture; in vec4 gColor; in vec2 gTexCoord; - -uniform sampler2D aTexture; - void main() { - FragColor = texture(aTexture, vec2 (gTexCoord.x * 0.0078125, gTexCoord.y)) * gColor; -// FragColor = texture(aTexture, vTexCoord); -// FragColor = gColor; -// FragColor = vec4 (1,1,1,1); + fCol = texture(aTexture, vec2 (gTexCoord.x * 0.0078125, gTexCoord.y)) * gColor; + fPos = vec4(0,0,0,0); } diff --git a/shader/dualTwoD/ellipse.frag b/shader/dualTwoD/ellipse.frag index 726ca3872..2bacff194 100644 --- a/shader/dualTwoD/ellipse.frag +++ b/shader/dualTwoD/ellipse.frag @@ -1,16 +1,13 @@ #version 430 core +layout (location=0) out vec4 fCol; +layout (location=1) out vec4 fPos; in vec4 gColC; in vec4 gColE; in vec3 gPos; in vec2 gBoundingBox; - -layout (location=0) out vec4 fCol; -layout (location=1) out vec3 fPos; - -void main() -{ +void main() { float d = dot(gBoundingBox,gBoundingBox); if ( d > 1) { discard; } fCol = mix (gColE , gColC, d); - fPos = vPos; + fPos = vec4(gPos,1); } diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index 6ea0061d7..163605fae 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -21,6 +21,7 @@ data RenderData = RenderData , _wallTextureShader :: FullShader , _textureArrayShader :: FullShader , _fullscreenShader :: FullShader + , _fullLightingShader :: FullShader , _fullscreenAlphaHalveShader :: FullShader --, _boxBlurShader :: FullShader , _bloomBlurShader :: FullShader diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index c83132336..b1ad285a9 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -8,7 +8,7 @@ import Dodge.Data import Dodge.Config.Data import Dodge.Base.Window import Dodge.Render.Picture -import Dodge.Creature.ShadowBox +--import Dodge.Creature.ShadowBox import Geometry import Render import Data.Preload.Render @@ -19,7 +19,7 @@ import Shader.Data import MatrixHelper --import Polyhedra.Data import Polyhedra -import Tuple +--import Tuple import Foreign --import Control.Applicative @@ -220,12 +220,6 @@ doDrawing pdata w = do eTicks <- SDL.ticks return (eTicks - sTicks) -bindTO :: TextureObject -> IO () -bindTO t = textureBinding Texture2D $= Just t - -bindFBO :: FramebufferObject -> IO () -bindFBO fb = bindFramebuffer Framebuffer $= fb - -------------------------------------------------------------------------------- -- note: currently assume there is only one UBO, we only bind it once at setup bufferUBO :: [Float] -> IO () diff --git a/src/Framebuffer/Update.hs b/src/Framebuffer/Update.hs index 14e503097..cd8fc5f83 100644 --- a/src/Framebuffer/Update.hs +++ b/src/Framebuffer/Update.hs @@ -23,7 +23,7 @@ sizeFBOs -> IO RenderData sizeFBOs xsize ysize xfull yfull rdata = do resizeRBO (_rboBaseBloom rdata) xsize ysize - rdata' <- updateFBOTO2 xsize ysize minMagFilter GL_RGBA8 GL_RGBA16F rdata fboBase + rdata' <- updateFBOTO2 xsize ysize linMinMagFilter GL_RGBA8 GL_RGBA16F rdata fboBase >>= flip (foldM (updateFBOTO xsize ysize minMagFilter GL_RGBA8)) [fboColor,fboLighting,fboLightingHigh] rdata'' <- foldM (updateFBOTO xsize ysize linMinMagFilter GL_RGBA16F) rdata' @@ -94,6 +94,7 @@ resizeFBOTO2 (fboName,(toOld1,toOld2)) xsize ysize mmfilt inFormat1 inFormat2 = glTexStorage2D GL_TEXTURE_2D 1 inFormat2 xsize' ysize' textureFilter Texture2D $= mmfilt framebufferTexture2D Framebuffer (ColorAttachment 1) Texture2D toName2 0 + drawBuffers $= [FBOColorAttachment 0,FBOColorAttachment 1] fboStatus <- framebufferStatus Framebuffer putStrLn $ "after resize, framebuffer status:" ++ show fboStatus return (fboName, (toName1,toName2)) diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 19e6e580e..aa4df2cb7 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -69,13 +69,13 @@ preloadRender = do >>= addUniforms ["lightPos"] -- 2D draw shaders bslist <- makeShader "dualTwoD/basic" [vert,frag] [3,4] ETriangles - aslist <- makeShader "twoD/arc" [vert,frag] [3,4,3] ETriangles - eslist <- makeShader "twoD/ellipse" [vert,geom,frag] [3,4] ETriangles - bezierQuadShader <- makeShader "twoD/bezierQuad" [vert,frag] [3,4,4] ETriangleStrip - cslist <- makeShader "twoD/character" [vert,frag] [3,4,2] ETriangles + aslist <- makeShader "dualTwoD/arc" [vert,frag] [3,4,3] ETriangles + eslist <- makeShader "dualTwoD/ellipse" [vert,geom,frag] [3,4] ETriangles + bezierQuadShader <- makeShader "dualTwoD/bezierQuad" [vert,frag] [3,4,4] ETriangleStrip + cslist <- makeShader "dualTwoD/character" [vert,frag] [3,4,2] ETriangles >>= vaddTextureNoFilter "data/texture/charMap.png" -- this should really be a 2d texture array - basicTweakZShad <- makeShader "twoD/basicTweakZ" [vert,frag] [4,4] ETriangles + basicTweakZShad <- makeShader "dualTwoD/basicTweakZ" [vert,frag] [4,4] ETriangles -- fullscreen shaders fullscreenAlphaHalveShad <- makeShaderSized "fullscreen/alphaHalve" [vert,frag] [2] 4 ETriangleStrip pokeArray (shadVBOptr fullscreenAlphaHalveShad) $ concat cornerListNoCoord @@ -83,9 +83,12 @@ preloadRender = do fsShad <- makeShaderSized "texture/simple" [vert,frag] [2,2] 4 ETriangleStrip -- note we directly poke the shader vertex data here pokeArray (shadVBOptr fsShad) $ concat cornerList + bloomBlurShad <- makeShaderUsingShaderVAO "texture/bloomBlur" [vert,frag] ETriangleStrip fsShad colorBlurShad <- makeShaderUsingShaderVAO "texture/colorBlur" [vert,frag] ETriangleStrip fsShad grayscaleShad <- makeShaderUsingShaderVAO "texture/grayscale" [vert,frag] ETriangleStrip fsShad + fullLightingShad <- makeShaderUsingShaderVAO "lighting/texture" [vert,frag] ETriangleStrip fsShad + >>= addUniforms ["lightPos","lumRad"] barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints -- blank wallShader wlBlank <- makeShader "wall/blank" [vert,geom,frag] [4,4] EPoints @@ -93,7 +96,7 @@ preloadRender = do wlTexture <- makeShader "wall/texture" [vert,geom,frag] [4,4] EPoints >>= addTexture "data/texture/grayscaleDirt.png" ---- texture array shader - textArrayShad <- makeShader "texture/array" [vert,frag] [3,3] ETriangles + textArrayShad <- makeShader "texture/arrayPos" [vert,frag] [3,3] ETriangles >>= addTextureArray "data/texture/ayene_wooden_floor_transformed.png" -- >>= addTextureArray "data/texture/ayene_wooden_floor.png" -- bind fixed vertex data @@ -147,6 +150,7 @@ preloadRender = do , _wallTextureShader = wlTexture { _shaderVAO = wpColVAO } , _textureArrayShader = textArrayShad , _fullscreenShader = fsShad + , _fullLightingShader = fullLightingShad , _fullscreenAlphaHalveShader = fullscreenAlphaHalveShad , _bloomBlurShader = bloomBlurShad , _colorBlurShader = colorBlurShad diff --git a/src/Render.hs b/src/Render.hs index b2e54d31b..d6c2bbbd6 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -95,28 +95,41 @@ createLightMap pdata lightPoints nWalls nSils nsurfVs = do drawShader (_lightingCapShader pdata) (nSils - 6) -- depthClamp $= Disabled - -- use Lequal to redraw surfaces above already drawn surfaces - depthFunc $= Just Lequal - -- draw geometry surfaces - --cullFace $= Just Back + depthFunc $= Just Always cullFace $= Nothing - --colorMask $= Color4 Disabled Disabled Disabled Enabled + bindTO $ snd $ snd $ _fboBase pdata colorMask $= Color4 Enabled Enabled Enabled Enabled stencilOp $= (OpKeep,OpKeep,OpKeep) stencilFunc $= (Equal, 0, 255) - currentProgram $= Just (_shaderProgram $ _lightingSurfaceShader pdata) - uniform (head $ _shaderCustomUnis $ _lightingSurfaceShader pdata) + currentProgram $= Just (_shaderProgram $ _fullLightingShader pdata) + uniform (head $ _shaderCustomUnis $ _fullLightingShader pdata) $= Vector3 x y z - uniform (_shaderCustomUnis (_lightingSurfaceShader pdata) !! 1) + uniform (_shaderCustomUnis (_fullLightingShader pdata) !! 1) $= Vector4 r g b rad - drawShader (_lightingSurfaceShader pdata) nsurfVs - -- draw wall light "circles" - currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata) - uniform (head $ _shaderCustomUnis $ _lightingWallShader pdata) - $= Vector3 x y z - uniform (_shaderCustomUnis (_lightingWallShader pdata) !! 1) - $= Vector4 r g b rad - drawShader (_lightingWallShader pdata) nWalls + drawShader (_fullLightingShader pdata) 4 + +-- -- use Lequal to redraw surfaces above already drawn surfaces +-- depthFunc $= Just Lequal +-- -- draw geometry surfaces +-- --cullFace $= Just Back +-- cullFace $= Nothing +-- --colorMask $= Color4 Disabled Disabled Disabled Enabled +-- colorMask $= Color4 Enabled Enabled Enabled Enabled +-- stencilOp $= (OpKeep,OpKeep,OpKeep) +-- stencilFunc $= (Equal, 0, 255) +-- currentProgram $= Just (_shaderProgram $ _lightingSurfaceShader pdata) +-- uniform (head $ _shaderCustomUnis $ _lightingSurfaceShader pdata) +-- $= Vector3 x y z +-- uniform (_shaderCustomUnis (_lightingSurfaceShader pdata) !! 1) +-- $= Vector4 r g b rad +-- drawShader (_lightingSurfaceShader pdata) nsurfVs +-- -- draw wall light "circles" +-- currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata) +-- uniform (head $ _shaderCustomUnis $ _lightingWallShader pdata) +-- $= Vector3 x y z +-- uniform (_shaderCustomUnis (_lightingWallShader pdata) !! 1) +-- $= Vector4 r g b rad +-- drawShader (_lightingWallShader pdata) nWalls cullFace $= Nothing stencilTest $= Disabled {- | Blur between two framebuffers. @@ -211,3 +224,10 @@ pokeFourOff ptr n (x,y,z,w) = do pokeElemOff ptr (4*n+1) y pokeElemOff ptr (4*n+2) z pokeElemOff ptr (4*n+3) w + +bindTO :: TextureObject -> IO () +bindTO t = textureBinding Texture2D $= Just t + +bindFBO :: FramebufferObject -> IO () +bindFBO fb = bindFramebuffer Framebuffer $= fb +