func LoadShaders(glctx gl.Context, program gl.Program, vertexAsset, fragmentAsset string) error { vertexShader, err := loadShader(glctx, gl.VERTEX_SHADER, vertexAsset) if err != nil { return err } fragmentShader, err := loadShader(glctx, gl.FRAGMENT_SHADER, fragmentAsset) if err != nil { glctx.DeleteShader(vertexShader) return err } if glctx.GetProgrami(program, gl.ATTACHED_SHADERS) > 0 { for _, shader := range glctx.GetAttachedShaders(program) { glctx.DetachShader(program, shader) } } glctx.AttachShader(program, vertexShader) glctx.AttachShader(program, fragmentShader) glctx.LinkProgram(program) // Flag shaders for deletion when program is unlinked. glctx.DeleteShader(vertexShader) glctx.DeleteShader(fragmentShader) if glctx.GetProgrami(program, gl.LINK_STATUS) == 0 { defer glctx.DeleteProgram(program) return fmt.Errorf("LoadShaders: %s", glctx.GetProgramInfoLog(program)) } return nil }
// CreateProgram creates, compiles, and links a gl.Program. func CreateProgram(glctx gl.Context, vertexSrc, fragmentSrc string) (gl.Program, error) { program := glctx.CreateProgram() if program.Value == 0 { return gl.Program{}, fmt.Errorf("glutil: no programs available") } vertexShader, err := loadShader(glctx, gl.VERTEX_SHADER, vertexSrc) if err != nil { return gl.Program{}, err } fragmentShader, err := loadShader(glctx, gl.FRAGMENT_SHADER, fragmentSrc) if err != nil { glctx.DeleteShader(vertexShader) return gl.Program{}, err } glctx.AttachShader(program, vertexShader) glctx.AttachShader(program, fragmentShader) glctx.LinkProgram(program) // Flag shaders for deletion when program is unlinked. glctx.DeleteShader(vertexShader) glctx.DeleteShader(fragmentShader) if glctx.GetProgrami(program, gl.LINK_STATUS) == 0 { defer glctx.DeleteProgram(program) return gl.Program{}, fmt.Errorf("glutil: %s", glctx.GetProgramInfoLog(program)) } return program, nil }
func (prg *Program) CreateAndLink(ctx gl.Context, compilers ...func(gl.Context) gl.Shader) { prg.Program = ctx.CreateProgram() for _, c := range compilers { s := c(ctx) ctx.AttachShader(prg.Program, s) defer ctx.DeleteShader(s) } ctx.LinkProgram(prg.Program) if ctx.GetProgrami(prg.Program, gl.LINK_STATUS) == 0 { log.Fatalf("program link: %s", ctx.GetProgramInfoLog(prg.Program)) } }