游戏人生
首页
(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面板
24.7 Geometry Buffer
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
点赞、收藏、关注
目录
<< 24. 引擎编辑器的实现
24.2 FBO RenderTexture GameTurbo DLSS >>
## 24.1 分析Godot引擎编辑器 ```text 「游戏引擎 浅入浅出」是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book ``` 这也是我第一次写编辑器,所以先学习下别的引擎是怎么实现的。 ![](md/cpp-game-engine-book/imgs/engine_editor/godot/godot_editor_area.jpg) 这是Godot,它是目前最流行的开源引擎项目,它的编辑器是基于`imgui`实现的。 ```text imgui是目前最流行的UI库,后续教程也是基于 imgui 来实现编辑器。 ``` ### 1. RenderDoc分析Godot Godot和Unity类似,打开exe出现的是项目列表而不是编辑器本体。 所以在RenderDoc打开时需要加上参数设置为直接打开项目,如下图: ![](md/cpp-game-engine-book/imgs/engine_editor/godot/open_project_directly.jpg) 启动截取一帧进行分析。 ![](md/cpp-game-engine-book/imgs/engine_editor/godot/pass1.jpg) 可以看到编辑器绘制使用了2个Pass。 Pass1是绘制了游戏场景,并最终将游戏场景渲染到了纹理 Texture 1661 上。 ![](md/cpp-game-engine-book/imgs/engine_editor/godot/pass2.jpg) Pass2则绘制了编辑器的框架和菜单,然后在指定的位置绘制了纹理 Texture 1661,就将游戏场景嵌入到了编辑器中。 这个嵌入的操作是不是很熟悉! 将游戏场景渲染到贴图,这个操作大家都用过,就是Unity的RTT。 ![](md/cpp-game-engine-book/imgs/engine_editor/godot/UnityRenderTextureLiveCam.png) 在人物装备界面要渲染人物3D模型,可以用一个相机对着人物3D模型,然后将相机Target设置到一个RenderTexture上,然后在界面上渲染这个RenderTexture。 原来引擎编辑器和我们做一个人物装备界面是一样的原理,so easy! ### 2. 制定OpenGL实现方案 经过分析,发现引擎编辑器的原理并不陌生,不过实现起来却不是那么简单,首先我们得搞清楚2点: 1. 什么是Pass?为什么要用多个Pass? 2. Unity中的RenderTexture,在OpenGL中要怎么实现及使用? #### 2.1 什么是Pass? 一个Pass就是一个步骤、一个工序。 <a id="antiCollectorAdTxt" href="https://github.com/ThisisGame/cpp-game-engine-book">「游戏引擎 浅入浅出」是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book</a> 以装修刷墙为例,包括多个工序:清理墙面→修补墙面→涂刷界面剂→防开裂处理→自攻丝防锈处理→石膏找平→第一遍刮腻子→第二遍刮腻子→打磨砂光→刷乳胶漆底漆→刷第一遍乳胶漆面漆→刷第二遍乳胶漆面漆。 上面分析看到Godot引擎编辑器有2个工序:将游戏场景渲染到贴图->将贴图渲染到指定区域。 多Pass也常用在游戏的后处理,例如使命召唤手游可以设置多种画面风格,可以理解为将整个场景渲染到RenderTexture之后,再对其做了色相、颜色鲜艳度的调整。 ![](md/cpp-game-engine-book/imgs/engine_editor/godot/codm_picture_style.jpg) 所以Pass是一个逻辑上的概念,实际OpenGL中并没有Pass这个东西。 大家用Pass是便于区分当前的工序内容。 #### 2.2 什么是RenderTexture? 在Unity中创建一个256x256的RenderTexture,在属性面板中看到它是一个32位的纹理,占用0.5MB内存,那它应该是一张图片? ![](md/cpp-game-engine-book/imgs/engine_editor/godot/unity_render_texture_argb32.jpg) 在文件管理器中查看,发现它只有1kb大小,打开一看是文本,里面是YAML格式数据,记录了在Unity属性面板看到的数据,那它又不是一张图片? ![](md/cpp-game-engine-book/imgs/engine_editor/godot/what_is_render_texture.jpg) 那RenderTexture到底是什么? 先假定RenderTexture就是一张图片,那么使用RenderTexture的流程是这样的: Pass1:显卡中渲染3D场景,颜色数据存储到一块显存中-->从显存复制颜色数据到内存-->将内存颜色数据保存到硬盘图片文件。 Pass2:从硬盘读取图片文件到内存-->上传到显卡显存作为纹理-->渲染。 流程十分长,而且在第五章介绍过,读取图片、上传图片都是十分耗时的操作,所以从流程原理上就决定了RenderTexture不会是一张图片文件。 那么再回过头来,我们使用RenderTexture的目的,是为了拿到第一个Pass的结果,去做一些其他的处理,例如拿去渲染、拿去做色彩风格调整。 这些处理,几乎都是发生在显卡上的,那么就没有必要把它从显存下载到内存。 只需要提供一个句柄(Handle),在需要的时候,在CPP代码中绑定它来进行渲染即可。 所以Unity的RenderTexture其实是一个句柄,它指向了Pass1的渲染结果所在的显存。 在OpenGL中,渲染结果默认是输出到屏幕,不过我们可以设置其输出到一块显存Buffer中,并且可以将这块Buffer指定为Texture,这就是RenderTexture。 显存Buffer已经使用过很多了,有VBO、VAO、UBO。 将整个场景渲染结果、将整个屏幕的渲染结果,存储起来的,叫FrameBufferObject,简称FBO。 将FBO的颜色数据拿出来,作为Texture,就是RenderTexture。 #### 2.3 制定方案 好,了解了Pass和RenderTexture,那么引擎编辑器的方案就制定好了: 1. Pass1:渲染整个场景,存储到FBO中,并将颜色数据指定为Texture。 2. Pass2:将上面的Texture,渲染到编辑器指定区域。
<< 24. 引擎编辑器的实现
24.2 FBO RenderTexture GameTurbo DLSS >>
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面板
24.7 Geometry Buffer
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 猎人开发后记