这里开始是同时学习 OpenGL的知识和 Go-opengl的函数(大概)
画三角
-
这部分涉及大量 OpenGL知识
- 3-dim坐标形式给出三角形的三点坐标
- 坐标值为规格化的,即 [0, 1]
- OpenGL的坐标系是
-
- 取屏幕的中心点为原点
-
- 上y+,右x+ 的标准形式 (Direct3D是矩阵坐标形式)
-
- 右上↗点为 (1.0, 1.0),左下↙点 (-1.0, -1.0)
var triangle = []float32 {
0, 0.5, 0, // (x, y, z)
-0.5, -0.5, 0,
0.5, -0.5, 0,
}
生成一个“顶点数组对象”(VAO)
-
gen 是 generate
- VBO 顶点缓存对象,是一个 uint32的标号,
-
- GenBuffer 指定分配 buffer 的编号
-
- 与OpenGL绑定(并指定是VA的类型)
-
- 分配 buffer空间(float32 4个字节),静态绘制方式)
- VAO 顶点数组对象
-
- 同理申请生成并绑定、使能
-
- 与 vbo绑定,用于获取 vbo的顶点坐标数据
-
- 指定读取方式 / 参数指针
-
-
- 0 开头
-
-
-
- 3 维度xyz
-
-
-
- float 格式(float32 对应 gl中的内置float)
-
-
-
- 0 间隔(每两次读取跳过的数据)
-
-
-
- 其余默认 (nil对应高级玩法)
-
func genVao(points []float32) uint32 {
var vbo uint32
gl.GenBuffers(1, &vbo)
gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
gl.BufferData(
gl.ARRAY_BUFFER,
4*len(points),
gl.Ptr(points),
gl.STATIC_DRAW,
)
var vao uint32
gl.GenVertexArrays(1, &vao)
gl.BindVertexArray(vao)
gl.EnableVertexAttribArray(0)
gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
gl.VertexAttribPointer(0, 3, gl.FLOAT,
false, 0, nil)
return vao
}
main中添加 vao的变量
program := initOpenGL()
vao := genVao(triangle)
修改 draw函数签名 & 本体
- 这里的再次 bind只是让 gl上下文切换到该 vao上
- DrawArrays 经典的画三角函数
-
- 这里 vao已经“包装”好原始的点集坐标数据,数据对象是一个“点”
-
- 0为初始点索引,3(后面的计算式)是点的个数
- 其余不变
// main()
draw(window, program, vao)
func draw(window *glfw.Window, program uint32, vao uint32) {
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
gl.UseProgram(program)
// 新添加的两行
gl.BindVertexArray(vao)
gl.DrawArrays(gl.TRIANGLES, 0, int32(len(triangle) / 3))
glfw.PollEvents()
window.SwapBuffers()
}
在这里原教程 https://linux.cn/article-8933-1.html 说还要继续操作一波才能看到▲。不过至少在 OpenGL 4.1版本中,可以使用默认的着色器进行绘制了。
Go!
直接 go run main.go,上效果:
To be continued…