func MakeTextures(num gl.Sizei, glPtr []gl.Uint, dimensions uint8, texFormat gl.Enum, width, height, depth gl.Sizei) { var is3d, is2d = (dimensions == 3), (dimensions == 2) var texTarget gl.Enum = gltypes.Ife(is3d, gl.TEXTURE_3D, gltypes.Ife(is2d, gl.TEXTURE_2D, gl.TEXTURE_1D)) gl.GenTextures(num, &glPtr[0]) PanicIfErrors("MakeTextures.GenTextures(num=%v)", num) if width == 0 { panic("MakeTextures() needs at least width") } if height == 0 { height = width } if depth == 0 { depth = height } for i := 0; i < len(glPtr); i++ { gl.BindTexture(texTarget, glPtr[i]) gl.TexParameteri(texTarget, gl.TEXTURE_MAG_FILTER, TexFilter) gl.TexParameteri(texTarget, gl.TEXTURE_MIN_FILTER, TexFilter) gl.TexParameteri(texTarget, gl.TEXTURE_WRAP_R, TexWrap) gl.TexParameteri(texTarget, gl.TEXTURE_WRAP_S, TexWrap) gl.TexParameteri(texTarget, gl.TEXTURE_WRAP_T, TexWrap) if is3d { gl.TexStorage3D(texTarget, 1, texFormat, width, height, depth) } else if is2d { gl.TexStorage2D(texTarget, 1, texFormat, width, height) } else { gl.TexStorage1D(texTarget, 1, texFormat, width) } gl.BindTexture(texTarget, 0) PanicIfErrors("MakeTextures.Loop(i=%v dim=%v w=%v h=%v d=%v)", i, dimensions, width, height, depth) } }
func MakeTextureFromImageFile(filePath string) gl.Uint { var file, err = os.Open(filePath) var img image.Image var tex gl.Uint if err != nil { panic(err) } defer file.Close() img, _, err = image.Decode(file) if err != nil { panic(err) } w, h := img.Bounds().Dx(), img.Bounds().Dy() sw, sh := gl.Sizei(w), gl.Sizei(h) rgba := image.NewRGBA(image.Rect(0, 0, w, h)) for x := 0; x < w; x++ { for y := 0; y < h; y++ { rgba.Set(x, y, img.At(x, h-1-y)) } } gl.GenTextures(1, &tex) gl.BindTexture(gl.TEXTURE_2D, tex) 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.REPEAT) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) gl.TexStorage2D(gl.TEXTURE_2D, 1, gl.RGBA8, sw, sh) gl.TexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, sw, sh, gl.RGBA, gl.UNSIGNED_BYTE, gl.Pointer(&rgba.Pix[0])) gl.BindTexture(gl.TEXTURE_2D, 0) PanicIfErrors("MakeTextureFromImageFile(%v)", filePath) return tex }
func MakeRttFramebuffer(texFormat gl.Enum, width, height, mipLevels gl.Sizei, anisoFiltering gl.Int) (gl.Uint, gl.Uint) { var glPtrTex, glPtrFrameBuf gl.Uint var glMagFilter, glMinFilter gl.Int = gl.LINEAR, gl.LINEAR if anisoFiltering < 1 { glMagFilter, glMinFilter = gl.NEAREST, gl.NEAREST } if mipLevels > 1 { if anisoFiltering < 1 { glMinFilter = gl.NEAREST_MIPMAP_NEAREST } else { glMinFilter = gl.LINEAR_MIPMAP_LINEAR } } gl.GenTextures(1, &glPtrTex) gl.BindTexture(gl.TEXTURE_2D, glPtrTex) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, glMagFilter) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, glMinFilter) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_BORDER) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_BORDER) if anisoFiltering > 1 { gl.TexParameteri(gl.TEXTURE_2D, 0x84FE, anisoFiltering) } // max 16 gl.TexStorage2D(gl.TEXTURE_2D, mipLevels, texFormat, width, height) gl.GenFramebuffers(1, &glPtrFrameBuf) gl.BindFramebuffer(gl.FRAMEBUFFER, glPtrFrameBuf) gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, glPtrTex, 0) gl.BindFramebuffer(gl.FRAMEBUFFER, 0) gl.BindTexture(gl.TEXTURE_2D, 0) PanicIfErrors("MakeRttFramebuffer") return glPtrFrameBuf, glPtrTex }
func MakeTextureForTarget(glPtr *gl.Uint, dimensions uint8, width, height, depth gl.Sizei, texTarget gl.Enum, texFormat gl.Enum, panicIfErrors, reuseGlPtr bool) { var is3d, is2d = (dimensions == 3), (dimensions == 2) if texTarget == 0 { texTarget = gltypes.Ife(is3d, gl.TEXTURE_3D, gltypes.Ife(is2d, gl.TEXTURE_2D, gl.TEXTURE_1D)) } if texFormat == 0 { texFormat = gl.RGBA8 } if width == 0 { panic("MakeTextureForTarget() needs at least width") } if height == 0 { height = width } if depth == 0 { depth = height } if (!reuseGlPtr) || (*glPtr == 0) { gl.GenTextures(1, glPtr) } gl.BindTexture(texTarget, *glPtr) gl.TexParameteri(texTarget, gl.TEXTURE_MAG_FILTER, TexFilter) gl.TexParameteri(texTarget, gl.TEXTURE_MIN_FILTER, TexFilter) gl.TexParameteri(texTarget, gl.TEXTURE_WRAP_S, TexWrap) if is2d || is3d { gl.TexParameteri(texTarget, gl.TEXTURE_WRAP_T, TexWrap) } if is3d { gl.TexParameteri(texTarget, gl.TEXTURE_WRAP_R, TexWrap) } if is3d { gl.TexStorage3D(texTarget, 1, texFormat, width, height, depth) } else if is2d { gl.TexStorage2D(texTarget, 1, texFormat, width, height) } else { gl.TexStorage1D(texTarget, 1, texFormat, width) } gl.BindTexture(texTarget, 0) if panicIfErrors { PanicIfErrors("MakeTextureForTarget(dim=%v w=%v h=%v d=%v)", dimensions, width, height, depth) } }
func MakeTextureFromImageFloatsFile(filePath string, w, h int) gl.Uint { var file, err = os.Open(filePath) var tex gl.Uint var pix = make([]gl.Float, w*h*3) var fVal float32 var raw []uint8 var buf *bytes.Buffer var i int if err != nil { panic(err) } defer file.Close() raw, err = ioutil.ReadAll(file) if err != nil { panic(err) } buf = bytes.NewBuffer(raw) for i = 0; (err == nil) && (i < len(pix)); i++ { if err = binary.Read(buf, binary.LittleEndian, &fVal); err == io.EOF { err = nil break } else if err == nil { pix[i] = gl.Float(fVal) } } if err != nil { panic(err) } sw, sh := gl.Sizei(w), gl.Sizei(h) gl.GenTextures(1, &tex) gl.BindTexture(gl.TEXTURE_2D, tex) 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.REPEAT) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) gl.TexStorage2D(gl.TEXTURE_2D, 1, gl.RGB16F, sw, sh) gl.TexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, sw, sh, gl.RGB, gl.FLOAT, gl.Pointer(&pix[0])) gl.BindTexture(gl.TEXTURE_2D, 0) PanicIfErrors("MakeTextureFromImageFloatsFile(%v)", filePath) return tex }