82 lines
1.7 KiB
Go
82 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/go-gl/gl/v4.1-core/gl"
|
|
)
|
|
|
|
func compileShader(src string, stype uint32) (prog uint32, err error) {
|
|
prog = gl.CreateShader(stype)
|
|
|
|
strs, free := gl.Strs(src, "\x00")
|
|
gl.ShaderSource(prog, 1, strs, nil)
|
|
free()
|
|
gl.CompileShader(prog)
|
|
|
|
var status int32
|
|
gl.GetShaderiv(prog, gl.COMPILE_STATUS, &status)
|
|
if status == gl.FALSE {
|
|
var len int32
|
|
gl.GetShaderiv(prog, gl.INFO_LOG_LENGTH, &len)
|
|
|
|
log := strings.Repeat("\x00", int(len+1))
|
|
gl.GetShaderInfoLog(prog, len, nil, gl.Str(log))
|
|
|
|
gl.DeleteShader(prog)
|
|
|
|
switch stype {
|
|
case gl.VERTEX_SHADER:
|
|
return 0, fmt.Errorf("failed to compile Vertex Shader: %s", log)
|
|
case gl.FRAGMENT_SHADER:
|
|
return 0, fmt.Errorf("failed to compile Fragment Shader: %s", log)
|
|
default:
|
|
return 0, fmt.Errorf("failed to compile Unknown(%d) Shader: %s", stype, log)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func newProgram(vert, frag string) (prog uint32, err error) {
|
|
|
|
vertid, err := compileShader(vert, gl.VERTEX_SHADER)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
fragid, err := compileShader(frag, gl.FRAGMENT_SHADER)
|
|
if err != nil {
|
|
gl.DeleteShader(vertid)
|
|
return 0, err
|
|
}
|
|
|
|
prog = gl.CreateProgram()
|
|
|
|
gl.AttachShader(prog, vertid)
|
|
gl.AttachShader(prog, fragid)
|
|
gl.LinkProgram(prog)
|
|
|
|
var status int32
|
|
gl.GetProgramiv(prog, gl.LINK_STATUS, &status)
|
|
if status == gl.FALSE {
|
|
var len int32
|
|
gl.GetProgramiv(prog, gl.INFO_LOG_LENGTH, &len)
|
|
|
|
log := strings.Repeat("\x00", int(len+1))
|
|
gl.GetProgramInfoLog(prog, len, nil, gl.Str(log))
|
|
|
|
gl.DeleteProgram(prog)
|
|
gl.DeleteShader(vertid)
|
|
gl.DeleteShader(fragid)
|
|
|
|
return 0, fmt.Errorf("failed to link Program: %s", log)
|
|
}
|
|
|
|
gl.DeleteShader(vertid)
|
|
gl.DeleteShader(fragid)
|
|
|
|
return
|
|
}
|