|
import nimgl/opengl |
|
|
|
proc createShader(source:cstring, shaderType: GLEnum): GLuint = |
|
result = glCreateShader(shaderType) |
|
assert result != 0 |
|
glShaderSource(result, 1, unsafeAddr source, nil) |
|
glCompileShader(result) |
|
var logLen: GLint |
|
glGetShaderiv(result, GL_INFO_LOG_LENGTH, addr logLen) |
|
if logLen != 0: |
|
var log = newseq[int8](logLen) |
|
glGetShaderInfoLog(result, logLen, nil, cast[cstring](addr log[0])) |
|
echo "Message from OpenGL shader compiler:" |
|
echo cast[cstring](addr log[0]) |
|
|
|
var compileStatus: GLint |
|
glGetShaderiv(result, GL_COMPILE_STATUS, addr compileStatus) |
|
if compileStatus != cast[GLint](GL_TRUE): |
|
quit "Failed to compile shader" |
|
|
|
proc linkProgramObj(progObj: GLuint) = |
|
glLinkProgram(progObj) |
|
|
|
var logLen: GLint |
|
glGetProgramiv(progObj, GL_INFO_LOG_LENGTH, addr logLen) |
|
if logLen != 0: |
|
var log = newseq[int8](logLen) |
|
glGetProgramInfoLog(progObj, logLen, nil, cast[cstring](addr log[0])) |
|
echo "Message from OpenGL shader compiler:" |
|
echo cast[cstring](addr log[0]) |
|
|
|
var success: GLint |
|
glGetProgramiv(progObj, GL_LINK_STATUS, addr success) |
|
if success != cast[GLint](GL_TRUE): |
|
quit "Failed to link shader" |
|
|
|
proc newProgObj*( |
|
shaderSrc0: string; |
|
shaderType0: GLEnum; |
|
shaderSrc1: string; |
|
shaderType1: GLEnum): GLuint = |
|
let vso = createShader(shaderSrc0, shaderType0) |
|
let fso = createShader(shaderSrc1, shaderType1) |
|
result = glCreateProgram() |
|
glAttachShader(result, vso) |
|
glAttachShader(result, fso) |
|
result.linkProgramObj() |
|
glDeleteShader(vso) |
|
glDeleteShader(fso) |
|
|
|
proc newProgObj*(vertShaderSrc, fragShaderSrc: string): GLuint = |
|
newProgObj(vertShaderSrc, GL_VERTEX_SHADER, fragShaderSrc, GL_FRAGMENT_SHADER) |