84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/go-gl/gl/v4.1-core/gl"
|
|
"github.com/go-gl/mathgl/mgl32"
|
|
)
|
|
|
|
type Shader struct {
|
|
ProgramID uint32
|
|
}
|
|
|
|
func NewShader(vSource, fSource string) (*Shader, error) {
|
|
vertexShader := compileShader(gl.VERTEX_SHADER, vSource)
|
|
fragmentShader := compileShader(gl.FRAGMENT_SHADER, fSource)
|
|
|
|
program := gl.CreateProgram()
|
|
gl.AttachShader(program, vertexShader)
|
|
gl.AttachShader(program, fragmentShader)
|
|
gl.LinkProgram(program)
|
|
|
|
var success int32
|
|
gl.GetProgramiv(program, gl.LINK_STATUS, &success)
|
|
if success == gl.FALSE {
|
|
var logLength int32
|
|
gl.GetProgramiv(program, gl.INFO_LOG_LENGTH, &logLength)
|
|
|
|
log := make([]byte, logLength+1)
|
|
gl.GetProgramInfoLog(program, logLength, nil, &log[0])
|
|
fmt.Printf("Failed to link program: %s\n", log)
|
|
return nil, fmt.Errorf("failed to link shader program")
|
|
}
|
|
|
|
gl.DeleteShader(vertexShader)
|
|
gl.DeleteShader(fragmentShader)
|
|
|
|
return &Shader{ProgramID: program}, nil
|
|
}
|
|
|
|
func (s *Shader) Use() {
|
|
gl.UseProgram(s.ProgramID)
|
|
}
|
|
|
|
func (s *Shader) SetUniform(name string, value float32) {
|
|
location := s.getUniformLocation(name)
|
|
gl.Uniform1f(location, value)
|
|
}
|
|
|
|
func (s *Shader) SetUniformM(name string, matrix mgl32.Mat4) {
|
|
location := s.getUniformLocation(name)
|
|
gl.UniformMatrix4fv(location, 1, false, &matrix[0])
|
|
}
|
|
|
|
func (s *Shader) SetUniform4f(name string, v0, v1, v2, v3 float32) {
|
|
location := gl.GetUniformLocation(s.ProgramID, gl.Str(name+"\x00"))
|
|
gl.Uniform4f(location, v0, v1, v2, v3)
|
|
}
|
|
|
|
func (s *Shader) getUniformLocation(name string) int32 {
|
|
cName := gl.Str(name + "\x00")
|
|
return gl.GetUniformLocation(s.ProgramID, cName)
|
|
}
|
|
|
|
func compileShader(shaderType uint32, source string) uint32 {
|
|
shader := gl.CreateShader(shaderType)
|
|
cSource, free := gl.Strs(source + "\x00")
|
|
gl.ShaderSource(shader, 1, cSource, nil)
|
|
free()
|
|
gl.CompileShader(shader)
|
|
|
|
var success int32
|
|
gl.GetShaderiv(shader, gl.COMPILE_STATUS, &success)
|
|
if success == gl.FALSE {
|
|
var logLength int32
|
|
gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength)
|
|
|
|
log := make([]byte, logLength+1)
|
|
gl.GetShaderInfoLog(shader, logLength, nil, &log[0])
|
|
fmt.Printf("Failed to compile shader: %s\n", log)
|
|
}
|
|
return shader
|
|
}
|