需要先了解简单的线性代数/数学知识,以及OpenGL/DirectX至少一种
一、渲染流水线
三个阶段:应用阶段 → 几何阶段 → 光栅化阶段
应用阶段(起点为CPU,目标为GPU):
- 把数据加载到显存中:显卡对于显存的访问速度更快,而且大多数显卡对于 RAM 没有直接的访问权利,加载到显存后对于原先在 RAM 中的数据可以选择性的移除
- 设置渲染状态:确定使用的着色器,材质等
- 调用 Draw Call:Draw Call 是 CPU 发送给 GPU 的一个命令,告诉 GPU 可以开始绘制工作,之前的 OpenGL 和 DirectX 就是上层应用程序与底层 GPU 之间的沟通桥梁,尽可能的减少 Draw Call 次数是一个非常重要的优化方向
几何阶段 & 光栅化阶段:
GPU开始渲染工作,对应渲染管线:https://blog.csdn.net/Jaihk662/article/details/105560152(OpenGL基础3:渲染管线)
二、基础渲染环节
空间变换:https://blog.csdn.net/Jaihk662/article/details/106237306
顶点着色器 & 片段着色器:https://blog.csdn.net/Jaihk662/article/details/105954230
深度测试 & 模板测试:https://blog.csdn.net/Jaihk662/article/details/107100249
https://blog.csdn.net/Jaihk662/article/details/107109788
……
三、扩展
GPU 和 CPU 是如何并行工作的:
流水线模式,命令缓冲区(Command Buffer)包含了一个缓冲队列,CPU向其中添加命令,而GPU从中读取命令,添加和读取过程是相互独立的
为什么 Draw Call 多了会影响帧率?
在每次调用 Draw Call 时,CPU 需要进行非常多的工作,包括但不限于发送状态命令和数据,检查渲染状态等,一般其提交速度要低于GPU的渲染速度,会出现性能瓶颈
HLSL、GLSL、CG 着色器语言:
- GLSL:OpenGL 的着色器语言,由显卡驱动来完成着色器的编译工作,依赖硬件而不依赖操作系统
- HLSL:DirectX 的着色器语言,由微软控制着色器的编译,因此往往只支持微软平台的产品
- CG:真正意义上的跨平台,它会根据平台的不同编译成相应的中间语言,是与微软的合作项目,与 HLSL 高度相似
在 Unity Shader 中,可以选择使用 "CG/HLSL" 或者 "GLSL"