ZJU CG 2021
不完全文档:doc
可执行文件:bin/fps.exe
此项目实现了一个简单的FPS游戏。
绘制方面,使用Blinn-Phong光照模型,支持使用法线贴图提升细节,使用Shadow Mapping和PCF生成软阴影,支持HDR,支持Bloom,支持SSAO。
游戏方面,实现了射击检测,碰撞检测,生命值系统,多种枪械切换,枪械后坐力,枪械伤害衰减,简单的敌人攻击等内容。
使用开源库Dear ImGui制作了场景编辑器,可以自由编辑场景里的游戏对象和光源。
使用XML文件保存和读取场景数据,使用到了开源库TinyXML2。
-
基于 OpenGL/WebGL,具有基本体素(立方体、球、圆柱、圆锥、多面棱柱、多面棱台)的建模表达能力
-
具有基本三维网格导入导出功能(建议 OBJ 格式)
ObjLoader.cpp// 导入 Model* ObjLoader::LoadModel(const string& path); // 导出 bool ObjLoader::WriteModel(const Model& model);
-
具有基本材质、纹理的显示和编辑能力
Material.hstruct Material { glm::vec3 colorAmbient; glm::vec3 colorDiffuse; glm::vec3 colorSpecular; float shininess; int illum; Texture* texDiffuse; Texture* texSpecular; Texture* texNormal; };
-
具有基本几何变换功能(旋转、平移、缩放等)
Transfrom.cpp -
基本光照明模型要求,并实现基本的光源编辑(如调整光源的位置,光强等参数)
Light.cpp
支持点光源、方向光、聚光灯,支持距离衰减。
在Gui.cpp中实现了在游戏中编辑光源参数的UI。 -
能对建模后场景进行漫游如 Zoom In/Out, Pan, Orbit, Zoom To Fit等观察功能
- 漫游时可实时碰撞检测
场景中部分物体没有设置碰撞箱。 - 光照明模型细化
实现了法线贴图,实时阴影,SSAO
WASD 人物移动
1/2 切换武器
鼠标左键 射击
PageUp/PageDown 提升/降低画面亮度
Up/Down 提升/降低主角的移动速度
ALT 切换鼠标模式
O 开启/关闭SSAO
N 开启/关闭法线贴图
B 开启/关闭Bloom
H 开启/关闭HDR
lib/glfw3.lib 是64位的库,所以不能编译32位版本。
源代码采用UTF-8编码,MSVC在中文系统下需要添加编译参数/utf-8,否则会出现大量Warning甚至编译失败。
使用CMake或者支持CMake工程的IDE(例如Visual Studio 2019及以上,CLion等)打开这个文件夹,然后编译。只能编译64位版本,因为lib中只提供了64位版本的库。
如果使用Visual Studio Code的CMake插件,最终可执行文件会被输出到bin/Release/fps.exe。但是在程序中我们采用相对路径来读取Shader和资源文件,所以会找不到,需要手动将fps.exe移动到bin/fps.exe才可以正常运行。
如果使用VS或者CLion则会直接把可执行文件移动到bin/fps.exe。
建议编译Release版本,在Debug模式下ifstream的速度太慢了,读取模型文件要花相当长的时间。
[1] https://learnopengl-cn.github.io/
[2] https://wiki.jikexueyuan.com/project/modern-opengl-tutorial/tutorial28.html
[3] https://blog.csdn.net/qq_31615919/article/details/78968434
[4] OpenGL ES应用开发实践指南 Android卷 [(美)KevinBrothaler著][机械工业出版社]
使用的开源代码:








