func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } gl.Init() gl.GetError() // Ignore error glfw.SetWindowTitle("Tutorial 01") glfw.Enable(glfw.StickyKeys) gl.ClearColor(0., 0., 0.4, 0.) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE) { glfw.SwapBuffers() } }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked gl.GetError() // Ignore error glfw.SetWindowTitle("Tutorial 02") glfw.Enable(glfw.StickyKeys) gl.ClearColor(0., 0., 0.4, 0.) prog := helper.MakeProgram("SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader") vBufferData := [...]float32{ -1., -1., 0., 1., -1., 0., 0., 1., 0.} vertexArray := gl.GenVertexArray() vertexArray.Bind() buffer := gl.GenBuffer() buffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE) { gl.Clear(gl.COLOR_BUFFER_BIT) prog.Use() attribLoc := gl.AttribLocation(0) attribLoc.EnableArray() buffer.Bind(gl.ARRAY_BUFFER) attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 3) attribLoc.DisableArray() glfw.SwapBuffers() } }
func (v *Video) Init(w int, h int) { var err error if err = glfw.Init(); err != nil { log.Fatal(err) } glfw.OpenWindowHint(glfw.WindowNoResize, gl.TRUE) if err = glfw.OpenWindow(w, h, 8, 8, 8, 0, 24, 0, glfw.Windowed); err != nil { log.Fatal(err) } if gl.Init() != 0 { log.Fatal("ummm... hmmm") } glfw.SetWindowSizeCallback(resize) gl.Enable(gl.TEXTURE_2D) resize(w, h) v.Texture = gl.GenTexture() }
func RunGame(title string, width, height int, init, draw func()) { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "glfw: %s\n", err) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.WindowNoResize, 1) if err := glfw.OpenWindow(width, height, 0, 0, 0, 0, 16, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "glfw: %s\n", err) return } defer glfw.CloseWindow() glfw.SetSwapInterval(1) glfw.SetWindowTitle(title) if err := gl.Init(); err != nil { fmt.Fprintf(os.Stderr, "gl: %s\n", err) } if err := initScene(width, height, init); err != nil { fmt.Fprintf(os.Stderr, "init: %s\n", err) return } // defer destroyScene() for glfw.WindowParam(glfw.Opened) == 1 { drawScene(draw) glfw.SwapBuffers() } }
// initGL initializes GLFW and OpenGL. func initGL() error { err := glfw.Init() if err != nil { return err } glfw.OpenWindowHint(glfw.FsaaSamples, 4) err = glfw.OpenWindow(512, 512, 8, 8, 8, 8, 0, 0, glfw.Windowed) if err != nil { glfw.Terminate() return err } glfw.SetWindowTitle("Meshbuffer 2D example") glfw.SetSwapInterval(1) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(onKey) gl.Init() if err = glh.CheckGLError(); err != nil { return err } gl.Disable(gl.DEPTH_TEST) gl.Enable(gl.MULTISAMPLE) gl.Disable(gl.LIGHTING) gl.Enable(gl.COLOR_MATERIAL) gl.ClearColor(0.2, 0.2, 0.23, 1.0) return nil }
// Opens a new window. func (c *Controller) Open(win *Window) (err error) { c.Win = win mode := glfw.Windowed if win.Fullscreen { mode = glfw.Fullscreen } if win.Resize == false { glfw.OpenWindowHint(glfw.WindowNoResize, 1) } if err = glfw.OpenWindow(win.Width, win.Height, 0, 0, 0, 0, 0, 0, mode); err != nil { return } gl.Init() gl.Enable(gl.TEXTURE_2D) gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) v1, v2, v3 := glfw.GLVersion() log.Printf("OpenGL version: %v %v %v\n", v1, v2, v3) fb_supported := glfw.ExtensionSupported("GL_EXT_framebuffer_object") log.Printf("Framebuffer supported: %v\n", fb_supported) c.SetClearColor(0, 0, 0, 0) if win.VSync == true { glfw.SetSwapInterval(1) // Limit to refresh } glfw.SetWindowTitle(win.Title) glfw.SetWindowSizeCallback(func(w, h int) { log.Printf("Resizing window to %v, %v\n", w, h) c.resize() }) err = c.resize() return }
// initGL initializes GLFW and OpenGL. func initGL(c *cpu.CPU, width, height int) error { err := glfw.Init() if err != nil { return err } glfw.OpenWindowHint(glfw.WindowNoResize, 1) err = glfw.OpenWindow(width, height, 8, 8, 8, 8, 8, 0, glfw.Windowed) if err != nil { glfw.Terminate() return err } glfw.SetWindowTitle("DCPU") glfw.SetSwapInterval(1) glfw.SetWindowSizeCallback(onResize) gl.Init() err = glh.CheckGLError() if err != nil { return err } gl.Disable(gl.LIGHTING) gl.Disable(gl.DEPTH_TEST) gl.Enable(gl.TEXTURE_2D) gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.ClearColor(0, 0, 0, 1) return err }
func StartEngine() { runtime.GOMAXPROCS(runtime.NumCPU()) runtime.LockOSThread() fmt.Println("Enginge started!") var err error if err = glfw.Init(); err != nil { panic(err) } fmt.Println("GLFW Initialized!") glfw.OpenWindowHint(glfw.Accelerated, 1) if err = glfw.OpenWindow(Width, Height, 8, 8, 8, 8, 8, 8, glfw.Windowed); err != nil { panic(err) } glfw.SetSwapInterval(1) //0 to disable vsync, 1 to enable it glfw.SetWindowTitle(windowTitle) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(input.OnKey) glfw.SetCharCallback(input.OnChar) glfw.SetMouseButtonCallback(input.ButtonPress) glfw.SetMouseWheel(0) glfw.SetMouseWheelCallback(input.MouseWheelCallback) input.MouseWheelPosition = glfw.MouseWheel input.MousePosition = glfw.MousePos if err = initGL(); err != nil { panic(err) } fmt.Println("Opengl Initialized!") TextureMaterial = NewBasicMaterial(spriteVertexShader, spriteFragmentShader) err = TextureMaterial.Load() if err != nil { fmt.Println(err) } SDFMaterial = NewBasicMaterial(sdfVertexShader, sdfFragmentShader) err = SDFMaterial.Load() if err != nil { fmt.Println(err) } internalMaterial = NewBasicMaterial(spriteVertexShader, spriteFragmentShader) err = internalMaterial.Load() if err != nil { fmt.Println(err) } initDefaultPlane() glfw.SwapBuffers() gameTime = time.Time{} lastTime = time.Now() dl = glfw.Time() }
func main() { var err error if err = glfw.Init(); err != nil { log.Fatalf("%v\n", err) return } defer glfw.Terminate() // Open window with FSAA samples (if possible). glfw.OpenWindowHint(glfw.FsaaSamples, 4) if err = glfw.OpenWindow(400, 400, 0, 0, 0, 0, 0, 0, glfw.Windowed); err != nil { log.Fatalf("%v\n", err) return } defer glfw.CloseWindow() glfw.SetWindowTitle("Aliasing Detector") glfw.SetSwapInterval(1) if samples := glfw.WindowParam(glfw.FsaaSamples); samples != 0 { fmt.Printf("Context reports FSAA is supported with %d samples\n", samples) } else { fmt.Printf("Context reports FSAA is unsupported\n") } gl.MatrixMode(gl.PROJECTION) glu.Perspective(0, 1, 0, 1) for glfw.WindowParam(glfw.Opened) == 1 { time := float32(glfw.Time()) gl.Clear(gl.COLOR_BUFFER_BIT) gl.LoadIdentity() gl.Translatef(0.5, 0, 0) gl.Rotatef(time, 0, 0, 1) gl.Enable(GL_MULTISAMPLE_ARB) gl.Color3f(1, 1, 1) gl.Rectf(-0.25, -0.25, 0.25, 0.25) gl.LoadIdentity() gl.Translatef(-0.5, 0, 0) gl.Rotatef(time, 0, 0, 1) gl.Disable(GL_MULTISAMPLE_ARB) gl.Color3f(1, 1, 1) gl.Rectf(-0.25, -0.25, 0.25, 0.25) glfw.SwapBuffers() } }
func (me *context) Window(winf *ngctx.WinProfile, bufSize *ngctx.BufferBits, ctxProf *ngctx.CtxProfile) (win ngctx.Window, err error) { glfw.OpenWindowHint(glfw.FsaaSamples, 0) // AA will be a pluggable post-processing shader glfw.OpenWindowHint(glfw.OpenGLVersionMajor, ctxProf.Version.Major) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, ctxProf.Version.Minor) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if ctxProf.ForwardCompat { glfw.OpenWindowHint(glfw.OpenGLForwardCompat, 1) } winMode := glfw.Windowed if winf.FullScreen { winMode = glfw.Fullscreen } if err = glfw.OpenWindow(winf.Width, winf.Height, bufSize.Color.R, bufSize.Color.G, bufSize.Color.B, bufSize.Color.A, bufSize.Depth, bufSize.Stencil, winMode); err == nil { win = newWindow() win.SetTitle(winf.Title) if winMode == glfw.Fullscreen { glfw.Disable(glfw.MouseCursor) } } return }
func main() { fmt.Print("GLFW Init Start.") glfw.Init() fmt.Println(" GLFW Init Done.") defer glfw.Terminate() defer fmt.Println("example Terminating.") fmt.Println("GLFW Set Hints.") glfw.OpenWindowHint(glfw.WindowNoResize, 1) fmt.Print("GLFW Open Window Start.") glfw.OpenWindow(640, 480, 8, 8, 8, 0, 0, 0, glfw.Windowed) glfw.SetWindowTitle("example") fmt.Println(" GLFW Open Window Done.") v1, v2, v3 := glfw.GLVersion() fmt.Printf("OpenGL version: %d.%d.%d\n", v1, v2, v3) fmt.Printf("GLFW version: %d.%d.%d\n", glfw.VersionMajor, glfw.VersionMinor, glfw.VersionRevision) glfw.SetSwapInterval(1) fps := time.Duration(30) fmt.Printf("Creating %d Hz Ticker.", fps) ticker := time.NewTicker(time.Second / fps) fmt.Printf(" %d Hz Ticker Created\n", fps) closedWindow := glfwHelper.WindowCloseChan() mouseButtons := glfwHelper.MouseButtonChan() mousePos := glfwHelper.MousePosChan() mouseWheel := glfwHelper.MouseWheelChan() keyButtons := glfwHelper.KeyChan() charButtons := glfwHelper.CharChan() for { select { case <-ticker.C: glfw.SwapBuffers() case <-closedWindow: return case input := <-mouseButtons: fmt.Println(input) case input := <-mousePos: fmt.Println(input) case input := <-mouseWheel: fmt.Println(input) case input := <-keyButtons: fmt.Println(input) case input := <-charButtons: fmt.Println(string(input)) } } }
func (s *System) Startup() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } glfw.OpenWindowHint(glfw.FsaaSamples, 4) // glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) // glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 2) // glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) InitQueue() }
func (_ *NgUserIO) init(forceContextVersion float64) (err error) { UserIO.KeyToggleMinDelay, UserIO.lastToggles = 0.15, make(map[int]float64, 80) if !UserIO.isGlfwInit { if err = glfw.Init(); err == nil { UserIO.isGlfwInit = true } } if UserIO.isGlfwInit && !UserIO.Window.isCreated { glfw.OpenWindowHint(glfw.FsaaSamples, 0) // AA will be a pluggable post-processing shader if forceContextVersion > 0 { major, minor := ugl.VersionMajorMinor(forceContextVersion) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, major) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, minor) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if Options.Initialization.GlContext.CoreProfile.ForwardCompat { glfw.OpenWindowHint(glfw.OpenGLForwardCompat, 1) } } err = UserIO.recreateWin() } return }
// initGL initializes GLFW and OpenGL. func initGL() error { err := glfw.Init() if err != nil { return err } glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.WindowNoResize, gl.TRUE) err = glfw.OpenWindow(512, 512, 8, 8, 8, 8, 32, 0, glfw.Windowed) if err != nil { glfw.Terminate() return err } glfw.SetWindowTitle("Meshbuffer 3D example") glfw.SetSwapInterval(1) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(onKey) gl.Init() if err = glh.CheckGLError(); err != nil { return err } gl.Enable(gl.DEPTH_TEST) gl.Enable(gl.MULTISAMPLE) gl.Disable(gl.LIGHTING) //gl.ClearColor(0.2, 0.2, 0.23, 1.0) gl.ClearColor(0, 0, 0, 1.0) gl.ShadeModel(gl.SMOOTH) gl.LineWidth(2) gl.ClearDepth(1) gl.DepthFunc(gl.LEQUAL) gl.Hint(gl.PERSPECTIVE_CORRECTION_HINT, gl.NICEST) gl.ColorMaterial(gl.FRONT_AND_BACK, gl.AMBIENT_AND_DIFFUSE) return nil }
func (s *Display) init(title string, screenSizeMultiplier int) error { s.Name = PREFIX + "-SCREEN" log.Printf("%s: Initialising display", s.Name) var err error s.ScreenSizeMultiplier = screenSizeMultiplier log.Printf("%s: Set screen size multiplier to %dx", s.Name, s.ScreenSizeMultiplier) glfw.OpenWindowHint(glfw.WindowNoResize, 1) err = glfw.OpenWindow(SCREEN_WIDTH*s.ScreenSizeMultiplier, SCREEN_HEIGHT*s.ScreenSizeMultiplier, 0, 0, 0, 0, 0, 0, glfw.Windowed) if err != nil { return err } glfw.SetWindowTitle(title) //resize function onResize := func(w, h int) { gl.Viewport(0, 0, w, h) gl.MatrixMode(gl.PROJECTION) gl.LoadIdentity() gl.Ortho(0, float64(w), float64(h), 0, -1, 1) gl.ClearColor(0.255, 0.255, 0.255, 0) gl.Clear(gl.COLOR_BUFFER_BIT) gl.MatrixMode(gl.MODELVIEW) gl.LoadIdentity() } glfw.SetWindowSizeCallback(onResize) desktopMode := glfw.DesktopMode() glfw.SetWindowPos((desktopMode.W-SCREEN_WIDTH*s.ScreenSizeMultiplier)/2, (desktopMode.H-SCREEN_HEIGHT*s.ScreenSizeMultiplier)/2) gl.ClearColor(0.255, 0.255, 0.255, 0) return nil }
func (me *context) Hint(flag, value int) { glfw.OpenWindowHint(flag, value) }
func main() { var err error var looping = true defer fmt.Println("EXIT") if err = glfw.Init(); err != nil { panic(err) } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 0) if useStrictCoreProfile { glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 2) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) } if err = glfw.OpenWindow(1280, 720, 8, 8, 8, 0, 24, 8, glfw.Windowed); err != nil { panic(err) } defer glfw.CloseWindow() glfw.Enable(glfw.StickyKeys) if !gl.Util.Init() { panic("Failed to initialize at least OpenGL 3.2 or higher.") } defer logLastGlError("(post loop)") gl.ClearColor(0.3, 0.1, 0.0, 1.0) gl.Enable(gl.DEPTH_TEST) gl.FrontFace(gl.CCW) gl.CullFace(gl.BACK) gl.Disable(gl.CULL_FACE) if err = compileShaders(); err != nil { panic(err) } setupGeometry() defer deleteGeometry() logLastGlError("(pre loop)") for looping { gl.UseProgram(shaderProg) if isFirstLoop { logLastGlError("gl.UseProgram") } gl.Viewport(0, 0, 1280, 720) if isFirstLoop { logLastGlError("gl.ViewPort") } gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) if isFirstLoop { logLastGlError("gl.Clear") } renderGeometry(faceTri) if isFirstLoop { logLastGlError("renderGeometry(faceTri)") } renderGeometry(faceQuad) if isFirstLoop { logLastGlError("renderGeometry(faceQuad)") } if (glfw.WindowParam(glfw.Opened) != 1) || (glfw.Key(glfw.KeyEsc) == glfw.KeyPress) { looping = false } else { glfw.SwapBuffers() } isFirstLoop = false } logLastGlError("post-loop") }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } glfw.SetSwapInterval(0) //gl.GlewExperimental(true) gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked gl.GetError() // ignore error, since we're telling it to use CoreProfile above, we get "invalid enumerant" (GLError 1280) which freaks the OpenGLSentinel out glfw.SetWindowTitle("Tutorial 07") glfw.Enable(glfw.StickyKeys) glfw.Disable(glfw.MouseCursor) // Not in the original tutorial, but IMO it SHOULD be there glfw.SetMousePos(1024.0/2.0, 768.0/2.0) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.Enable(gl.CULL_FACE) camera := input.NewCamera() vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") texture := helper.MakeTextureFromTGA("uvmap.tga") // Had to convert to tga, go-gl is missing the texture method for DDS right now defer texture.Delete() texSampler := prog.GetUniformLocation("myTextureSampler") meshObj := objloader.LoadObject("cube.obj") vertices, uvs := meshObj.Vertices, meshObj.UVs vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*3*4, vertices, gl.STATIC_DRAW) uvBuffer := gl.GenBuffer() defer uvBuffer.Delete() uvBuffer.Bind(gl.ARRAY_BUFFER) // UV doesn't seem to care gl.BufferData(gl.ARRAY_BUFFER, len(uvs)*2*4, uvs, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE && glfw.Key('Q') != glfw.KeyPress) { func() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() defer gl.ProgramUnuse() view, proj := camera.ComputeViewPerspective() model := mathgl.Ident4f() MVP := proj.Mul4(view).Mul4(model) matrixID.UniformMatrix4fv(false, MVP) gl.ActiveTexture(gl.TEXTURE0) texture.Bind(gl.TEXTURE_2D) defer texture.Unbind(gl.TEXTURE_2D) texSampler.Uniform1i(0) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() defer vertexAttrib.DisableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) defer vertexBuffer.Unbind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) uvAttrib := gl.AttribLocation(1) uvAttrib.EnableArray() defer uvAttrib.DisableArray() uvBuffer.Bind(gl.ARRAY_BUFFER) defer uvBuffer.Unbind(gl.ARRAY_BUFFER) uvAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, len(vertices)) glfw.SwapBuffers() }() // Defers unbinds and disables to here, end of the loop } }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } glfw.SetSwapInterval(0) //gl.GlewExperimental(true) gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked gl.GetError() // ignore error, since we're telling it to use CoreProfile above, we get "invalid enumerant" (GLError 1280) which freaks the OpenGLSentinel out glfw.SetWindowTitle("Tutorial 09") glfw.Enable(glfw.StickyKeys) glfw.Disable(glfw.MouseCursor) // Not in the original tutorial, but IMO it SHOULD be there glfw.SetMousePos(1024.0/2.0, 768.0/2.0) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.Enable(gl.CULL_FACE) camera := input.NewCamera() vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("StandardShading.vertexshader", "StandardShading.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") viewMatrixID := prog.GetUniformLocation("V") modelMatrixID := prog.GetUniformLocation("M") texture := helper.MakeTextureFromTGA("uvmap.tga") // Had to convert to tga, go-gl is missing the texture method for DDS right now defer texture.Delete() texSampler := prog.GetUniformLocation("myTextureSampler") meshObj := objloader.LoadObject("suzanne.obj") indices, indexedVertices, indexedUVs, indexedNormals := indexer.IndexVBO(meshObj.Vertices, meshObj.UVs, meshObj.Normals) vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(indexedVertices)*3*4, indexedVertices, gl.STATIC_DRAW) uvBuffer := gl.GenBuffer() defer uvBuffer.Delete() uvBuffer.Bind(gl.ARRAY_BUFFER) // And yet, the weird length stuff doesn't seem to matter for UV or normal gl.BufferData(gl.ARRAY_BUFFER, len(indexedUVs)*2*4, indexedUVs, gl.STATIC_DRAW) normBuffer := gl.GenBuffer() defer normBuffer.Delete() normBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(indexedNormals)*3*4, indexedNormals, gl.STATIC_DRAW) elementBuffer := gl.GenBuffer() defer elementBuffer.Delete() elementBuffer.Bind(gl.ELEMENT_ARRAY_BUFFER) gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(indices)*2, indices, gl.STATIC_DRAW) // NOTE: a GL_UNSIGNED_SHORT is 16-bits lightID := prog.GetUniformLocation("LightPosition_worldspace") lastTime := glfw.Time() nbFrames := 0 // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE && glfw.Key('Q') != glfw.KeyPress) { currTime := glfw.Time() nbFrames++ if currTime-lastTime >= 1.0 { fmt.Printf("%f ms/frame\n", 1000.0/float64(nbFrames)) nbFrames = 0 lastTime += 1.0 } func() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() defer gl.ProgramUnuse() view, proj := camera.ComputeViewPerspective() model := mathgl.Ident4f() MVP := proj.Mul4(view).Mul4(model) //mvpArray := mvp.AsCMOArray(mathgl.FLOAT32).([16]float32) //vArray := view.AsCMOArray(mathgl.FLOAT32).([16]float32) //mArray := model.AsCMOArray(mathgl.FLOAT32).([16]float32) matrixID.UniformMatrix4fv(false, MVP) viewMatrixID.UniformMatrix4fv(false, view) modelMatrixID.UniformMatrix4fv(false, model) lightID.Uniform3f(4., 4., 4.) gl.ActiveTexture(gl.TEXTURE0) texture.Bind(gl.TEXTURE_2D) defer texture.Unbind(gl.TEXTURE_2D) texSampler.Uniform1i(0) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() defer vertexAttrib.DisableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) defer vertexBuffer.Unbind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) uvAttrib := gl.AttribLocation(1) uvAttrib.EnableArray() defer uvAttrib.DisableArray() uvBuffer.Bind(gl.ARRAY_BUFFER) defer uvBuffer.Unbind(gl.ARRAY_BUFFER) uvAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil) normAttrib := gl.AttribLocation(2) normAttrib.EnableArray() defer normAttrib.DisableArray() normBuffer.Bind(gl.ARRAY_BUFFER) defer normBuffer.Unbind(gl.ARRAY_BUFFER) normAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) elementBuffer.Bind(gl.ELEMENT_ARRAY_BUFFER) defer elementBuffer.Unbind(gl.ELEMENT_ARRAY_BUFFER) gl.DrawElements(gl.TRIANGLES, len(indices), gl.UNSIGNED_SHORT, nil) glfw.SwapBuffers() }() // Defers unbinds and disables to here, end of the loop } }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked gl.GetError() // Ignore error glfw.SetWindowTitle("Tutorial 03") glfw.Enable(glfw.StickyKeys) gl.ClearColor(0., 0., 0.4, 0.) vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("SimpleTransform.vertexshader", "SingleColor.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") Projection := mathgl.Perspective(45.0, 4.0/3.0, 0.1, 100.0) //Projection := mathgl.Identity(4,mathgl.FLOAT64) //Projection := mathgl.Ortho2D(-5,5,-5,5) View := mathgl.LookAt(4.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) //View := mathgl.Identity(4,mathgl.FLOAT64) Model := mathgl.Ident4f() //Model := mathgl.Scale3D(2.,2.,2.).Mul(mathgl.HomogRotate3DX(25.0)).Mul(mathgl.Translate3D(.5,.2,-.7)) MVP := Projection.Mul4(View).Mul4(Model) // Remember, transform multiplication order is "backwards" vBufferData := [...]float32{ -1., -1., 0., 1., -1., 0., 0., 1., 0.} //elBufferData := [...]uint8{0, 1, 2} // Not sure why this is here buffer := gl.GenBuffer() defer buffer.Delete() buffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE) { gl.Clear(gl.COLOR_BUFFER_BIT) prog.Use() matrixID.UniformMatrix4fv(false, MVP) attribLoc := gl.AttribLocation(0) attribLoc.EnableArray() buffer.Bind(gl.ARRAY_BUFFER) attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 3) attribLoc.DisableArray() glfw.SwapBuffers() } }
func (w *glfwBackend) Open(width, height, zoom int, fs bool, font *FontData) { if err := glfw.Init(); err != nil { panic(err) } w.font = font w.zoom = zoom w.width = width w.height = height var fwidth = width * font.CellWidth * zoom var fheight = height * font.CellHeight * zoom var twidth = fwidth var theight = fheight flag := glfw.Windowed if fs { flag = glfw.Fullscreen dm := glfw.DesktopMode() twidth = dm.W theight = dm.H } glfw.OpenWindowHint(glfw.WindowNoResize, gl.TRUE) err := glfw.OpenWindow(twidth, theight, 8, 8, 8, 8, 0, 0, flag) if err != nil { panic(err) } w.key = NOKEY glfw.SetWindowCloseCallback(func() int { w.Close(); return 0 }) glfw.SetKeyCallback(func(key, state int) { w.setKey(key, state) }) glfw.SetCharCallback(func(key, state int) { w.setKey(key, state) }) glfw.Enable(glfw.KeyRepeat) w.mouse = new(MouseData) glfw.Enable(glfw.MouseCursor) glfw.SetMousePosCallback(func(x, y int) { w.mouseMove(x, y) }) glfw.SetMouseButtonCallback(func(but, state int) { w.mousePress(but, state) }) glfw.Enable(glfw.MouseCursor) xoff := float32(twidth-fwidth) / 2.0 yoff := float32(theight-fheight) / 2.0 fc := float32(font.CellWidth * zoom) fch := float32(font.CellHeight * zoom) for y := 0; y < height; y++ { for x := 0; x < width; x++ { cx := xoff + float32(x)*fc cy := yoff + float32(y)*fch w.verts = append(w.verts, cx, cy, cx, cy+fch, cx+fc, cy+fch, cx+fc, cy) } } runtime.LockOSThread() glInit(twidth, theight) m := font.Image.(*image.RGBA) w.s = float32(font.CellWidth) / float32(m.Bounds().Max.X) w.t = float32(font.CellHeight) / float32(m.Bounds().Max.Y) textures = make([]gl.Uint, 2) gl.GenTextures(2, &textures[0]) gl.BindTexture(gl.TEXTURE_2D, textures[0]) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.Sizei(m.Bounds().Max.X), gl.Sizei(m.Bounds().Max.Y), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Pointer(&m.Pix[0])) m = image.NewRGBA(image.Rect(0, 0, font.CellWidth, font.CellHeight)) draw.Draw(m, m.Bounds(), &image.Uniform{White}, image.ZP, draw.Src) gl.BindTexture(gl.TEXTURE_2D, textures[1]) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.Sizei(m.Bounds().Max.X), gl.Sizei(m.Bounds().Max.Y), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Pointer(&m.Pix[0])) w.open = true }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } gl.Init() gl.GetError() // Ignore error glfw.SetWindowTitle("Tutorial 04") glfw.Enable(glfw.StickyKeys) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("TransformVertexShader.vertexshader", "ColorFragmentShader.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") Projection := mathgl.Perspective(45.0, 4.0/3.0, 0.1, 100.0) View := mathgl.LookAt(4.0, 3.0, -3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) Model := mathgl.Ident4f() MVP := Projection.Mul4(View).Mul4(Model) // Remember, transform multiplication order is "backwards" vBufferData := [...]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, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0} colorBufferData := [...]float32{ 0.583, 0.771, 0.014, 0.609, 0.115, 0.436, 0.327, 0.483, 0.844, 0.822, 0.569, 0.201, 0.435, 0.602, 0.223, 0.310, 0.747, 0.185, 0.597, 0.770, 0.761, 0.559, 0.436, 0.730, 0.359, 0.583, 0.152, 0.483, 0.596, 0.789, 0.559, 0.861, 0.639, 0.195, 0.548, 0.859, 0.014, 0.184, 0.576, 0.771, 0.328, 0.970, 0.406, 0.615, 0.116, 0.676, 0.977, 0.133, 0.971, 0.572, 0.833, 0.140, 0.616, 0.489, 0.997, 0.513, 0.064, 0.945, 0.719, 0.592, 0.543, 0.021, 0.978, 0.279, 0.317, 0.505, 0.167, 0.620, 0.077, 0.347, 0.857, 0.137, 0.055, 0.953, 0.042, 0.714, 0.505, 0.345, 0.783, 0.290, 0.734, 0.722, 0.645, 0.174, 0.302, 0.455, 0.848, 0.225, 0.587, 0.040, 0.517, 0.713, 0.338, 0.053, 0.959, 0.120, 0.393, 0.621, 0.362, 0.673, 0.211, 0.457, 0.820, 0.883, 0.371, 0.982, 0.099, 0.879} //elBufferData := [...]uint8{0, 1, 2} // Not sure why this is here vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) colorBuffer := gl.GenBuffer() defer colorBuffer.Delete() colorBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(colorBufferData)*4, &colorBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE) { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() matrixID.UniformMatrix4fv(false, MVP) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) colorAttrib := gl.AttribLocation(1) colorAttrib.EnableArray() colorBuffer.Bind(gl.ARRAY_BUFFER) colorAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 12*3) vertexAttrib.DisableArray() colorAttrib.DisableArray() glfw.SwapBuffers() } }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } //gl.GlewExperimental(true) gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked gl.GetError() // ignore error, since we're telling it to use CoreProfile above, we get "invalid enumerant" (GLError 1280) which freaks the OpenGLSentinel out // With go-gl we also apparently can't set glewExperimental glfw.SetWindowTitle("Tutorial 05") glfw.Enable(glfw.StickyKeys) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") Projection := mathgl.Perspective(45.0, 4.0/3.0, 0.1, 100.0) View := mathgl.LookAt(4.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) Model := mathgl.Ident4f() MVP := Projection.Mul4(View).Mul4(Model) // Remember, transform multiplication order is "backwards" texture := helper.MakeTextureFromTGA("uvtemplate.tga") defer texture.Delete() texSampler := prog.GetUniformLocation("myTextureSampler") vBufferData := [...]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, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0} uvBufferData := [...]float32{ 0.000059, 1.0 - 0.000004, 0.000103, 1.0 - 0.336048, 0.335973, 1.0 - 0.335903, 1.000023, 1.0 - 0.000013, 0.667979, 1.0 - 0.335851, 0.999958, 1.0 - 0.336064, 0.667979, 1.0 - 0.335851, 0.336024, 1.0 - 0.671877, 0.667969, 1.0 - 0.671889, 1.000023, 1.0 - 0.000013, 0.668104, 1.0 - 0.000013, 0.667979, 1.0 - 0.335851, 0.000059, 1.0 - 0.000004, 0.335973, 1.0 - 0.335903, 0.336098, 1.0 - 0.000071, 0.667979, 1.0 - 0.335851, 0.335973, 1.0 - 0.335903, 0.336024, 1.0 - 0.671877, 1.000004, 1.0 - 0.671847, 0.999958, 1.0 - 0.336064, 0.667979, 1.0 - 0.335851, 0.668104, 1.0 - 0.000013, 0.335973, 1.0 - 0.335903, 0.667979, 1.0 - 0.335851, 0.335973, 1.0 - 0.335903, 0.668104, 1.0 - 0.000013, 0.336098, 1.0 - 0.000071, 0.000103, 1.0 - 0.336048, 0.000004, 1.0 - 0.671870, 0.336024, 1.0 - 0.671877, 0.000103, 1.0 - 0.336048, 0.336024, 1.0 - 0.671877, 0.335973, 1.0 - 0.335903, 0.667969, 1.0 - 0.671889, 1.000004, 1.0 - 0.671847, 0.667979, 1.0 - 0.335851} vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) uvBuffer := gl.GenBuffer() defer uvBuffer.Delete() uvBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(uvBufferData)*4, &uvBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE) { func() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() defer gl.ProgramUnuse() matrixID.UniformMatrix4fv(false, MVP) gl.ActiveTexture(gl.TEXTURE0) texture.Bind(gl.TEXTURE_2D) defer texture.Unbind(gl.TEXTURE_2D) texSampler.Uniform1i(0) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() defer vertexAttrib.DisableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) defer vertexBuffer.Unbind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) uvAttrib := gl.AttribLocation(1) uvAttrib.EnableArray() defer uvAttrib.DisableArray() uvBuffer.Bind(gl.ARRAY_BUFFER) defer uvBuffer.Unbind(gl.ARRAY_BUFFER) uvAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 12*3) glfw.SwapBuffers() }() // Defers unbinds and disables to here, end of the loop } }