func (glRenderer *OpenglRenderer) loadTexture(img image.Image, textureUnit uint32, lod bool) uint32 { rgba := image.NewRGBA(img.Bounds()) if rgba.Stride != rgba.Rect.Size().X*4 { log.Fatal("unsupported stride") } draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src) var texId uint32 gl.GenTextures(1, &texId) gl.ActiveTexture(textureUnit) gl.BindTexture(gl.TEXTURE_2D, texId) if rgba.Rect.Size().X == 0 || rgba.Rect.Size().Y == 0 { return texId } 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), ) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_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) if lod { gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.GenerateMipmap(gl.TEXTURE_2D) } else { gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) } return texId }
func (me *Core) AddTexture(file string) int { imgFile, err := os.Open(file) if err != nil { fmt.Println("Could not open file:", file) panic(err) } img, _, err := image.Decode(imgFile) if err != nil { fmt.Println("Could not decode file:", file) panic(err) } rgba := image.NewRGBA(img.Bounds()) if rgba.Stride != rgba.Rect.Size().X*FloatSize { fmt.Println("Stride unsupported, file:", file) panic(err) } draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src) var texture uint32 gl.GenTextures(1, &texture) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, 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.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) 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)) n := me.nbTexture me.Textures[n] = texture me.nbTexture++ return n }
func NewFont(file string, rows int) (err error, font *Font) { var imgFile *os.File if imgFile, err = os.Open(file); err != nil { return err, nil } defer imgFile.Close() var img image.Image if img, _, err = image.Decode(imgFile); err != nil { return err, nil } gray := image.NewGray(img.Bounds()) if gray.Stride != gray.Rect.Size().X { return fmt.Errorf("unsupported stride"), nil } draw.Draw(gray, gray.Bounds(), img, image.Point{0, 0}, draw.Src) var t uint32 gl.GenTextures(1, &t) var texture *Texture = &Texture{t, gray.Rect.Size()} texture.BindTexture(0) 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.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.TexImage2D( gl.TEXTURE_2D, 0, gl.R8, int32(gray.Rect.Size().X), int32(gray.Rect.Size().Y), 0, gl.RED, gl.UNSIGNED_BYTE, gl.Ptr(gray.Pix)) font = &Font{texture, nil, rows, gray.Rect.Size().X / rows} return nil, font }
func (glRenderer *OpenglRenderer) CreatePostEffect(shader *renderer.Shader) { //Create program glRenderer.CreateShader(shader) gl.UseProgram(shader.Program) //Create Texture var fbo_texture uint32 gl.ActiveTexture(gl.TEXTURE0) gl.GenTextures(1, &fbo_texture) gl.BindTexture(gl.TEXTURE_2D, fbo_texture) 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) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, int32(glRenderer.WindowWidth), int32(glRenderer.WindowHeight), 0, gl.RGBA, gl.UNSIGNED_BYTE, nil) //Create depth buffer var dbo uint32 gl.GenRenderbuffers(1, &dbo) gl.BindRenderbuffer(gl.RENDERBUFFER, dbo) gl.RenderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, int32(glRenderer.WindowWidth), int32(glRenderer.WindowHeight)) gl.BindRenderbuffer(gl.RENDERBUFFER, 0) //Create frame buffer var fbo uint32 gl.GenFramebuffers(1, &fbo) gl.BindFramebuffer(gl.FRAMEBUFFER, fbo) gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, fbo_texture, 0) gl.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, dbo) //add new postEffect to the queue newPe := postEffect{ program: shader.Program, textureId: fbo_texture, dboId: dbo, fboId: fbo, shader: shader, } glRenderer.postEffects = append(glRenderer.postEffects, newPe) }
func (font *Font) createTexture(text string, width int, height int, size float64, dpi float64, rgba color.Color) (uint32, int, int) { context := freetype.NewContext() context.SetFont(font.ttf) img := image.NewRGBA(image.Rect(0, 0, width, height)) r, g, b, _ := rgba.RGBA() draw.Draw(img, img.Bounds(), image.NewUniform(color.RGBA{uint8(r), uint8(g), uint8(b), 0}), image.ZP, draw.Src) context.SetDst(img) context.SetClip(img.Bounds()) context.SetSrc(image.NewUniform(rgba)) context.SetFontSize(size) context.SetDPI(dpi) pixelBounds, _ := context.DrawString(text, freetype.Pt(0, height/2)) var tex uint32 gl.GenTextures(1, &tex) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, tex) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) 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) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, tex) gl.TexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, int32(img.Rect.Size().X), int32(img.Rect.Size().Y), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(img.Pix)) return tex, int26_6Ceiling(pixelBounds.X + 0x3f), int26_6Ceiling(pixelBounds.Y + 0x3f) }
func (t *Texture) create(file string) error { imgFile, err := os.Open(file) if err != nil { return fmt.Errorf("texture %q not found on disk: %v", file, err) } img, _, err := image.Decode(imgFile) if err != nil { return err } rgba := image.NewRGBA(img.Bounds()) if rgba.Stride != rgba.Rect.Size().X*4 { return fmt.Errorf("unsupported stride") } draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src) var tex uint32 gl.GenTextures(1, &tex) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, tex) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) 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) 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)) t.id = tex t.Width = rgba.Rect.Size().X t.Height = rgba.Rect.Size().Y return nil }
/* Creates a new GL texture and sets basic options */ func CreateTexture(width, height int32) *Texture { var id uint32 gl.GenTextures(1, &id) tx := &Texture{ Id: id, Width: width, Height: height, Format: gl.RGBA, InternalFormat: gl.RGBA, DataType: gl.UNSIGNED_BYTE, } tx.Bind() /* Texture parameters - pass as parameters? */ gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) 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 tx }
func NewTexture(img image.Image, wrapR, wrapS int32) (*Texture, error) { rgba := image.NewRGBA(img.Bounds()) draw.Draw(rgba, rgba.Bounds(), img, image.Pt(0, 0), draw.Src) if rgba.Stride != rgba.Rect.Size().X*4 { // TODO-cs: why? return nil, errUnsupportedStride } var handle uint32 gl.GenTextures(1, &handle) target := uint32(gl.TEXTURE_2D) internalFmt := int32(gl.SRGB_ALPHA) format := uint32(gl.RGBA) width := int32(rgba.Rect.Size().X) height := int32(rgba.Rect.Size().Y) pixType := uint32(gl.UNSIGNED_BYTE) dataPtr := gl.Ptr(rgba.Pix) texture := Texture{ handle: handle, target: target, } texture.Bind(gl.TEXTURE0) defer texture.UnBind() // set the texture wrapping/filtering options (applies to current bound texture obj) // TODO-cs gl.TexParameteri(texture.target, gl.TEXTURE_WRAP_R, wrapR) gl.TexParameteri(texture.target, gl.TEXTURE_WRAP_S, wrapS) gl.TexParameteri(texture.target, gl.TEXTURE_MIN_FILTER, gl.LINEAR) // minification filter gl.TexParameteri(texture.target, gl.TEXTURE_MAG_FILTER, gl.LINEAR) // magnification filter gl.TexImage2D(target, 0, internalFmt, width, height, 0, format, pixType, dataPtr) gl.GenerateMipmap(texture.handle) return &texture, nil }
func NewTexture(assetName string) (uint32, error) { data, err := Asset(assetName) if err != nil { return 0, err } img, _, err := image.Decode(bytes.NewReader(data)) if err != nil { return 0, err } rgba := image.NewRGBA(img.Bounds()) if rgba.Stride != rgba.Rect.Size().X*4 { return 0, fmt.Errorf("unsupported stride") } draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src) var texture uint32 gl.GenTextures(1, &texture) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, 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.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) 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 }
func (glRenderer *OpenglRenderer) loadCubeMap(right, left, top, bottom, back, front image.Image, textureUnit uint32, lod bool) uint32 { var texId uint32 gl.GenTextures(1, &texId) gl.ActiveTexture(textureUnit) gl.BindTexture(gl.TEXTURE_CUBE_MAP, texId) for i := 0; i < 6; i++ { img := right var texIndex uint32 = gl.TEXTURE_CUBE_MAP_POSITIVE_X switch i { case 1: img = left texIndex = gl.TEXTURE_CUBE_MAP_NEGATIVE_X case 2: img = top texIndex = gl.TEXTURE_CUBE_MAP_NEGATIVE_Y case 3: img = bottom texIndex = gl.TEXTURE_CUBE_MAP_POSITIVE_Y case 4: img = back texIndex = gl.TEXTURE_CUBE_MAP_NEGATIVE_Z case 5: img = front texIndex = gl.TEXTURE_CUBE_MAP_POSITIVE_Z } img = imaging.FlipV(img) rgba := image.NewRGBA(img.Bounds()) if rgba.Stride != rgba.Rect.Size().X*4 { log.Fatal("unsupported stride") } draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src) gl.TexImage2D( texIndex, 0, gl.RGBA, int32(rgba.Rect.Size().X), int32(rgba.Rect.Size().Y), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba.Pix), ) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE) if lod { gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.GenerateMipmap(gl.TEXTURE_CUBE_MAP) } else { gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR) } } return texId }
func NewTexture(file string, linear bool) (err error, texture *Texture, img image.Image) { var imgFile *os.File if imgFile, err = os.Open(file); err != nil { return err, nil, img } defer imgFile.Close() if img, _, err = image.Decode(imgFile); err != nil { return err, nil, img } var rgba *image.RGBA rgba = image.NewRGBA(img.Bounds()) if rgba.Stride != rgba.Rect.Size().X*4 { return fmt.Errorf("unsupported stride"), nil, img } draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src) var t uint32 gl.GenTextures(1, &t) texture = &Texture{t, rgba.Rect.Size()} texture.BindTexture(0) if linear { gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) } else { gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) } 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) 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 nil, texture, img }