mgl效果真的好不好?看看用过的人都是怎么评价!

天美租号

好的,没问题,这就开始分享我最近折腾 `mgl` 的实践记录,大家伙儿权当看个乐呵,图一乐!

最近不是心血来潮嘛想搞点图形方面的东西玩玩,就盯上了这个 `mgl`。听说是个用 Go 语言写的 OpenGL 绑定库,想着 Go 也学了挺久了,OpenGL 也略懂一点,说不定能整出点啥花活儿。

一开始上手,那叫一个懵逼。这玩意儿文档是真的少,示例代码也是寥寥无几。不过咱是谁,迎难而上!先是把 `mgl32` 和 `mgl64` 这两个库给 `go get` 下来,想着都试试,看看哪个更顺手。结果发现,好像没啥区别,就是精度不一样。后来想想,反正我也不做啥高精度计算,就选了 `mgl32`,省点内存也

mgl效果真的好不好?看看用过的人都是怎么评价!

然后就开始啃示例代码。官方的示例都比较简单,就一个画三角形的。我照着敲了一遍,跑起来,还真画出来了!心里那个激动,感觉打开了新世界的大门。不过光画个三角形肯定不行,我要画点更复杂的!

琢磨着画个立方体。这就要用到矩阵变换了,把立方体的顶点数据搞出来,然后用 `*` 创建透视投影矩阵,用 `*` 创建观察矩阵,再用模型矩阵把立方体放到世界坐标系里。这些矩阵乘来乘去的,一开始给我绕的头都大了。还好大学学的线性代数还记得一点,慢慢推导,总算是搞明白了。

顶点数据、矩阵都有了,接下来就是写 Shader 了。OpenGL 的 Shader 语言(GLSL)我也就只会写最简单的顶点着色器和片元着色器。顶点着色器负责把顶点坐标变换到裁剪空间,片元着色器负责给每个像素上色。我写了个简单的 Shader,让立方体显示不同的颜色,看起来有点立体感。

把 Shader 编译绑定到 OpenGL 程序里,再把顶点数据传进去,矩阵也传进去,就可以开始渲染了。结果一跑起来,立方体是画出来了,但是颜色不对!仔细一看,原来是顶点数据的顺序搞错了。OpenGL 默认是逆时针绕序的,我之前搞成了顺时针。改过来,颜色总算是对了。

画是能画了,但是感觉还是太单调。就想着加点光照。OpenGL 的光照模型有好几种,我选了最简单的 Lambert 光照模型。这个模型只需要计算顶点法向量和光照方向的点积,就能得到光照强度。把光照强度乘以颜色,就是最终的颜色。我加了个简单的平行光,让立方体看起来更有层次感了。

    mgl效果真的好不好?看看用过的人都是怎么评价!

  • 加载模型:网上找了个免费的 OBJ 模型加载器,把模型数据读到程序里。
  • 纹理贴图:找了张图片,用 OpenGL 加载为纹理,然后把纹理坐标传给 Shader,让模型显示纹理。
  • 加入了简单的交互:用键盘控制视角旋转,鼠标控制缩放。

中间也踩了不少坑,比如:

    mgl效果真的好不好?看看用过的人都是怎么评价!

  • OpenGL 上下文创建失败:这个问题折腾了我好久,后来发现是 GLFW 初始化的时候没设置 OpenGL 版本。
  • Shader 编译错误:GLSL 语法比较严格,稍微写错一点就编译不过
  • 矩阵计算错误:矩阵乘法的顺序很重要,乘错了结果就完全不一样。

这回用 `mgl` 折腾 OpenGL 还是挺有意思的。虽然过程有点痛苦,但是看到自己画出来的东西,还是很有成就感的。也算是对 Go 语言和 OpenGL 的一次实践。以后有空再深入研究一下,看看能不能搞出更炫酷的效果。

这回就先分享到这里,下次有机会再和大家聊聊我其他的折腾经历。

mgl效果真的好不好?看看用过的人都是怎么评价!

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,25人围观)

还没有评论,来说两句吧...