Add barrel distortion shader
This commit is contained in:
+27
-6
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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))) ;
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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); }
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -20,6 +20,7 @@ data RenderData = RenderData
|
||||
--, _boxBlurShader :: FullShader
|
||||
, _bloomBlurShader :: FullShader
|
||||
, _colorBlurShader :: FullShader
|
||||
, _barrelShader :: FullShader
|
||||
, _grayscaleShader :: FullShader
|
||||
, _pictureShaders :: [FullShader]
|
||||
, _spareFBO :: FramebufferObject
|
||||
|
||||
@@ -102,6 +102,7 @@ data World = World
|
||||
, _debugFlags :: DebugFlags
|
||||
, _inventoryMode :: InventoryMode
|
||||
, _lClickHammer :: HammerPosition
|
||||
, _radDistortion :: [(Point2,Point2,Point2,Float)]
|
||||
}
|
||||
data InventoryMode
|
||||
= TopInventory
|
||||
|
||||
@@ -78,6 +78,7 @@ defaultWorld = World
|
||||
, _inventoryMode = TopInventory
|
||||
, _lClickHammer = HammerUp
|
||||
, _foregroundDecorations = []
|
||||
, _radDistortion = [((00,400),(0,80),(40,40),0.5)]
|
||||
}
|
||||
defaultDebugFlags :: DebugFlags
|
||||
defaultDebugFlags = DebugFlags
|
||||
|
||||
+5
-1
@@ -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)
|
||||
|
||||
@@ -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)}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user