From d5fbc0633271533fc477089dc3f39d7cbf597a24 Mon Sep 17 00:00:00 2001 From: justin Date: Tue, 21 Mar 2023 14:46:41 +0000 Subject: [PATCH] Prevent cloud "pop" when an overlapping cloud fades out to nothing --- shader/cloud/basic.frag | 7 ++++--- src/Data/Preload/Render.hs | 2 +- src/Dodge/Event/Test.hs | 3 ++- src/Dodge/Render.hs | 22 ++++++++++++++++------ src/Preload/Render.hs | 2 +- src/Render.hs | 4 ++-- src/Shader.hs | 17 ++++++++++++++--- 7 files changed, 40 insertions(+), 17 deletions(-) diff --git a/shader/cloud/basic.frag b/shader/cloud/basic.frag index b661cb741..6cb06fd79 100644 --- a/shader/cloud/basic.frag +++ b/shader/cloud/basic.frag @@ -21,14 +21,15 @@ void main() //float rad = vCenterSize.w; float rad = vCenterSize.w*0.5; float h = (1-d) * rad; - fPos = vec4(vPosID.xy, vPosID.z + h, 1); + fPos = vec4(vPosID.xy, vPosID.z + h, vCol.w*(1-d)); float h1 = float (1 - 0.01*fPos.z); //vec3 fn1 = fPos.z*(1-d)*normalize(vec3(vCenterSize.xyz - fPos.xyz)); //vec3 fn1 = fPos.z*normalize(vec3(vCenterSize.xyz - fPos.xyz)); //vec3 fn1 = vec3(vCenterSize.xyz - fPos.xyz); - vec3 fn1 = fPos.z*(1-d)*normalize(vec3(vCenterSize.xyz - (fPos.xyz + vec3(0,0,0.5*h)))); + //vec3 fn1 = fPos.z*(1-d)*normalize(vec3(vCenterSize.xyz - (fPos.xyz + vec3(0,0,0.5*h)))); + vec3 fn1 = fPos.z*normalize(vec3(vCenterSize.xyz - (fPos.xyz + vec3(0,0,0.5*h)))); //fNorm = vec4(0.5*fn1.xy,fn1.z, 0.5); //fNorm = vec4(fn1.xyz, fCol.w); - fNorm = vec4(fn1,1); + fNorm = vec4(fn1,fPos.w); //fNorm = vec4(0,0,1, 1); } diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index eb418fd52..090e21306 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -29,7 +29,7 @@ data RenderData = RenderData , _wallBlankShader :: FullShader , _windowShader :: FullShader , _wallTextureShader :: FullShader - , _fullscreenShader :: FullShader + , _fullscreenShader :: Shader , _bloomBlurShader :: FullShader , _colorBlurShader :: FullShader , _barrelShader :: (FullShader,VBO) diff --git a/src/Dodge/Event/Test.hs b/src/Dodge/Event/Test.hs index be8f8b331..cdb79487c 100644 --- a/src/Dodge/Event/Test.hs +++ b/src/Dodge/Event/Test.hs @@ -10,7 +10,8 @@ import Geometry testEvent :: World -> World testEvent w = w & cWorld . lWorld . worldEvents .~ SoundStart BackgroundSound (V2 0 0) foamSprayFadeOutS Nothing : - [MakeStartCloudAt (V3 (cx + x) (cy + y) 5) | x <- [-5, -4 .. 5], y <- [-5, -4 .. 5]] + --[MakeStartCloudAt (V3 (cx + x) (cy + y) 5) | x <- [-5, -4 .. 5], y <- [-5, -4 .. 5]] + [MakeStartCloudAt (V3 (cx + x) (cy + y) 5) | x <- [0], y <- [0]] where V2 cx cy = w ^?! cWorld . lWorld . creatures . ix 0 . crPos diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index 168b5f676..ce7c66a43 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -234,7 +234,7 @@ doDrawing' win pdata u = do glDepthFunc GL_ALWAYS glBindTexture GL_TEXTURE_2D (pdata ^. fboBloom . _2 . unTO) glDisable GL_BLEND - drawShader (_bloomBlurShader pdata) 4 + drawFullShader (_bloomBlurShader pdata) 4 replicateM_ 9 $ pingPongBetween (_fboHalf1 pdata) (_fboHalf2 pdata) (_bloomBlurShader pdata) glEnable GL_BLEND setViewportSize (round winx `div` resFact) (round winy `div` resFact) @@ -264,7 +264,7 @@ doDrawing' win pdata u = do (fromIntegral nCloudIs) GL_UNSIGNED_SHORT nullPtr - drawShader (_windowShader pdata) nWins + drawFullShader (_windowShader pdata) nWins when (_graphics_cloud_shadows cfig) $ do ----render transparency depths glDepthMask GL_TRUE @@ -286,7 +286,8 @@ doDrawing' win pdata u = do -- the idea is to (roughly) get the average position --glBlendFunci 1 GL_ONE_MINUS_DST_ALPHA GL_DST_ALPHA -- or, if we order the clouds, just get the top pos - glBlendFunci 1 GL_ONE GL_ZERO + --glBlendFunci 1 GL_ONE GL_ZERO + glBlendFuncSeparatei 1 GL_SRC_ALPHA GL_ONE GL_ONE GL_ONE -- and to sum the normals (based on the alpha) glBlendFunci 2 GL_SRC_ALPHA GL_ONE -- just get the top normal @@ -298,7 +299,15 @@ doDrawing' win pdata u = do (fromIntegral nCloudIs) GL_UNSIGNED_SHORT nullPtr - drawShader (_windowShader pdata) nWins + drawFullShader (_windowShader pdata) nWins + glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboPos . _1 . unFBO) + withArray [0,0,0,0] $ \ptr -> glClearNamedFramebufferfv + (pdata ^. fboPos . _1 . unFBO) + GL_COLOR + 0 + ptr + glBindTextureUnit 0 (pdata ^. fboCloud . _2 . _2 . unTO) + drawShader (pdata ^. alphaDivideShader) 4 glEnable GL_BLEND ----draw lightmap for cloud buffer glDepthMask GL_FALSE @@ -313,7 +322,8 @@ doDrawing' win pdata u = do nSilIndices nIndices (_graphics_object_shadows $ _uvConfig u) - (pdata ^. fboCloud . _2 . _2) + --(pdata ^. fboCloud . _2 . _2) + (pdata ^. fboPos . _2) (pdata ^. fboCloud . _2 . _3) glInvalidateBufferData (pdata ^. vboShapes . vboName) --apply lightmap to cloud buffer @@ -352,7 +362,7 @@ doDrawing' win pdata u = do bindDrawDist (RadialDistortion (V2 a b) (V2 c d) (V2 e f) g) = do pokeArray (shadVBOptr $ _barrelShader pdata) [a, b, c, d, e, f, g] bufferPokedVBO (snd $ _barrelShader pdata) 1 - drawShader (fst $ _barrelShader pdata) 1 + drawFullShader (fst $ _barrelShader pdata) 1 fboList = take (length rds - 1) (concat (repeat [fst $ _fbo2 pdata, fst $ _fbo3 pdata])) ++ [FBO 0] diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 1670eb5d1..4f2cb6c86 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -145,7 +145,7 @@ preloadRender = do 0 screentexturevao <- setupVAOvbo' [2,2] 4 screentexturevbo alphadivideshader <- makeShader4UsingVAO "texture2D/alphaDivide" [vert,frag] GL_TRIANGLE_STRIP screentexturevao - fsShad <- makeShaderUsingVAO "texture/simple" [vert, frag] ETriangleStrip screentexturevao + fsShad <- makeShader4UsingVAO "texture/simple" [vert, frag] GL_TRIANGLE_STRIP screentexturevao bloomBlurShad <- makeShaderUsingVAO "texture/bloomBlur" [vert, frag] ETriangleStrip screentexturevao colorBlurShad <- makeShaderUsingVAO "texture/colorBlur" [vert, frag] ETriangleStrip screentexturevao grayscaleShad <- makeShaderUsingVAO "texture/grayscale" [vert, frag] ETriangleStrip screentexturevao diff --git a/src/Render.hs b/src/Render.hs index 0b923f8cd..474e90ef0 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -346,12 +346,12 @@ pingPongBetween (fb1, to1) (fb2, to2) fs = do glBindFramebuffer GL_FRAMEBUFFER (_unFBO fb2) --textureBinding Texture2D $= Just to1 glBindTexture GL_TEXTURE_2D (_unTO to1) - drawShader fs 4 + drawFullShader fs 4 --bindFramebuffer Framebuffer $= fb1 glBindFramebuffer GL_FRAMEBUFFER (_unFBO fb1) --textureBinding Texture2D $= Just to2 glBindTexture GL_TEXTURE_2D (_unTO to2) - drawShader fs 4 + drawFullShader fs 4 renderFoldable :: MV.MVector (PrimState IO) (FullShader,VBO) -> diff --git a/src/Shader.hs b/src/Shader.hs index b5caf9a98..6914634fa 100644 --- a/src/Shader.hs +++ b/src/Shader.hs @@ -2,6 +2,7 @@ module Shader ( freeShaderPointers' , drawShaderLay , shadVBOptr + , drawFullShader , drawShader , pokeBindFoldable , pokeBindFoldableLayer @@ -35,9 +36,9 @@ drawShaderLay l countsVector shadIn fs = do (fromIntegral $ l*numSubElements) (fromIntegral i) -drawShader :: FullShader -> Int -> IO () -{-# INLINE drawShader #-} -drawShader fs i = do +drawFullShader :: FullShader -> Int -> IO () +{-# INLINE drawFullShader #-} +drawFullShader fs i = do glUseProgram (_shadName fs) glBindVertexArray $ fs ^. shadVAO . vaoName case _shadTex' fs of @@ -50,6 +51,16 @@ drawShader fs i = do 0 (fromIntegral i) +drawShader :: Shader -> Int -> IO () +{-# INLINE drawShader #-} +drawShader fs i = do + glUseProgram (_shaderUINT fs) + glBindVertexArray $ fs ^. shaderVAO . vaoName + glDrawArrays + (_shaderPrimitive fs) + 0 + (fromIntegral i) + freeShaderPointers' :: (FullShader,VBO) -> IO () freeShaderPointers' = free . _vboPtr . snd