渲染原理
着色器
着色器类似于一个计算器,用于根据给定的参数,制作特效;
法线贴图
这个中文名称有点怪,英文名称是 Normal Map,即普通贴图;它主要用于展现凹凸效果;理论上凹凸效果也可以使用建模来实现,但是当细节很多时,工作量过大,因此不现实。更高效的做法是使用带凹凸参数的贴图;物体只由数量有限的多边形来表示,表现的纹理则基于贴图参数来计算;
所谓的贴图参数,即是一种细节模拟,这些参数可用来计算光线效果,让相应的部位看起来像是有真实的模型存在一样。但实际上没有,完成是基于参数计算出来的效果;
法线:垂直于某个平面的线,这条线可用来计算物体和光线之间的夹角。 有了夹角后,就可以计算物体表面接收到多少光线;
物体呈现出体积形状,其实是由物体表面所反向的光线决定的。对于一个多边形圆柱体,如果我们将法线的角度变化,调整成圆柱形的,那么计算出来的着色也将是平滑过渡的,最后在我们肉眼看来,多边形变成了圆形。但实际上,底层的参数存储的是多边形;
将表面的法线角度与真实角度的偏差,单独抽离出来存储,那么这个偏差值的集合,就是所谓的法线贴图;
CPU 渲染逻辑
主要有四个工作:
- 剔除工作:
- 视锥体剔除;
- 图层剔除;
- 遮挡剔除;
- 设置渲染顺序:
- 不透明队列:根据距离摄像头的距离,由近到远依次渲染;
- 半透明队列:从远到近渲染;
- 打包数据:将数据打包发送给 GPU 渲染;
- 模型信息:顶点坐标、法线、UV、切线、顶点颜色、索引列表等;
- 变换矩阵:世界变换矩阵、VP 矩阵(基于相机位置和 FOV 参数);
- 灯光、材质参数:着色器和材质参数,灯光信息等;
- 调用渲染函数
- SetPassCall
- shader 脚本中的一个 Pass 语义块就是一个完整的渲染过程;一个着色器可包含多个 Pass 语义块;
- DrawCall:CPU 调用图像编程接口,命令 GPU 渲染的操作,即渲染命令;渲染命令的参数为图元列表,其计算结果为显示在屏幕上的像素;
- SetPassCall
CPU 渲染阶段的一个重要输出是渲染图元,图元中包括 GPU 渲染需要用到的各种参数信息,例如点、线、面等几何信息;
GPU 渲染管线
GPU 渲染管线包含以下多个步骤:
- 顶点处理
- 顶点着色器:主要执行坐标转换,将顶点的坐标转换到齐次裁剪
- 曲面细分着色器(可选)
- 几何着色器(可选)
- 图元装配
- 光栅化
- 片元着色器
- 输出合并
渲染原理
https://ccw1078.github.io/2024/07/21/渲染原理/