游戏人生
首页
(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
点赞、收藏、关注
目录
<< 5.1 颜色和贴图
5.3 CPU与GPU的通信方式 >>
## 5.2 贴图文件介绍 ```text 「游戏引擎 浅入浅出」是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book ``` 贴图文件按格式大致分为3种: 1. 没有压缩的图片格式 2. CPU压缩的图片格式 3. 显卡支持的图片格式 下面一一介绍。 ### 1.没有压缩的图片格式 在Unity中设置图片格式时,选择TrueColor就是没有压缩的图片格式,即真彩色。 没有压缩的TrueColor,每个像素值RGB分别用1个字节来表示,那么一张1024x1024的图,就是 1024x 1024x3=3145728,就是3M。 在Windows系统中,不压缩的图片格式就是 `.bmp`,下面用画图软件创建1024x1024的图片,保存为`.bmp`格式。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/create_1024_bmp.gif) 查看图片大小。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/bmp_size_big_to_truecolor.png) 发现图片大小是 3145782。 这比上面计算的TrueColor图片尺寸大了一些,多了 54 字节。 这是为什么? #### 1.1 文件的身份证--文件头 计算机文件类型数以千计,当用软件打开一个文件时,是如何判断这个文件可打开呢? 其实每一种文件,都有自己的身份证--文件头。 文件头就是文件的头部区域,所谓文件就是硬盘中存储的一块字节数据,这块字节数据的前面几个字节,就是文件头。 一个文件,一般是由2部分组成: | 文件头 | 实际数据 | |---|---| 上面创建的 `.bmp` 图片,就是因为多了文件头,所以会比计算的TrueColor尺寸大。 用HxD十六进制编辑器打开图片。 下载地址:https://mh-nexus.de/en/downloads.php?product=HxD20 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/hxd_show_bmp_head.jpg) 可以看到大片都是`24 1C ED`,这是因为图片里的红色RGB为(237,28,36)。 文件开始有54个字节,就是`.bmp`图片格式的文件头。 当我们用软件打开图片文件,软件会先读取前54个字节,判断是`.bmp`格式,就直接读取后面的字节数据,然后显示出来。 ### 2. CPU压缩的图片格式 在日常工作中,几乎不会用到`.bmp`格式,因为占用空间太大了,存储/传输都不方便。 对于大文件,我们一般会用文件压缩软件对其进行压缩,保存为`.zip`等格式。 文件压缩方式分为无损压缩和有损压缩。 源文件压缩之后,再解压得到的文件,和源文件一致,这就叫做无损压缩。 我们熟知的`.zip` `.rar` `.7z`都是无损压缩,毕竟数据完整性是硬性需求。<a id="antiCollectorAdTxt" href="https://github.com/ThisisGame/cpp-game-engine-book">「游戏引擎 浅入浅出」是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book</a> 那么什么时候能用到有损压缩? 对于精度要求不是那么高的,就可以用有损压缩,例如图片、骨骼动画。 #### 2.1 无损压缩 `.png`是常见的无损压缩格式。 把上面创建的`无标题.bmp`存为`.png`格式,文件大小变为 6,410 字节。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/png_size.png) 拖到 HxD十六进制编辑器中。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/hxd_show_png_head.jpg) 前面一段是文件头。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/hxd_show_png_trunk.jpg) 随后就是被压缩的颜色数据。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/hxd_show_png_end.jpg) 最后是文件尾。 #### 2.1 有损压缩 用的较多的有损压缩是 `.jpg`。 jpg图片可以一直压缩,直到压不动了为止。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/jpg_compress_very_low.jpg) ### 3. 显卡支持的图片格式 #### 3.1 显卡图片格式优势 我们编写代码,读取`.png`、`.jpg`图片文件用于渲染,流程如下: ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/load_png_flow.jpg) 解压是特别耗时的操作,并且在解压的时候,需要占用额外一份内存。 因此一般我们都会选择将`.png`、`.jpg`图片,预先转换为显卡支持的图片格式,打包到游戏安装包,这样进游戏就只需要加载到内存,然后上传到GPU即可。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/load_gpu_compress_flow.jpg) #### 3.2 Unity中的图片压缩 用Unity导入一个项目往往需要花费特别长的时间,有很大一部分都是花费在,预先转换图片为显卡支持的图像格式。 `.png`、`.jpg`图片文件读取到内存,然后解压,转换格式,存放到Library目录。 游戏Play时,从Library读取转换好的图像数据。 因为每个系统、每一种GPU,支持的最优图像格式都不同,所以根据选择的Platform,Unity会转换为不同的图像格式。 #### 3.3 常用显卡支持图像格式 在Unity的`Texture Import Setting`可以看到常用的显卡支持图像格式。 ![](md/cpp-game-engine-book/imgs/texture_make_beautiful/texture_format/frequently_used_gpu_texture_format.jpg) 带 `Compressed`的都是压缩格式,由于显卡的大规模并行处理特性,解压缩不再是问题了。
<< 5.1 颜色和贴图
5.3 CPU与GPU的通信方式 >>
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 猎人开发后记