blob: 4ba5c093420ede3030031b0184f303a7f6065a6b (
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
50
|
module Vivant.Shader (createProgram) where
import Control.Monad (unless)
import qualified Data.ByteString as BS
import qualified Graphics.Rendering.OpenGL as GL
import Paths_vivant (getDataDir)
import SDL (($=))
import System.Exit (exitFailure)
import System.IO (hPutStrLn, stderr)
createProgram :: IO GL.Program
createProgram = do
datadir <- getDataDir
-- compile vertex shader
vs <- GL.createShader GL.VertexShader
vsSource <- BS.readFile $ datadir <> "/shaders/phong.vert.glsl"
GL.shaderSourceBS vs $= vsSource
GL.compileShader vs
vsOK <- GL.get $ GL.compileStatus vs
unless vsOK $ do
log <- GL.shaderInfoLog vs
hPutStrLn stderr ("Error in vertex shader\n" <> log)
exitFailure
-- Do it again for the fragment shader
fs <- GL.createShader GL.FragmentShader
fsSource <- BS.readFile $ datadir <> "/shaders/phong.frag.glsl"
GL.shaderSourceBS fs $= fsSource
GL.compileShader fs
fsOK <- GL.get $ GL.compileStatus fs
unless fsOK $ do
log <- GL.shaderInfoLog fs
hPutStrLn stderr ("Error in fragment shader\n" <> log)
exitFailure
program <- GL.createProgram
GL.attachShader program vs
GL.attachShader program fs
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
|