aboutsummaryrefslogtreecommitdiffstats
path: root/src/Vivant/Shader.hs
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