今年夏天整理资料的时候发现了一本电子书《三维游戏设计师宝典——学OpenGL编3D游戏》,书比较老,windows下实现的,里面用的是OpenGL固定管线,但是它实现了一个完整的小项目,文件的读写,解析,功能比较完善。我想用现代OpenGL重新实现它的话,更加锻炼人,我之前在ubuntu下面搭建了学习OpenGL的工程,就是之前学习过https://learnopengl-cn.github.io/里面的入门课程,我把这个重新实现的东西给它搬了进来,makefile很好写,文件的依赖写清楚就行。
https://github.com/tankwei/SDLOpenGL
主要就这么几个要点,bmp文件的读写,书里面bmp读写是在windows下实现的,linux下结构体我做了修改,3ds和obj格式文件的解析,md2模型文件的解析,地形地貌的渲染。二维图形,三维几何体的渲染,茶壶的渲染,茶壶的渲染这本书里面调用的是老式的glu接口,我在wiki上找到了算法,搬了过来。
书里面md2的解析我在linux下重新实现,出了很多问题,就暂时抄别人的,我参考了一个牛人的代码,这里https://github.com/michaeleggers/Engine2 他的md2模型的渲染写得很不错,在linux下运行没问题。我原先搭建OpenGL学习项目的时候窗体用的是glfw3库,他用的是SDL2加OpenGL。
我的环境是debian 10,用了deepin,ubuntu 18,最后我还是换回了debian,感觉还是debian好用,在龙芯派二代上用的也是debian 10,因此统一用debian。如果工作环境可能需要ubuntu,或着windows。
Obj文件的解析我用的是Assimp库,自己写的obj模型解析在另一个版本的项目里面,代码没整理好,暂时不放出来了。用Assimp库实现了给人物模型更换节点,我实现了用头部模型去替换身体模型的头部部分。
用libpng库读取png图像数据创建SDL纹理的时候,逐行检测透过色时,设置为透明,这样就不用调用SDL2的透过色方法了。