blob: dfd5d4165791f77b5210607d0ec8f7ee8e87fe82 (
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 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)
createProgram :: IO GL.Program
createProgram = 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
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/triangle.frag"
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
|