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 }