// 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 }
// LoadProgram reads shader sources from the asset repository, compiles, and // links them into a program. func LoadProgram(glctx gl.Context, vertexAsset, fragmentAsset string) (program gl.Program, err error) { log.Println("LoadProgram:", vertexAsset, fragmentAsset) program = glctx.CreateProgram() if program.Value == 0 { return gl.Program{}, fmt.Errorf("glutil: no programs available") } err = LoadShaders(glctx, program, vertexAsset, fragmentAsset) return }
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)) } }