func NewSpriteDrawer(window *glfw.Window, layers int) *SpriteDrawer { s := new(SpriteDrawer) vao := gl.GenVertexArray() vao.Bind() s.Camera = vec2.Identity s.Program = CreateProgram("shaders/2d.vert", "shaders/2d.geom", "shaders/texture.frag") s.Use() s.camera_uniform = s.GetUniformLocation("camera") s.Texture = gl.GenTexture() s.Texture.Bind(gl.TEXTURE_2D_ARRAY) gl.TexImage3D(gl.TEXTURE_2D_ARRAY, 0, gl.RGBA, 2048, 2048, layers, 0, gl.RGBA, gl.UNSIGNED_BYTE, nil) gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.LINEAR) s.Window = window w, h := window.GetSize() s.OnScreenResize(w, h) s.Window.SetSizeCallback(func(window *glfw.Window, w, h int) { s.OnScreenResize(w, h) }) return s }
func NewFrameBuffer(width, height int) (this *FrameBuffer) { this = &FrameBuffer{gl.GenFramebuffer(), gl.GenTexture(), gl.GenTexture()} this.Resize(width, height) var outer gl.Framebuffer { params := []int32{0} gl.GetIntegerv(gl.FRAMEBUFFER_BINDING, params) outer = gl.Framebuffer(params[0]) } this.Framebuffer.Bind() gl.FramebufferTexture2D(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_RECTANGLE, this.RenderTexture, 0) gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.TEXTURE_RECTANGLE, this.DepthTexture, 0) outer.Bind() if gl.CheckFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE { this.Delete() panic("framebuffer incomplete") } return }
func NewTextureEmpty(width int, height int, model color.Model) *Texture { internalFormat, typ, format, target, e := ColorModelToGLTypes(model) if e != nil { return nil } a := gl.GenTexture() a.Bind(target) gl.TexImage2D(target, 0, internalFormat, width, height, 0, typ, format, nil) t := &Texture{a, false, nil, format, typ, internalFormat, target, width, height} t.SetWraping(WrapS, ClampToEdge) t.SetWraping(WrapT, ClampToEdge) t.SetFiltering(Nearest, Nearest) ResourceManager.Add(t) return t }
func (v *Video) initGL() { if gl.Init() != 0 { panic(sdl.GetError()) } gl.ClearColor(0.0, 0.0, 0.0, 1.0) gl.Enable(gl.CULL_FACE) gl.Enable(gl.DEPTH_TEST) v.prog = createProgram(vertShaderSrcDef, fragShaderSrcDef) posAttrib := v.prog.GetAttribLocation("vPosition") texCoordAttr := v.prog.GetAttribLocation("vTexCoord") v.textureUni = v.prog.GetAttribLocation("texture") v.texture = gl.GenTexture() gl.ActiveTexture(gl.TEXTURE0) v.texture.Bind(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) v.prog.Use() posAttrib.EnableArray() texCoordAttr.EnableArray() vertVBO := gl.GenBuffer() vertVBO.Bind(gl.ARRAY_BUFFER) verts := []float32{-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0} gl.BufferData(gl.ARRAY_BUFFER, len(verts)*int(unsafe.Sizeof(verts[0])), &verts[0], gl.STATIC_DRAW) textCoorBuf := gl.GenBuffer() textCoorBuf.Bind(gl.ARRAY_BUFFER) texVerts := []float32{0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0} gl.BufferData(gl.ARRAY_BUFFER, len(texVerts)*int(unsafe.Sizeof(texVerts[0])), &texVerts[0], gl.STATIC_DRAW) posAttrib.AttribPointer(2, gl.FLOAT, false, 0, uintptr(0)) texCoordAttr.AttribPointer(2, gl.FLOAT, false, 0, uintptr(0)) }
func NewTexture2(data interface{}, width int, height int, target gl.GLenum, internalFormat int, typ gl.GLenum, format gl.GLenum) *Texture { a := gl.GenTexture() a.Bind(target) gl.TexImage2D(target, 0, internalFormat, width, height, 0, typ, format, data) t := &Texture{a, false, data, format, typ, internalFormat, target, width, height} t.SetWraping(WrapS, ClampToEdge) t.SetWraping(WrapT, ClampToEdge) t.SetFiltering(Nearest, Nearest) //ansi := []float32{0} //gl.GetFloatv(gl.MAX_TEXTURE_MAX_ANISOTROPY_EXT, ansi) //gl.TexParameterf(target, gl.TEXTURE_MAX_ANISOTROPY_EXT, ansi[0]) t.PreloadRender() //Forcing texture to go to VRAM and prevent shuttering t.data = nil data = nil ResourceManager.Add(t) return t }