好的,没问题,这就开始分享我最近折腾 `mgl` 的实践记录,大家伙儿权当看个乐呵,图一乐!
最近不是心血来潮嘛想搞点图形方面的东西玩玩,就盯上了这个 `mgl`。听说是个用 Go 语言写的 OpenGL 绑定库,想着 Go 也学了挺久了,OpenGL 也略懂一点,说不定能整出点啥花活儿。
一开始上手,那叫一个懵逼。这玩意儿文档是真的少,示例代码也是寥寥无几。不过咱是谁,迎难而上!先是把 `mgl32` 和 `mgl64` 这两个库给 `go get` 下来,想着都试试,看看哪个更顺手。结果发现,好像没啥区别,就是精度不一样。后来想想,反正我也不做啥高精度计算,就选了 `mgl32`,省点内存也
然后就开始啃示例代码。官方的示例都比较简单,就一个画三角形的。我照着敲了一遍,跑起来,还真画出来了!心里那个激动,感觉打开了新世界的大门。不过光画个三角形肯定不行,我要画点更复杂的!
琢磨着画个立方体。这就要用到矩阵变换了,把立方体的顶点数据搞出来,然后用 `*` 创建透视投影矩阵,用 `*` 创建观察矩阵,再用模型矩阵把立方体放到世界坐标系里。这些矩阵乘来乘去的,一开始给我绕的头都大了。还好大学学的线性代数还记得一点,慢慢推导,总算是搞明白了。
顶点数据、矩阵都有了,接下来就是写 Shader 了。OpenGL 的 Shader 语言(GLSL)我也就只会写最简单的顶点着色器和片元着色器。顶点着色器负责把顶点坐标变换到裁剪空间,片元着色器负责给每个像素上色。我写了个简单的 Shader,让立方体显示不同的颜色,看起来有点立体感。
把 Shader 编译绑定到 OpenGL 程序里,再把顶点数据传进去,矩阵也传进去,就可以开始渲染了。结果一跑起来,立方体是画出来了,但是颜色不对!仔细一看,原来是顶点数据的顺序搞错了。OpenGL 默认是逆时针绕序的,我之前搞成了顺时针。改过来,颜色总算是对了。
画是能画了,但是感觉还是太单调。就想着加点光照。OpenGL 的光照模型有好几种,我选了最简单的 Lambert 光照模型。这个模型只需要计算顶点法向量和光照方向的点积,就能得到光照强度。把光照强度乘以颜色,就是最终的颜色。我加了个简单的平行光,让立方体看起来更有层次感了。
- 加载模型:网上找了个免费的 OBJ 模型加载器,把模型数据读到程序里。
- 纹理贴图:找了张图片,用 OpenGL 加载为纹理,然后把纹理坐标传给 Shader,让模型显示纹理。
- 加入了简单的交互:用键盘控制视角旋转,鼠标控制缩放。
中间也踩了不少坑,比如:
- OpenGL 上下文创建失败:这个问题折腾了我好久,后来发现是 GLFW 初始化的时候没设置 OpenGL 版本。
- Shader 编译错误:GLSL 语法比较严格,稍微写错一点就编译不过
- 矩阵计算错误:矩阵乘法的顺序很重要,乘错了结果就完全不一样。
这回用 `mgl` 折腾 OpenGL 还是挺有意思的。虽然过程有点痛苦,但是看到自己画出来的东西,还是很有成就感的。也算是对 Go 语言和 OpenGL 的一次实践。以后有空再深入研究一下,看看能不能搞出更炫酷的效果。
这回就先分享到这里,下次有机会再和大家聊聊我其他的折腾经历。
还没有评论,来说两句吧...