-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshaders.nim
137 lines (97 loc) · 3.85 KB
/
shaders.nim
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# This code is based on two sources:
# 1)
# MIT-licensed code by Ryan Oldenburg:
# https://github.com/guzba/gltfviewer/blob/master/src/gltfviewer/shaders.nim
# 2)
# MIT-licensed code by Jack Mott:
# https://github.com/jackmott/easygl/blob/master/src/easygl/utils.nim
import opengl
import glm
type Shader* = object
ID*: uint32
proc getErrorLog(
id: GLuint,
lenProc: typeof(glGetShaderiv),
strProc: typeof(glGetShaderInfoLog)
): string =
## Gets the error log from compiling or linking shaders.
var length: GLint = 0
lenProc(id, GL_INFO_LOG_LENGTH, length.addr)
var log = newString(length.int)
strProc(id, length, nil, log.cstring)
return log
proc MakeShaders*(vertexPath: string, fragmentPath: string): Shader =
let vertShaderSrc: string = readFile(vertexPath)
let fragShaderSrc: string = readFile(fragmentpath)
## Compiles the shader files and links them into a program, returning that id.
var vertShader, fragShader: GLuint
# Compile the shaders
block shaders:
var vertShaderArray = allocCStringArray([vertShaderSrc])
var fragShaderArray = allocCStringArray([fragShaderSrc])
defer:
deallocCStringArray(vertShaderArray)
deallocCStringArray(fragShaderArray)
# With "nimgl/opengl" we would have to dispense with deallocs
# most likely this way:
#let vertShaderArray = cast[cstring](vertShaderSrc)
#let fragShaderArray = cast[cstring](fragShaderSrc)
var isCompiled: GLint
vertShader = glCreateShader(GL_VERTEX_SHADER)
glShaderSource(vertShader, 1, vertShaderArray, nil)
glCompileShader(vertShader)
glGetShaderiv(vertShader, GL_COMPILE_STATUS, isCompiled.addr)
if isCompiled == 0:
echo vertShaderSrc
echo "Vertex shader compilation failed:"
echo getErrorLog(vertShader, glGetShaderiv, glGetShaderInfoLog)
quit()
fragShader = glCreateShader(GL_FRAGMENT_SHADER)
glShaderSource(fragShader, 1, fragShaderArray, nil)
glCompileShader(fragShader)
glGetShaderiv(fragShader, GL_COMPILE_STATUS, isCompiled.addr)
if isCompiled == 0:
echo fragShaderSrc
echo "Fragment shader compilation failed:"
echo getErrorLog(fragShader, glGetShaderiv, glGetShaderInfoLog)
quit()
# Attach shaders to a GL program
var program = glCreateProgram()
glAttachShader(program, vertShader)
glAttachShader(program, fragShader)
glLinkProgram(program)
var isLinked: GLint
glGetProgramiv(program, GL_LINK_STATUS, isLinked.addr)
if isLinked == 0:
echo "Linking shaders failed:"
echo getErrorLog(program, glGetProgramiv, glGetProgramInfoLog)
quit()
return Shader(ID: program)
proc SetBool*(s: Shader, name: string, value: bool) =
var intValue: int32 = 0
if value: intValue = 1
let loc = glGetUniformLocation(s.ID, name)
if loc == -1: echo "Could not find uniform: ", name
glUniform1i(loc, intValue)
proc SetInt*(s: Shader, name: string, value: int32) =
let loc = glGetUniformLocation(s.ID, name)
if loc == -1: echo "Could not find uniform: ", name
glUniform1i(loc, value)
proc SetFloat*(s: Shader, name: string, value: float32) =
let loc = glGetUniformLocation(s.ID, name)
if loc == -1: echo "Could not find uniform: ", name
glUniform1f(loc, value)
proc SetVec2*(s: Shader, name: string, value: var Vec2f) =
let loc = glGetUniformLocation(s.ID, name)
if loc == -1: echo "Could not find uniform: ", name
glUniform2fv(loc, 1, value.caddr)
proc SetVec3*(s: Shader, name: string, value: var Vec3f) =
let loc = glGetUniformLocation(s.ID, name)
if loc == -1: echo "Could not find uniform: ", name
glUniform3fv(loc, 1, value.caddr)
proc SetMat4*(s: Shader, name: string, value: var Mat4f) =
let loc = glGetUniformLocation(s.ID, name)
if loc == -1: echo "Could not find uniform: ", name
#var temp = value.transpose
#glUniformMatrix4fv(loc, 1, false, temp.caddr)
glUniformMatrix4fv(loc, 1, false, value.caddr)