游戏人生
首页
(current)
GameDevTools
登陆
|
注册
个人中心
注销
游戏引擎 浅入浅出
Introduction
Introduction
前言
前言
1. 游戏引擎框架介绍
1. 游戏引擎框架介绍
1.1 Unity的组成
1.2 游戏引擎组成
2. Opengl开发环境搭建
2. Opengl开发环境搭建
2.1 Opengl到底是什么
2.2 搭建Opengl开发环境
2.3 使用VisualStudio开发
3. 绘制多边形
3. 绘制多边形
3.1 画个三角形
3.2 画个正方形
3.3 画个立方体
4. 着色器
4. 着色器
4.1 Unity Shader和OpenGL Shader
4.2 顶点着色器
4.3 片段着色器
5. 绘制贴图
5. 绘制贴图
5.1 颜色和贴图
5.2 贴图文件介绍
5.3 CPU与GPU的通信方式
5.4 使用stb_image解析图片
5.5 绘制带贴图的立方体盒子
5.6 压缩纹理
5.7 图片压缩工具
5.8 使用压缩纹理
5.9 DXT压缩纹理扩展
6. 索引与缓冲区对象
6. 索引与缓冲区对象
6.1 顶点索引
6.2 缓冲区对象
6.3 OpenGL Core Profile
6.4 顶点数组对象
7. 绘制Mesh和材质
7. 绘制Mesh和材质
7.1 导出Mesh文件
7.2 使用Mesh文件
7.3 Shader文件创建与使用
7.4 创建材质
7.5 使用材质
7.6 MeshRenderer
8. 绘制静态模型
8. 绘制静态模型
8.1 Blender安装与配置
8.2 Blender制作模型
8.3 Blender Python设置开发环境
8.4 Blender Python创建物体
8.5 Blender Python导出顶点数据
8.6 加载导出的Mesh
9. 基于组件开发
9. 基于组件开发
9.1 基于RTTR实现反射
9.2 实现GameObject-Component
10. 相机
10. 相机
10.1 最简单的相机
10.2 多相机渲染
10.3 相机排序
10.4 CullingMask
11. 控制系统
11. 控制系统
11.1 键盘控制
11.2 鼠标控制
12. 拆分引擎和项目
12. 拆分引擎和项目
13. 绘制文字
13. 绘制文字
13.1 TrueType简介
13.2 绘制单个字符
13.3 绘制多个文字
13.4 彩色字
14. GUI
14. GUI
14.1 正交相机
14.2 UIImage
14.3 UIMask
14.4 UIText
14.5 UIButton
15. 播放音效
15. 播放音效
15.1 播放2D音效
15.2 播放3D音效
15.3 使用FMOD Studio音频引擎
16. Profiler
16. Profiler
16.1 初识easy_profiler
16.2 集成easy_profiler
17. 嵌入Lua
17. 嵌入Lua
17.1 Sol2与C++交互
17.2 更加友好的Lua框架设计
17.3 引擎集成sol2
17.4 调试Lua
18. 骨骼动画
18. 骨骼动画
18.1 Blender制作骨骼动画
18.2 Blender导出骨骼动画
18.3 解析骨骼动画
18.4 矩阵的主序
19. 骨骼蒙皮动画
19. 骨骼蒙皮动画
19.1 骨骼蒙皮动画实现
19.2 骨骼权重
19.3 Blender蒙皮刷权重
19.4 Blender导出蒙皮权重
19.5 加载权重文件
20. 解析FBX文件
20. 解析FBX文件
20.1 导出Mesh
20.2 导出骨骼动画
20.3 导出权重
20.4 渲染骨骼蒙皮动画
21. 多线程渲染
21. 多线程渲染
21.1 GLFW多线程渲染
21.2 基于任务队列的多线程渲染
21.3 完全异步的多线程模型
21.4 引擎支持多线程渲染
22. Physx物理引擎
22. Physx物理引擎
22.1 Physx实例-小球掉落
22.2 物理材质
22.3 碰撞检测
22.4 连续碰撞检测
22.5 场景查询
22.6 引擎集成Physx
23. 经典光照
23. 经典光照
23.1 环境光
23.2 漫反射光照模型
23.3 镜面高光光照模型
23.4 高光贴图
23.5 Shader结构体
23.6 Uniform Buffer Object
23.7 方向光
23.8 点光源
23.9 多光源
24. 引擎编辑器的实现
24. 引擎编辑器的实现
24.1 分析Godot引擎编辑器
24.2 FBO RenderTexture GameTurbo DLSS
24.3 ImGui介绍与使用
24.4 分离引擎核心层和应用层
24.5 使用ImGui实现引擎编辑器
24.6 Hierarchy与Inspector面板
25. Shadow Mapping
25. Shadow Mapping
25.1 深度图
25.2 简单阴影
88. VSCode扩展开发与定制
88. VSCode扩展开发与定制
88.1 第一个VSCode扩展程序
88.2 从源码编译VSCode
88.3 打包VSCode内置扩展
88.4 打包LuaHelper到Code-OSS
89. Doxygen生成API文档
89. Doxygen生成API文档
90. GPU分析工具
90. GPU分析工具
90.1 RenderDoc分析不显示bug
98. SubstancePainter插件开发
98. SubstancePainter插件开发
98.1 SP插件开发环境
98.2 开发SP功能性插件
98.3 开发SP渲染插件
99. Toolbag插件开发
99. Toolbag插件开发
99.1 插件开发环境
99.2 API介绍
99.3 命令行调用Toolbag
99.4 更多实现
99.5 代码参考
附录1. Wwise音频引擎
附录1. Wwise音频引擎
1.1 Wwise名词概念
1.2 Wwise制作音效导出SoundBank
1.3 集成Wwise
1.4 封装Wwise播放3D音效
1.5 Wwise性能分析器介绍
1.6 猎人开发后记
代码资源下载
点我下载
Github
点赞、收藏、关注
目录
<< 15.2 播放3D音效
16. Profiler >>
## 15.3 使用FMOD Studio音频引擎 ```text 「游戏引擎 浅入浅出」是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book ``` ```bash CLion项目文件位于 samples/audio/load_bank ``` 前面两小节介绍了如何使用FMOD提供的库,来解析播放音频文件,并实现了类似Unity中的AudioSource组件。 但是这仅仅是FMOD Studio提供的基础功能,作为一款商用音频引擎,FMOD提供了音频解析、编辑、打包整个流程。 更为主要的是,FMOD通过Event的形式,将音频的效果配置工作完全交给了策划,程序只需要播放Event即可。 隔离不同工种之间的联系,将音频工作流水线化,这是大型项目所必备的。 FMOD Studio分为两部分:音频编辑器和解析库。 我这里通过一个小项目,根据地面类型,切换不同的脚步声,来分别介绍这两部分。 ### 1. 使用FMOD Studio编辑音频 在FMOD Studio中,可以创建项目、加载音效文件、创建Event、设置切换音频条件参数、设置混音效果。  上图是打开项目的主界面图。 本小节用到的FMOD Studio项目制作以及打包bank全过程,已经录制了视频在B站: <iframe width="800" height="450" src="https://player.bilibili.com/player.html?aid=292686527&bvid=BV1xf4y1H7oQ&cid=399330856&page=1" frameborder="0" allowfullscreen> </iframe> FMOD项目文件存放在: ```bash files\audio\load_bank\test\test.fspro ``` ### 2. 编写API 加载bank并播放 <font color=red>注意:使用FMOD Studio打包bank并播放的形式,和前2节直接播放wav文件不提供兼容,只能选一种使用。 在`CMakeList.txt`中添加了预处理器`USE_FMOD_STUDIO`,用来标记是否使用FMOD Studio打包bank并播放。</font> ```c++ ///file:samples/audio/load_bank/CMakeLists.txt line:5 add_definitions(-D USE_FMOD_STUDIO)#是否使用fmod studio,加载bank文件的形式。 ``` 为此创建新的结构 `AudioStudio` 来封装FMOD Studio的相关接口。 对FMOD Studio加载bank并播放,按照下图流程走:  #### 2.1 初始化FMOD Studio 首先调用API `FMOD_Studio_System_Create` 创建 `FMOD_STUDIO_SYSTEM`。 然后调用API `FMOD_Studio_System_Initialize` 进行初始化。 ```c++ ///file:source/audio/studio/audio_studio.cpp line:11 /// 初始化FMOD Studio FMOD_RESULT AudioStudio::Init() { FMOD_RESULT result=FMOD_Studio_System_Create(&system_, FMOD_VERSION); if(result!=FMOD_OK){ return result; } result=FMOD_Studio_System_Initialize(system_, 1024, FMOD_STUDIO_INIT_NORMAL, FMOD_INIT_NORMAL, nullptr); if(result!=FMOD_OK){ return result; } return FMOD_OK; } ``` #### 2.2 加载bank 调用`FMOD_Studio_System_LoadBankFile`就可以加载bank文件了。 ```c++ ///file:source/audio/studio/audio_studio.cpp line:30 /// 加载 bank 文件 /// \param file_name /// \return FMOD_RESULT AudioStudio::LoadBankFile(string file_name) { string bank_path=Application::data_path()+file_name; FMOD_STUDIO_BANK* bank= nullptr; return FMOD_Studio_System_LoadBankFile(system_, bank_path.c_str(), FMOD_STUDIO_LOAD_BANK_NORMAL, &bank); } ``` #### 2.3 创建Event实例 Event就是一个音效,只不过这个音效包含:一个或多个音频文件、混音、参数等信息。 创建Event实例后,就可以对其进行播放暂停,以及更高级的调整参数操作。 这里创建新的结构 `AudioStudioEvent` 来封装Event实例的相关操作。 ```c++ ///file:source/audio/studio/audio_studio.cpp line:38 /// 获取Event实例,如果没有就创建。 /// \param event_path /// \return AudioStudioEvent* AudioStudio::CreateEventInstance(const char *event_path) { FMOD_STUDIO_EVENTDESCRIPTION* event_description= nullptr; FMOD_RESULT result= FMOD_Studio_System_GetEvent(system_, event_path, &event_description); if(result!=FMOD_OK){ DEBUG_LOG_ERROR("FMOD_Studio_System_GetEvent result:{},event_path:{}",result,event_path); return nullptr; } FMOD_STUDIO_EVENTINSTANCE* event_instance=nullptr; result= FMOD_Studio_EventDescription_CreateInstance(event_description,&event_instance); if(result!=FMOD_OK){ DEBUG_LOG_ERROR("FMOD_Studio_EventDescription_CreateInstance result:{},event_path:{}",result,event_path); return nullptr; } AudioStudioEvent* audio_studio_event=new AudioStudioEvent(); audio_studio_event->set_event_instance(event_instance); return audio_studio_event; } ``` 这里其实分了2步: 1. 调用`FMOD_Studio_System_GetEvent` 通过Event名,获取`FMOD_STUDIO_EVENTDESCRIPTION`Event描述。 2. 调用`FMOD_Studio_EventDescription_CreateInstance`创建Event实例。 然后将Event实例,交给`AudioStudioEvent`。 #### 2.4 播放Event实例 Event实例的播放、暂停、设置参数操作,都在`AudioStudioEvent`中进行。 调用`FMOD_Studio_EventInstance_Start`即可对Event实例进行播放。<a id="antiCollectorAdTxt" href="https://github.com/ThisisGame/cpp-game-engine-book">「游戏引擎 浅入浅出」是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book</a> ```c++ ///file:source/audio/studio/audio_studio_event.cpp line:23 /// 播放Event实例 void AudioStudioEvent::Start() { if(event_instance_== nullptr){ DEBUG_LOG_ERROR("event_instance_== nullptr"); return; } FMOD_RESULT result=FMOD_Studio_EventInstance_Start(event_instance_); if(result!=FMOD_OK){ DEBUG_LOG_ERROR("FMOD_Studio_EventInstance_Start result:{}",result); return; } } ``` 如果只是播放音效,那么在这里就已经可以了。 不过这次的项目是,根据地面类型,切换不同的脚步声,在FMOD编辑器中已经添加好了地面类型这个参数,所以要继续对Event实例设置参数。 #### 2.5 设置Event参数 设置Event参数后,FMOD就可以根据参数,对Event进行逻辑修改,例如:切换到其他的音频文件、修改音量、调整播放速度、设置3D坐标等。 本节例子中,根据Event参数切换到不同的脚步声音。   上图是Event参数--groundtype(地面类型),其实是一个float型。 FMOD提供接口`FMOD_Studio_EventInstance_SetParameterByName`来设置Event参数。 ```c++ ///file:source/audio/studio/audio_studio_event.cpp line:14 /// 设置Event参数 /// \param name /// \param value /// \param ignore_seek_speed /// \return FMOD_RESULT AudioStudioEvent::SetParameterByName(const char *name, float value, bool ignore_seek_speed) { return FMOD_Studio_EventInstance_SetParameterByName(event_instance_,name,value,ignore_seek_speed); } ``` #### 2.6 设置Event 3D坐标与听者坐标 因为是3D音效,所以需要对Event设置3D属性,即3D坐标。 ```c++ ///file:source/audio/studio/audio_studio_event.cpp line:18 /// 设置Event 3D属性 /// \param x /// \param y /// \param z /// \return FMOD_RESULT AudioStudioEvent::Set3DAttribute(float x,float y,float z){ FMOD_3D_ATTRIBUTES attributes = { { x,y,z } }; return FMOD_Studio_EventInstance_Set3DAttributes(event_instance_,&attributes); } ``` 然后还需要设置听者的坐标。 ```c++ ///file:source/audio/studio/audio_studio.cpp line:56 /// 设置听者属性 /// \param x /// \param y /// \param z void AudioStudio::setListenerAttributes(float x, float y, float z) { FMOD_3D_ATTRIBUTES attributes = { { x,y,z } }; attributes.forward.z = 1.0f; attributes.up.y = 1.0f; FMOD_Studio_System_SetListenerAttributes(system_,0,&attributes,0); } ``` ### 3. 编写example代码 现在FMOD Studio项目也有了,也封装好了接口到`AudioStudio`、 `AudioStudioEvent`。 按照视频中教程,导出bank文件后,就可以进行测试了。 #### 3.1 加载bank并创建Event实例 去掉上一节代码中的AudioSource组件,现在改为创建Event了。 ```c++ ///file:example/login_scene.cpp line:48 void LoginScene::CreateAudioSource() { ...... //加载bank AudioStudio::LoadBankFile("audio/test.bank"); AudioStudio::LoadBankFile("audio/test.strings.bank"); audio_studio_event_=AudioStudio::CreateEventInstance("event:/footstep"); } ``` #### 3.2 播放Event实例 ```c++ ///file:example/login_scene.cpp line:102 void LoginScene::Update() { ...... //播放Event实例 if(Input::GetKeyUp(KEY_CODE_S)){ audio_studio_event_->Start(); } //按键盘1、2、3设置参数值,切换不同的地面类型,播放不同的脚步声 if(Input::GetKeyUp(KEY_CODE_1)){ audio_studio_event_->SetParameterByName("groundtype",0.0f); }else if(Input::GetKeyUp(KEY_CODE_2)){ audio_studio_event_->SetParameterByName("groundtype",1.0f); }else if(Input::GetKeyUp(KEY_CODE_3)){ audio_studio_event_->SetParameterByName("groundtype",2.0f); } ...... //设置听者位置 glm::mat4 rotate_mat4=glm::rotate(glm::mat4(1.0f),glm::radians(Time::delta_time()*60),glm::vec3(0.0f,0.0f,1.0f)); glm::vec4 old_pos=glm::vec4(transform_player_->position(),1.0f); glm::vec4 new_pos=rotate_mat4*old_pos;//旋转矩阵 * 原来的坐标 = 以零点做旋转。 transform_player_->set_position(glm::vec3(new_pos)); auto player_pos=transform_player_->position(); AudioStudio::setListenerAttributes(player_pos.x,player_pos.y,player_pos.z); } ``` ### 4. 运行example 按键 `s` 播放Event 按键 `1`切换水泥地面 按键 `2`切换草地 按键 `3`切换木质地板 测试视频: <iframe width="800" height="450" src="https://player.bilibili.com/player.html?aid=292686527&bvid=BV1xf4y1H7oQ&cid=399330856&page=1" frameborder="0" allowfullscreen> </iframe>
<< 15.2 播放3D音效
16. Profiler >>
12
代码资源下载
点我下载
Github
点赞、收藏、关注
目录
Introduction
Introduction
前言
前言
1. 游戏引擎框架介绍
1. 游戏引擎框架介绍
1.1 Unity的组成
1.2 游戏引擎组成
2. Opengl开发环境搭建
2. Opengl开发环境搭建
2.1 Opengl到底是什么
2.2 搭建Opengl开发环境
2.3 使用VisualStudio开发
3. 绘制多边形
3. 绘制多边形
3.1 画个三角形
3.2 画个正方形
3.3 画个立方体
4. 着色器
4. 着色器
4.1 Unity Shader和OpenGL Shader
4.2 顶点着色器
4.3 片段着色器
5. 绘制贴图
5. 绘制贴图
5.1 颜色和贴图
5.2 贴图文件介绍
5.3 CPU与GPU的通信方式
5.4 使用stb_image解析图片
5.5 绘制带贴图的立方体盒子
5.6 压缩纹理
5.7 图片压缩工具
5.8 使用压缩纹理
5.9 DXT压缩纹理扩展
6. 索引与缓冲区对象
6. 索引与缓冲区对象
6.1 顶点索引
6.2 缓冲区对象
6.3 OpenGL Core Profile
6.4 顶点数组对象
7. 绘制Mesh和材质
7. 绘制Mesh和材质
7.1 导出Mesh文件
7.2 使用Mesh文件
7.3 Shader文件创建与使用
7.4 创建材质
7.5 使用材质
7.6 MeshRenderer
8. 绘制静态模型
8. 绘制静态模型
8.1 Blender安装与配置
8.2 Blender制作模型
8.3 Blender Python设置开发环境
8.4 Blender Python创建物体
8.5 Blender Python导出顶点数据
8.6 加载导出的Mesh
9. 基于组件开发
9. 基于组件开发
9.1 基于RTTR实现反射
9.2 实现GameObject-Component
10. 相机
10. 相机
10.1 最简单的相机
10.2 多相机渲染
10.3 相机排序
10.4 CullingMask
11. 控制系统
11. 控制系统
11.1 键盘控制
11.2 鼠标控制
12. 拆分引擎和项目
12. 拆分引擎和项目
13. 绘制文字
13. 绘制文字
13.1 TrueType简介
13.2 绘制单个字符
13.3 绘制多个文字
13.4 彩色字
14. GUI
14. GUI
14.1 正交相机
14.2 UIImage
14.3 UIMask
14.4 UIText
14.5 UIButton
15. 播放音效
15. 播放音效
15.1 播放2D音效
15.2 播放3D音效
15.3 使用FMOD Studio音频引擎
16. Profiler
16. Profiler
16.1 初识easy_profiler
16.2 集成easy_profiler
17. 嵌入Lua
17. 嵌入Lua
17.1 Sol2与C++交互
17.2 更加友好的Lua框架设计
17.3 引擎集成sol2
17.4 调试Lua
18. 骨骼动画
18. 骨骼动画
18.1 Blender制作骨骼动画
18.2 Blender导出骨骼动画
18.3 解析骨骼动画
18.4 矩阵的主序
19. 骨骼蒙皮动画
19. 骨骼蒙皮动画
19.1 骨骼蒙皮动画实现
19.2 骨骼权重
19.3 Blender蒙皮刷权重
19.4 Blender导出蒙皮权重
19.5 加载权重文件
20. 解析FBX文件
20. 解析FBX文件
20.1 导出Mesh
20.2 导出骨骼动画
20.3 导出权重
20.4 渲染骨骼蒙皮动画
21. 多线程渲染
21. 多线程渲染
21.1 GLFW多线程渲染
21.2 基于任务队列的多线程渲染
21.3 完全异步的多线程模型
21.4 引擎支持多线程渲染
22. Physx物理引擎
22. Physx物理引擎
22.1 Physx实例-小球掉落
22.2 物理材质
22.3 碰撞检测
22.4 连续碰撞检测
22.5 场景查询
22.6 引擎集成Physx
23. 经典光照
23. 经典光照
23.1 环境光
23.2 漫反射光照模型
23.3 镜面高光光照模型
23.4 高光贴图
23.5 Shader结构体
23.6 Uniform Buffer Object
23.7 方向光
23.8 点光源
23.9 多光源
24. 引擎编辑器的实现
24. 引擎编辑器的实现
24.1 分析Godot引擎编辑器
24.2 FBO RenderTexture GameTurbo DLSS
24.3 ImGui介绍与使用
24.4 分离引擎核心层和应用层
24.5 使用ImGui实现引擎编辑器
24.6 Hierarchy与Inspector面板
25. Shadow Mapping
25. Shadow Mapping
25.1 深度图
25.2 简单阴影
88. VSCode扩展开发与定制
88. VSCode扩展开发与定制
88.1 第一个VSCode扩展程序
88.2 从源码编译VSCode
88.3 打包VSCode内置扩展
88.4 打包LuaHelper到Code-OSS
89. Doxygen生成API文档
89. Doxygen生成API文档
90. GPU分析工具
90. GPU分析工具
90.1 RenderDoc分析不显示bug
98. SubstancePainter插件开发
98. SubstancePainter插件开发
98.1 SP插件开发环境
98.2 开发SP功能性插件
98.3 开发SP渲染插件
99. Toolbag插件开发
99. Toolbag插件开发
99.1 插件开发环境
99.2 API介绍
99.3 命令行调用Toolbag
99.4 更多实现
99.5 代码参考
附录1. Wwise音频引擎
附录1. Wwise音频引擎
1.1 Wwise名词概念
1.2 Wwise制作音效导出SoundBank
1.3 集成Wwise
1.4 封装Wwise播放3D音效
1.5 Wwise性能分析器介绍
1.6 猎人开发后记