package texture import ( "errors" "image" "image/draw" _ "image/png" "os" "github.com/go-gl/gl/v4.6-core/gl" ) type Texture struct { texture uint32 } func (t Texture) Bind(slot uint32) { gl.ActiveTexture(slot) gl.BindTexture(gl.TEXTURE_2D, t.texture) } func (t Texture) Delete() { gl.DeleteTextures(1, &t.texture) } func Load(path string) (texture Texture, _ error) { file, err := os.Open(path) if err != nil { return texture, err } img, _, err := image.Decode(file) if err != nil { return texture, err } rgba := image.NewRGBA(img.Bounds()) if rgba.Stride != rgba.Rect.Size().X*4 { return texture, errors.New("unsupported stride") } draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src) gl.GenTextures(1, &texture.texture) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, texture.texture) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) gl.TexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, int32(rgba.Rect.Size().X), int32(rgba.Rect.Size().Y), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba.Pix)) return texture, nil }