From fd388e1fdf0eac2a0066d0583f31bf2b1bb5c201 Mon Sep 17 00:00:00 2001 From: jgk Date: Fri, 9 Jul 2021 14:36:49 +0200 Subject: [PATCH] Add barrel distortion shader --- shader/background.geom | 33 ++++++++++++++++---- shader/texture/barrel.frag | 18 +++++++++++ shader/texture/barrel.geom | 48 +++++++++++++++++++++++++++++ shader/texture/barrel.vert | 17 +++++++++++ shader/texture/colorBlur.frag | 57 +++++++++++++++++++++++++++++++++++ shader/texture/colorBlur.vert | 9 ++++++ src/Data/Preload/Render.hs | 1 + src/Dodge/Data.hs | 1 + src/Dodge/Default/World.hs | 1 + src/Dodge/Render.hs | 6 +++- src/Picture/Data.hs | 1 + src/Preload/Render.hs | 8 ++++- 12 files changed, 192 insertions(+), 8 deletions(-) create mode 100644 shader/texture/barrel.frag create mode 100644 shader/texture/barrel.geom create mode 100644 shader/texture/barrel.vert create mode 100644 shader/texture/colorBlur.frag create mode 100644 shader/texture/colorBlur.vert diff --git a/shader/background.geom b/shader/background.geom index 1db0c2bd1..e2d3dbe37 100644 --- a/shader/background.geom +++ b/shader/background.geom @@ -1,15 +1,36 @@ #version 430 core layout (points) in; layout (triangle_strip, max_vertices = 4) out; -void main() -{ - gl_Position = vec4 (1,1,0.9,1); +in vec2 vRad1; +in vec2 vRad2; +in float vFactor; +out vec2 cenPos; +out vec2 texPos; +out vec2 texDist; +out float factor; +const float root = 1 / sqrt(2) ; +void main() { + factor = vFactor[0]; + rad1 = vRad1[0]; + rad2 = vRad2[0]; + cenPos = gl_in[0].gl_Position; + vec2 g (vec2 p) { return vec2(dot(rad1,p), dot(rad2,p)); } + + texPos = vec2(1,1); + texDist = g(root,root); + gl_Position = vec4 (1,1,0,1); EmitVertex(); - gl_Position = vec4 (1,-1,0.9,1); + texPos = vec2(1,0); + texDist = g(root,-root); + gl_Position = vec4 (1,-1,0,1); EmitVertex(); - gl_Position = vec4 (-1,1,0.9,1); + texPos = vec2(0,1); + texDist = g(-root,root); + gl_Position = vec4 (-1,1,0,1); EmitVertex(); - gl_Position = vec4 (-1,-1,0.9,1); + texPos = vec2(0,0); + texDist = g(-root,-root); + gl_Position = vec4 (-1,-1,0,1); EmitVertex(); EndPrimitive(); } diff --git a/shader/texture/barrel.frag b/shader/texture/barrel.frag new file mode 100644 index 000000000..2208f250d --- /dev/null +++ b/shader/texture/barrel.frag @@ -0,0 +1,18 @@ +#version 430 core +in vec2 cenPos; +in vec2 texPos; +in vec2 texDist; +in float factor; +out vec4 fColor; +layout (binding = 1) uniform sampler2D screenTexture; +float f ( float x) { + return max (1, 1 / (2 * x + 0.5)) ; +// return min (1, x) ; +} +void main() +{ + vec4 tColor = vec4(texture(screenTexture , texPos) ); + float t = distance(cenPos,texDist); + fColor = vec4(tColor.xy,t,tColor.w); + //, cenPos + f(distance(cenPos,texDist)) * (texPos - cenPos))) ; +} diff --git a/shader/texture/barrel.geom b/shader/texture/barrel.geom new file mode 100644 index 000000000..00209e2e6 --- /dev/null +++ b/shader/texture/barrel.geom @@ -0,0 +1,48 @@ +#version 430 core +layout (points) in; +layout (triangle_strip, max_vertices = 4) out; +in vec2 vRad1[]; +in vec2 vRad2[]; +in float vFactor[]; +out vec2 cenPos; +out vec2 texPos; +out vec2 texDist; +out float factor; +//const float root = 1 / sqrt(2); +const float root = 1; +vec2 cpos = gl_in[0].gl_Position.xy; +vec2 rad1 = vRad1[0]; +vec2 rad2 = vRad2[0]; +vec2 g(float x,float y) + { return vec2 + //(x,y); + (dot(rad1-cpos,vec2(x,y)-cpos) + ,dot(rad2-cpos,vec2(x,y)-cpos) + ); + } +void main() { + float factor = vFactor[0]; + cenPos = cpos; + texPos = vec2(1,1); + //texDist = g(root,root); + texDist = vec2(root,root); + gl_Position = vec4 (1,1,0,1); + //gl_Position = vec4 (cenPos,0,1); + EmitVertex(); + texPos = vec2(1,0); + //texDist = g(root,-root); + texDist = vec2(root,-root); + gl_Position = vec4 (1,-1,0,1); + EmitVertex(); + texPos = vec2(0,1); + //texDist = g(-root,root); + texDist = vec2(-root,root); + gl_Position = vec4 (-1,1,0,1); + EmitVertex(); + texPos = vec2(0,0); + //texDist = g(-root,-root); + texDist = vec2(-root,-root); + gl_Position = vec4 (-1,-1,0,1); + EmitVertex(); + EndPrimitive(); +} diff --git a/shader/texture/barrel.vert b/shader/texture/barrel.vert new file mode 100644 index 000000000..835f8fffe --- /dev/null +++ b/shader/texture/barrel.vert @@ -0,0 +1,17 @@ +#version 430 core +layout (location = 0) in vec2 pos; +layout (location = 1) in vec2 rad1; +layout (location = 2) in vec2 rad2; +layout (location = 3) in float factor; +layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; +out vec2 vRad1; +out vec2 vRad2; +out float vFactor; +void main() +{ + gl_Position = theMat * vec4(pos,0,1); + //gl_Position = vec4(1,1,0,1); + vRad1 = (theMat * vec4(rad1,0,1)).xy; + vRad2 = (theMat * vec4(rad2,0,1)).xy; + vFactor = factor; +} diff --git a/shader/texture/colorBlur.frag b/shader/texture/colorBlur.frag new file mode 100644 index 000000000..5de6ac6da --- /dev/null +++ b/shader/texture/colorBlur.frag @@ -0,0 +1,57 @@ +#version 430 core +in vec2 vTexPos; +out vec4 fColor; + +uniform vec2 winSize; +uniform sampler2D screenTexture; + +const float hOff = 2.0 / 600; +const float vOff = 2.0 / 600; +const float frac = 1.0 / 9; +const vec2 off[9] = vec2[] + ( vec2( vOff,hOff ) + , vec2( vOff,0.0 ) + , vec2( vOff,-hOff ) + , vec2( 0.0,hOff ) + , vec2( 0.0,0.0 ) + , vec2( 0.0,-hOff ) + , vec2( -vOff,hOff ) + , vec2( -vOff,0.0 ) + , vec2( -vOff,-hOff ) + ); +const vec2 fiveOff[5] = vec2[] + ( vec2( vOff,0.0 ) + , vec2( 0.0,hOff ) + , vec2( 0.0,0.0 ) + , vec2( 0.0,-hOff ) + , vec2( -vOff,0.0 ) + ); +vec4 combinef (vec4 ac, vec4 bc) +//{ return vec4 (max(ac.x,bc.x),max(ac.y,bc.y),max(ac.z,bc.z),ac.w + bc.w - +// ac.w*bc.w); +//{ return vec4 (max(ac.x,bc.x),max(ac.y,bc.y),max(ac.z,bc.z),ac.w + bc.w); +{ return vec4 (ac.rgb + bc.rgb * bc.a , ac.a + bc.a ); +} +void main() +{ + vec4 sampleTex[9]; + for(int i=0; i<9; i++) + { + sampleTex[i] = vec4(texture(screenTexture, vTexPos + off[i])); + } + vec4 col = vec4(0,0,0,0); + for (int i = 0; i < 9; i++) + col = combinef(col,sampleTex[i]); + //col += sampleTex[i] * frac; + float alph = 0.0; + for (int i = 0; i < 9; i++) + alph += sampleTex[i].a; + alph = min(sampleTex[4].a, alph/9.0); + // + //fColor = col; + fColor = vec4(col.rgb/col.a,alph); + //if (col.a == 0.0) + //{ fColor = vec4(0,0,0,0); } + //else + //{ fColor = vec4( col.r/col.a , col.g/col.a , col.b/col.a, col.a/9.0); } +} diff --git a/shader/texture/colorBlur.vert b/shader/texture/colorBlur.vert new file mode 100644 index 000000000..dc9e41d80 --- /dev/null +++ b/shader/texture/colorBlur.vert @@ -0,0 +1,9 @@ +#version 430 core +layout (location = 0) in vec2 pos; +layout (location = 1) in vec2 texPos; +out vec2 vTexPos; +void main() +{ + gl_Position = vec4(pos,0,1); + vTexPos = texPos; +} diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index 13187a0dc..f20560dab 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -20,6 +20,7 @@ data RenderData = RenderData --, _boxBlurShader :: FullShader , _bloomBlurShader :: FullShader , _colorBlurShader :: FullShader + , _barrelShader :: FullShader , _grayscaleShader :: FullShader , _pictureShaders :: [FullShader] , _spareFBO :: FramebufferObject diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index 2b7c49227..eb309ff83 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -102,6 +102,7 @@ data World = World , _debugFlags :: DebugFlags , _inventoryMode :: InventoryMode , _lClickHammer :: HammerPosition + , _radDistortion :: [(Point2,Point2,Point2,Float)] } data InventoryMode = TopInventory diff --git a/src/Dodge/Default/World.hs b/src/Dodge/Default/World.hs index 821c1d27a..3137583f6 100644 --- a/src/Dodge/Default/World.hs +++ b/src/Dodge/Default/World.hs @@ -78,6 +78,7 @@ defaultWorld = World , _inventoryMode = TopInventory , _lClickHammer = HammerUp , _foregroundDecorations = [] + , _radDistortion = [((00,400),(0,80),(40,40),0.5)] } defaultDebugFlags :: DebugFlags defaultDebugFlags = DebugFlags diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index c0ba20f65..c36122a9d 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -144,8 +144,12 @@ doDrawing pdata w = do depthFunc $= Just Always bindFramebuffer Framebuffer $= defaultFramebufferObject clear [ColorBuffer] + activeTexture $= TextureUnit 1 textureBinding Texture2D $= Just (snd $ _fboBase pdata) - drawShader (_fullscreenShader pdata) 4 + nraddist <- F.foldM (pokeShader $ _barrelShader pdata) (map Render2221 $ _radDistortion w) + bindShaderBuffers [_barrelShader pdata] [nraddist] + drawShader (_barrelShader pdata) 4 + activeTexture $= TextureUnit 0 -- draw overlay bufferUBO $ isoMatrix 0 1 (0,0) (2,2) diff --git a/src/Picture/Data.hs b/src/Picture/Data.hs index a98c52824..87ce8739f 100644 --- a/src/Picture/Data.hs +++ b/src/Picture/Data.hs @@ -25,6 +25,7 @@ data RenderType | RenderConst | Render1111 {_unRender1111 :: (Float,Float,Float,Float)} | Render22 {_unRender22 :: (Point2,Point2)} + | Render2221 {_unRender2221 :: (Point2,Point2,Point2,Float)} | Render22x4 {_unRender22x4 :: ((Point2,Point2),Point4)} | Render3x2 {_unRender3x2 :: (Point3,Point2)} | Render3x3 {_unRender3x3 :: (Point3,Point3)} diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 577549b72..ce8cf9881 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -61,6 +61,7 @@ preloadRender = do pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO colorBlurShad) $ concat cornerList grayscaleShad <- makeShader "texture/grayscale" [vert,frag] [2,2] ETriangleStrip $ const cornerList pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO grayscaleShad) $ concat cornerList + barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints pokeRadDist -- blank wallShader wlBlank <- makeShader "wall/blank" [vert,geom,frag] [4,4] EPoints pokeWPColStrat -- textured wallShader @@ -73,7 +74,7 @@ preloadRender = do textArrayShad <- makeShader "texture/array" [vert,frag] [3,3] ETriangles poke33 >>= addTextureArray "data/texture/ayene_wooden_floor.png" -- bind fixed vertex data - bindShaderBuffers [bloomBlurShad,colorBlurShad,fullscreenAlphaHalveShad ] [4,4,4] + bindShaderBuffers [bloomBlurShad,colorBlurShad,fullscreenAlphaHalveShad] [4,4,4] -- framebuffer for lighting (fbo,fboTO,fboRBO) <- setupFramebufferWithStencil framebuf2 <- setupFramebufferWithStencil @@ -116,6 +117,7 @@ preloadRender = do , _fullscreenAlphaHalveShader = fullscreenAlphaHalveShad , _bloomBlurShader = bloomBlurShad , _colorBlurShader = colorBlurShad + , _barrelShader = barrelShad , _grayscaleShader = grayscaleShad , _spareFBO = fbo , _fboTexture = fboTO @@ -262,6 +264,10 @@ pokeWPStrat :: RenderType -> [[Float]] pokeWPStrat Render22{_unRender22 = ((x,y),(z,w))} = [[x,y,z,w]] pokeWPStrat _ = undefined +pokeRadDist :: RenderType -> [[Float]] +pokeRadDist Render2221{_unRender2221 = ((a,b),(c,d),(e,f),g)} = [[a,b,c,d,e,f,g]] +pokeRadDist _ = undefined + pokeWPColStrat :: RenderType -> [[Float]] pokeWPColStrat Render22x4{_unRender22x4=(((x,y),(z,w)),(r,g,b,a))} = [[x,y,z,w,r,g,b,a]] pokeWPColStrat _ = undefined