hlgl/shader.go

84 lines
2.1 KiB
Go
Raw Normal View History

2024-11-23 21:54:20 -07:00
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
}