func newProgram(vertexShaderSource, fragmentShaderSource string) (uint32, error) { vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER) if err != nil { return 0, err } fragmentShader, err := compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER) if err != nil { return 0, err } program := gl.CreateProgram() gl.AttachShader(program, vertexShader) gl.AttachShader(program, fragmentShader) gl.LinkProgram(program) var status int32 gl.GetProgramiv(program, gl.LINK_STATUS, &status) if status == gl.FALSE { var logLength int32 gl.GetProgramiv(program, gl.INFO_LOG_LENGTH, &logLength) log := strings.Repeat("\x00", int(logLength+1)) gl.GetProgramInfoLog(program, logLength, nil, gl.Str(log)) return 0, fmt.Errorf("failed to link program: %v", log) } gl.DeleteShader(vertexShader) gl.DeleteShader(fragmentShader) return program, nil }
func compileShader(source string, shaderType uint32) (uint32, error) { shader := gl.CreateShader(shaderType) csource := gl.Str(source) gl.ShaderSource(shader, 1, &csource, nil) gl.CompileShader(shader) var status int32 gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status) if status == gl.FALSE { var logLength int32 gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength) log := strings.Repeat("\x00", int(logLength+1)) gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log)) return 0, fmt.Errorf("failed to compile %v: %v", source, log) } return shader, nil }
func setupGL() int32 { gl.Disable(gl.DEPTH_TEST) gl.ClearColor(0.7, 0.7, 0.7, 1) program, _ := loadResources() gl.BindFragDataLocation(program, 0, gl.Str("outputColor\x00")) cameraMatrixUniform := gl.GetUniformLocation(program, gl.Str("cameraMatrix\x00")) octUniform := gl.GetUniformLocation(program, gl.Str("oct\x00")) gl.Uniform1i(octUniform, 0) gl.Viewport(0, 0, winWidth, winHeight) var vao uint32 gl.GenVertexArrays(1, &vao) gl.BindVertexArray(vao) quadVertexBufferData := []float32{ -1, -1, 0, 1, -1, 0, -1, 1, 0, -1, 1, 0, 1, -1, 0, 1, 1, 0, } var vbo uint32 gl.GenBuffers(1, &vbo) gl.BindBuffer(gl.ARRAY_BUFFER, vbo) gl.BufferData(gl.ARRAY_BUFFER, len(quadVertexBufferData)*4, gl.Ptr(quadVertexBufferData), gl.STATIC_DRAW) vertAttrib := uint32(gl.GetAttribLocation(program, gl.Str("inputPosition\x00"))) gl.EnableVertexAttribArray(vertAttrib) gl.VertexAttribPointer(vertAttrib, 3, gl.FLOAT, false, 0, gl.PtrOffset(0)) return cameraMatrixUniform }
// BindAttribLocation implements the opengl.OpenGl interface. func (native *OpenGl) BindAttribLocation(program uint32, index uint32, name string) { gl.BindAttribLocation(program, index, gl.Str(name+"\x00")) }
// GetUniformLocation implements the opengl.OpenGl interface. func (native *OpenGl) GetUniformLocation(program uint32, name string) int32 { return gl.GetUniformLocation(program, gl.Str(name+"\x00")) }
// GetShaderInfoLog implements the opengl.OpenGl interface. func (native *OpenGl) GetShaderInfoLog(shader uint32) string { logLength := native.GetShaderParameter(shader, gl.INFO_LOG_LENGTH) log := strings.Repeat("\x00", int(logLength+1)) gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log)) return log }
// GetProgramInfoLog implements the opengl.OpenGl interface. func (native *OpenGl) GetProgramInfoLog(program uint32) string { logLength := native.GetProgramParameter(program, gl.INFO_LOG_LENGTH) log := strings.Repeat("\x00", int(logLength+1)) gl.GetProgramInfoLog(program, logLength, nil, gl.Str(log)) return log }