From 3dc566b6af6bccfb8bab9b3333395966acfe9933 Mon Sep 17 00:00:00 2001 From: jgk Date: Sun, 21 Feb 2021 20:51:56 +0100 Subject: [PATCH] Add wall shadow shaders --- shader/.wallShadow.frag.swp | Bin 0 -> 12288 bytes shader/.wallShadow.geom.swp | Bin 0 -> 12288 bytes shader/wallShadow.frag | 7 +++++++ shader/wallShadow.geom | 26 ++++++++++++++++++++++++++ shader/wallShadow.vert | 11 +++++++++++ src/Picture/Preload.hs | 7 +++++++ src/Shaders.hs | 33 ++++++++++++--------------------- 7 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 shader/.wallShadow.frag.swp create mode 100644 shader/.wallShadow.geom.swp create mode 100644 shader/wallShadow.frag create mode 100644 shader/wallShadow.geom create mode 100644 shader/wallShadow.vert diff --git a/shader/.wallShadow.frag.swp b/shader/.wallShadow.frag.swp new file mode 100644 index 0000000000000000000000000000000000000000..bb5e04a6d9a13b83a205e0c28279308746a3faf6 GIT binary patch literal 12288 zcmeI%ze>YE90%}UU7U)dli+aLrG=(R+76ZCqG&596hvpw_FB(gay5V2L9|aK;^<3= z51C7 zN482X;T7+Rz@BiWPR*^JRQdrQEPfBnLI47D1mdV~HS$!ey0cHcu)W3B*Ush?<1qvv z009U<00Izz00bcL9|fXOj;3Z~OWEd@vp)Bu&xYtA009U<00Izz00bZa0SG_<0ucCv z0=!2QuMj<$BNSUT Hbs*>qrN2>| literal 0 HcmV?d00001 diff --git a/shader/.wallShadow.geom.swp b/shader/.wallShadow.geom.swp new file mode 100644 index 0000000000000000000000000000000000000000..82feeac23ee92f0150ddbb2fca41fba9caa74583 GIT binary patch literal 12288 zcmeI1O=}ZD7{{lct%{y}IZW-rjm^F!=1>T|6lxFHGwjA$*Xwwd}%Ozr=RH7 zBjZOR43+lXnus@K5V-Rql(Bo?n6?{aAMv_q%E;}CAXq@tbRA!s@c4aDFBu>MM;PcN zEqi*L-6@yypZes@34Z1B;t|OdCIe)E43GgbKnBPF86X2>;D0obw8z*k3OhF_?%Lo! zHgX?)r5hO_17v^;DL{_y2$X|Npqi*k|w- zya6x34%h}yfB`iy0e)Rz>koULwlIP$4-8%Lz|HmmF@OO0ysP$+E`80%=&!ovNrf%4arx{0ey z>HgtLXGLQJk$8CpXE_j?rju|hiImWOAXj6w+C@y(TTNw@sD_MDNu|J%R^3l;8>N%D Vz?H7DN#w=Z>8;%Hc*8`J{RRzKTxkFR literal 0 HcmV?d00001 diff --git a/shader/wallShadow.frag b/shader/wallShadow.frag new file mode 100644 index 000000000..e8c6b5aca --- /dev/null +++ b/shader/wallShadow.frag @@ -0,0 +1,7 @@ +#version 430 core +out vec4 fColor; + +void main() +{ + fColor = vec4 (0.9,0.9,0,1); +} diff --git a/shader/wallShadow.geom b/shader/wallShadow.geom new file mode 100644 index 000000000..7c248e807 --- /dev/null +++ b/shader/wallShadow.geom @@ -0,0 +1,26 @@ +#version 430 core +layout (points) in; +layout (triangle_strip, max_vertices = 4) out; + +in vec4 vBackPoss[]; +uniform vec2 lightPos; + +void main() +{ + vec2 posa = gl_in[0].gl_Position.xy; + vec2 posb = gl_in[0].gl_Position.zw; + vec2 v = normalize( posb - posa); + vec2 off = vec2( -(v.y *0.2) + , v.x *0.2 ); + + gl_Position = vec4 (posa, 0 , 1); + EmitVertex(); + gl_Position = vec4 (posb, 0 , 1); + EmitVertex(); + gl_Position = vec4 (posa + off, 0 , 1); + EmitVertex(); + gl_Position = vec4 (posb + off, 0 , 1); + EmitVertex(); + + EndPrimitive(); +} diff --git a/shader/wallShadow.vert b/shader/wallShadow.vert new file mode 100644 index 000000000..731d182aa --- /dev/null +++ b/shader/wallShadow.vert @@ -0,0 +1,11 @@ +#version 430 core +layout (location = 0) in vec4 poss; +layout (location = 1) in vec4 backPoss; + +out vec4 vBackPoss; + +void main() +{ + gl_Position = poss; + vBackPoss = backPoss; +} diff --git a/src/Picture/Preload.hs b/src/Picture/Preload.hs index 91cc7d6c3..7be31c4c7 100644 --- a/src/Picture/Preload.hs +++ b/src/Picture/Preload.hs @@ -25,12 +25,14 @@ data PreloadData = PreloadData , _arcShader :: Program , _fadeCircleShader :: Program , _backShader :: Program + , _wallShadowShader :: Program , _triVAO :: VAO , _lineVAO :: VAO , _textVAO :: VAO , _circVAO :: VAO , _arcVAO :: VAO , _backVAO :: VAO + , _wallVAO :: VAO , _posVBO :: BufferObject , _colVBO :: BufferObject , _texVBO :: BufferObject @@ -103,11 +105,13 @@ doPreload' = do as <- makeArcShader fcs <- makeFadeShader bgs <- makeBackgroundShader + wss <- makeWallShadowShader winSizeUni <- GL.uniformLocation cs "winSize" zoomUni <- GL.uniformLocation cs "zoom" asWinSizeUniLoc <- GL.uniformLocation as "winSize" asZoomUniLoc <- GL.uniformLocation as "zoom" + wssLightPosUniLoc <- GL.uniformLocation wss "lightPos" -- get uniform locations --setup vbos @@ -159,6 +163,7 @@ doPreload' = do circvao <- setupVAO [(posVBO,0,3),(colVBO,1,4),(texVBO,2,1)] arcvao <- setupVAO [(posVBO,0,3),(colVBO,1,4),(texVBO,2,4)] backgroundvao <- setupVAO [(posVBO,0,4),(colVBO,1,2)] + wallvao <- setupVAO [(posVBO,0,4),(colVBO,1,4)] return $ PreloadData { -- _charMap = convertRGBA8 cmap @@ -169,12 +174,14 @@ doPreload' = do , _arcShader = as , _fadeCircleShader = fcs , _backShader = bgs + , _wallShadowShader = wss , _triVAO = trivao , _textVAO = textvao , _circVAO = circvao , _arcVAO = arcvao , _lineVAO = linevao , _backVAO = backgroundvao + , _wallVAO = wallvao , _posVBO = posVBO , _colVBO = colVBO , _texVBO = texVBO diff --git a/src/Shaders.hs b/src/Shaders.hs index 1cfc7d165..d08a06069 100644 --- a/src/Shaders.hs +++ b/src/Shaders.hs @@ -1,14 +1,12 @@ {-# LANGUAGE QuasiQuotes #-} module Shaders - (setupBasicShader - ,setupFadeShader - ,setupShaders - ,makeTextureShader + (makeTextureShader ,makeBasicShader ,makeFadeShader ,makeCircleShader ,makeArcShader ,makeBackgroundShader + ,makeWallShadowShader ) where import Graphics.Rendering.OpenGL @@ -16,13 +14,6 @@ import Control.Monad (when) import Text.RawString.QQ import qualified Data.ByteString as BS -setupShaders :: IO [Program] -setupShaders = do - basicShader <- makeBasicShader - fadeShader <- makeFadeShader - textureShader <- makeTextureShader - return [basicShader,fadeShader,textureShader] - makeBasicShader :: IO Program makeBasicShader = do vsSource <- BS.readFile "shader/basic.vert" @@ -32,11 +23,6 @@ makeBasicShader = do ,(FragmentShader, fsSource) ] -setupBasicShader :: IO () -setupBasicShader = do - shaderProgram <- makeBasicShader - currentProgram $= (Just shaderProgram) - makeCircleShader :: IO Program makeCircleShader = do vsSource <- BS.readFile "shader/circle.vert" @@ -80,11 +66,16 @@ makeBackgroundShader = do ,(FragmentShader, fsSource ) ] -setupFadeShader :: IO Program -setupFadeShader = do - shaderProgram <- makeFadeShader - currentProgram $= (Just shaderProgram) - return shaderProgram +makeWallShadowShader :: IO Program +makeWallShadowShader = do + vsSource <- BS.readFile "shader/wallShadow.vert" + gsSource <- BS.readFile "shader/wallShadow.geom" + fsSource <- BS.readFile "shader/wallShadow.frag" + + makeShaderProgram [(VertexShader, vsSource ) + ,(GeometryShader, gsSource ) + ,(FragmentShader, fsSource ) + ] makeTextureShader :: IO Program makeTextureShader = do