func initResources() { var compileOk gl.Int // Vertex Shader vs = gl.CreateShader(gl.VERTEX_SHADER) vsSrc := gl.GLStringArray(vsSource) defer gl.GLStringArrayFree(vsSrc) gl.ShaderSource(vs, gl.Sizei(len(vsSrc)), &vsSrc[0], nil) gl.CompileShader(vs) gl.GetShaderiv(vs, gl.COMPILE_STATUS, &compileOk) if compileOk == 0 { errNum := gl.GetError() fmt.Printf("Error in vertex shader: %d\n", errNum) } // Fragment Shader fs = gl.CreateShader(gl.FRAGMENT_SHADER) fsSrc := gl.GLStringArray(fsSource) defer gl.GLStringArrayFree(fsSrc) gl.ShaderSource(fs, gl.Sizei(1), &fsSrc[0], nil) gl.CompileShader(fs) gl.GetShaderiv(fs, gl.COMPILE_STATUS, &compileOk) if compileOk == 0 { errNum := gl.GetError() fmt.Printf("Error in fragment shader: %d\n", errNum) } // GLSL program program = gl.CreateProgram() gl.AttachShader(program, vs) gl.AttachShader(program, fs) gl.LinkProgram(program) gl.GetProgramiv(program, gl.LINK_STATUS, &compileOk) if compileOk == 0 { fmt.Printf("Error in program.\n") } // Get the attribute location from the GLSL program (here from the vertex shader) attributeName := gl.GLString("coord2d") defer gl.GLStringFree(attributeName) attributeTemp := gl.GetAttribLocation(program, attributeName) if attributeTemp == -1 { fmt.Printf("Could not bind attribute %s\n", gl.GoString(attributeName)) } attributeCoord2d = gl.Uint(attributeTemp) }
func NewShader(type_ gl33.Enum) *Shader { shader := new(Shader) shader.Id = gl33.CreateShader(type_) if shader.Id == 0 { panic(gl33.GetError()) } return shader }