blob: 503d1b753a634dce35744d4a0be065c7e7047a2a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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)
|