diff options
Diffstat (limited to 'src/Vivant/Shader.hs')
-rw-r--r-- | src/Vivant/Shader.hs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/Vivant/Shader.hs b/src/Vivant/Shader.hs new file mode 100644 index 0000000..503d1b7 --- /dev/null +++ b/src/Vivant/Shader.hs @@ -0,0 +1,49 @@ +module Vivant.Shader (initShaders) where + +import SDL (($=)) +import qualified Graphics.Rendering.OpenGL as GL +import qualified Data.ByteString as BS +import System.Exit (exitFailure) +import System.IO (stderr, hPutStrLn) +import Control.Monad (unless) +import Paths_vivant (getDataDir) + +initShaders :: IO (GL.Program, GL.AttribLocation) +initShaders = do + datadir <- getDataDir + -- compile vertex shader + vs <- GL.createShader GL.VertexShader + vsSource <- BS.readFile $ datadir <> "/shaders/triangle.vert" + GL.shaderSourceBS vs $= vsSource + GL.compileShader vs + vsOK <- GL.get $ GL.compileStatus vs + unless vsOK $ do + hPutStrLn stderr "Error in vertex shader\n" + exitFailure + + -- Do it again for the fragment shader + fs <- GL.createShader GL.FragmentShader + fsSource <- BS.readFile $ datadir <> "/shaders/triangle.frag" + GL.shaderSourceBS fs $= fsSource + GL.compileShader fs + fsOK <- GL.get $ GL.compileStatus fs + unless fsOK $ do + hPutStrLn stderr "Error in fragment shader\n" + exitFailure + + program <- GL.createProgram + GL.attachShader program vs + GL.attachShader program fs + GL.attribLocation program "coord2d" $= GL.AttribLocation 0 + GL.linkProgram program + linkOK <- GL.get $ GL.linkStatus program + GL.validateProgram program + status <- GL.get $ GL.validateStatus program + unless (linkOK && status) $ do + hPutStrLn stderr "GL.linkProgram error" + plog <- GL.get $ GL.programInfoLog program + putStrLn plog + exitFailure + GL.currentProgram $= Just program + + return (program, GL.AttribLocation 0) |