1. 初始化程序
首先添加引用的包,包括glfw和go-gl
import (
"runtime"
"github.com/go-gl/glfw/v3.2/glfw"
"github.com/go-gl/gl/v3.3-core/gl"
)
程序窗口的创建代码非常简单,需要注意的是runtime.LockOSThread调用是必须的,原因参考:LockOSThread
func main() {
runtime.LockOSThread()
window := initGlfw()
defer glfw.Terminate()
for !window.ShouldClose() {
glfw.PollEvents()
window.SwapBuffers()
}
}
2. glfw初始化
glfw初始化中设置窗口的特性(标题、大小等),同时设置OpenGL的版本等信息,并调用CreateWindow创建窗口
func initGlfw() *glfw.Window {
if err := glfw.Init(); err != nil {
panic(err)
}
glfw.WindowHint(glfw.ContextVersionMajor, 3)
glfw.WindowHint(glfw.ContextVersionMinor, 3)
glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
window, err := glfw.CreateWindow(width, height, "OpenGL", nil,nil)
if err != nil {
panic(err)
}
window.MakeContextCurrent()
return window
}
3. OpenGL初始化
在调用OpenGL函数之前,需要调用gl.Init初始化OpenGL
func initOpenGL() {
if err := gl.Init(); err != nil {
panic(err)
}
version := gl.GoStr(gl.GetString(gl.VERSION))
log.Println("OpenGL version", version)
}
//绘制函数
func draw() {
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
}
完整的代码
package main
import (
"log"
"runtime"
"github.com/go-gl/gl/v3.3-core/gl"
"github.com/go-gl/glfw/v3.2/glfw"
)
const (
width = 800
height = 600
)
func main() {
runtime.LockOSThread()
window := initGlfw()
defer glfw.Terminate()
initOpenGL()
for !window.ShouldClose() {
draw()
glfw.PollEvents()
window.SwapBuffers()
}
}
func initGlfw() *glfw.Window {
if err := glfw.Init(); err != nil {
panic(err)
}
glfw.WindowHint(glfw.ContextVersionMajor, 3)
glfw.WindowHint(glfw.ContextVersionMinor, 3)
glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
window, err := glfw.CreateWindow(width, height, "FirstWindow", nil, nil)
if err != nil {
panic(err)
}
window.MakeContextCurrent()
return window
}
func initOpenGL() {
if err := gl.Init(); err != nil {
panic(err)
}
version := gl.GoStr(gl.GetString(gl.VERSION))
log.Println("OpenGL version", version)
gl.ClearColor(0.2, 0.4, 0.6, 1.0)
}
func draw() {
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
}
参考资料: