func (s *screenImpl) NewTexture(size image.Point) (screen.Texture, error) { s.mu.Lock() defer s.mu.Unlock() if !gl.IsProgram(s.texture.program) { p, err := compileProgram(textureVertexSrc, textureFragmentSrc) if err != nil { return nil, err } s.texture.program = p s.texture.pos = gl.GetAttribLocation(p, "pos") s.texture.mvp = gl.GetUniformLocation(p, "mvp") s.texture.uvp = gl.GetUniformLocation(p, "uvp") s.texture.inUV = gl.GetAttribLocation(p, "inUV") s.texture.sample = gl.GetUniformLocation(p, "sample") s.texture.quadXY = gl.CreateBuffer() s.texture.quadUV = gl.CreateBuffer() gl.BindBuffer(gl.ARRAY_BUFFER, s.texture.quadXY) gl.BufferData(gl.ARRAY_BUFFER, quadXYCoords, gl.STATIC_DRAW) gl.BindBuffer(gl.ARRAY_BUFFER, s.texture.quadUV) gl.BufferData(gl.ARRAY_BUFFER, quadUVCoords, gl.STATIC_DRAW) } t := &textureImpl{ id: gl.CreateTexture(), size: size, } gl.BindTexture(gl.TEXTURE_2D, t.id) gl.TexImage2D(gl.TEXTURE_2D, 0, size.X, size.Y, gl.RGBA, gl.UNSIGNED_BYTE, nil) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) return t, nil }
func (w *windowImpl) Fill(dr image.Rectangle, src color.Color, op draw.Op) { if !gl.IsProgram(w.s.fill.program) { p, err := compileProgram(fillVertexSrc, fillFragmentSrc) if err != nil { // TODO: initialize this somewhere else we can better handle the error. panic(err.Error()) } w.s.fill.program = p w.s.fill.pos = gl.GetAttribLocation(p, "pos") w.s.fill.mvp = gl.GetUniformLocation(p, "mvp") w.s.fill.color = gl.GetUniformLocation(p, "color") w.s.fill.quadXY = gl.CreateBuffer() gl.BindBuffer(gl.ARRAY_BUFFER, w.s.fill.quadXY) gl.BufferData(gl.ARRAY_BUFFER, quadXYCoords, gl.STATIC_DRAW) } gl.UseProgram(w.s.fill.program) writeAff3(w.s.fill.mvp, w.vertexAff3(dr)) r, g, b, a := src.RGBA() gl.Uniform4f( w.s.fill.color, float32(r)/65535, float32(g)/65535, float32(b)/65535, float32(a)/65535, ) gl.BindBuffer(gl.ARRAY_BUFFER, w.s.fill.quadXY) gl.EnableVertexAttribArray(w.s.fill.pos) gl.VertexAttribPointer(w.s.fill.pos, 2, gl.FLOAT, false, 0, 0) gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 4) gl.DisableVertexAttribArray(w.s.fill.pos) }