func compile(source string, ty int) gl.Shader { shader := gl.CreateShader(gl.Enum(ty)) gl.ShaderSource(shader, source) gl.CompileShader(shader) if gl.GetShaderi(shader, gl.COMPILE_STATUS) != gl.TRUE { panic(gl.GetShaderInfoLog(shader)) } checkError() return shader }
func loadShader(shaderType gl.Enum, src string) (gl.Shader, error) { shader := gl.CreateShader(shaderType) if !shader.Valid() { return gl.Shader{}, fmt.Errorf("glutil: could not create shader (type %v)", shaderType) } gl.ShaderSource(shader, src) gl.CompileShader(shader) if gl.GetShaderi(shader, gl.COMPILE_STATUS) == 0 { defer gl.DeleteShader(shader) return gl.Shader{}, fmt.Errorf("shader compile: %s", gl.GetShaderInfoLog(shader)) } return shader, nil }
func (s *glShader) createShader(name, header, opts, vShader, fShader string) error { program := gl.CreateProgram() vertexShader := gl.CreateShader(gl.VERTEX_SHADER) gl.ShaderSource(vertexShader, strings.Join([]string{header, opts, vShader}, "\n")) gl.CompileShader(vertexShader) status := gl.Enum(gl.GetShaderi(vertexShader, gl.COMPILE_STATUS)) if status != gl.TRUE { return dumpShaderError(vertexShader, name, "vert") } fragmentShader := gl.CreateShader(gl.FRAGMENT_SHADER) gl.ShaderSource(fragmentShader, strings.Join([]string{header, opts, fShader}, "\n")) gl.CompileShader(fragmentShader) status = gl.Enum(gl.GetShaderi(fragmentShader, gl.COMPILE_STATUS)) if status != gl.TRUE { return dumpShaderError(fragmentShader, name, "vert") } gl.AttachShader(program, vertexShader) gl.AttachShader(program, fragmentShader) gl.LinkProgram(program) status = gl.Enum(gl.GetProgrami(program, gl.LINK_STATUS)) if status != gl.TRUE { return dumpProgramError(program, name) } s.vertexAttrib = gl.GetAttribLocation(program, "vertex") s.tcoordAttrib = gl.GetAttribLocation(program, "tcoord") s.program = program s.vertex = vertexShader s.fragment = fragmentShader return nil }