func (renderState *renderState) init(window gorgasm.Window) { window.MakeContextCurrent() renderState.window = window width, height := window.GetSize() // Set the viewport gl.Viewport(0, 0, gl.Sizei(width), gl.Sizei(height)) check() // Compile the shaders program := Program(FragmentShader(fsh), VertexShader(vsh)) gl.UseProgram(program) check() // Get attributes attrPos = uint32(gl.GetAttribLocation(program, "pos")) attrTexIn = uint32(gl.GetAttribLocation(program, "texIn")) unifTexture = gl.GetUniformLocation(program, "texture") gl.EnableVertexAttribArray(attrPos) gl.EnableVertexAttribArray(attrTexIn) check() // Upload vertices data gl.GenBuffers(1, &verticesArrayBuffer) gl.BindBuffer(gl.ARRAY_BUFFER, verticesArrayBuffer) gl.BufferData(gl.ARRAY_BUFFER, gl.SizeiPtr(len(vertices))*4, gl.Void(&vertices[0]), gl.STATIC_DRAW) check() // Upload texture data img, err := loadImage(GOPHER_PNG) if err != nil { panic(err) } // Prepare the image to be placed on a texture. bounds := img.Bounds() imgWidth, imgHeight := bounds.Size().X, bounds.Size().Y buffer := make([]byte, imgWidth*imgHeight*4) index := 0 for y := bounds.Min.Y; y < bounds.Max.Y; y++ { for x := bounds.Min.X; x < bounds.Max.X; x++ { r, g, b, a := img.At(x, y).RGBA() buffer[index] = byte(r) buffer[index+1] = byte(g) buffer[index+2] = byte(b) buffer[index+3] = byte(a) index += 4 } } gl.GenTextures(1, &textureBuffer) gl.BindTexture(gl.TEXTURE_2D, textureBuffer) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.Sizei(imgWidth), gl.Sizei(imgHeight), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Void(&buffer[0])) check() gl.ClearColor(0.0, 0.0, 0.0, 1.0) }
func (p Program) Use() { gl.UseProgram(uint32(p)) }
func (p *Program) Use() { gl.UseProgram(p.pid) }