渲染原理

着色器

着色器类似于一个计算器,用于根据给定的参数,制作特效;

法线贴图

这个中文名称有点怪,英文名称是 Normal Map,即普通贴图;它主要用于展现凹凸效果;理论上凹凸效果也可以使用建模来实现,但是当细节很多时,工作量过大,因此不现实。更高效的做法是使用带凹凸参数的贴图;物体只由数量有限的多边形来表示,表现的纹理则基于贴图参数来计算;

所谓的贴图参数,即是一种细节模拟,这些参数可用来计算光线效果,让相应的部位看起来像是有真实的模型存在一样。但实际上没有,完成是基于参数计算出来的效果;

法线:垂直于某个平面的线,这条线可用来计算物体和光线之间的夹角。 有了夹角后,就可以计算物体表面接收到多少光线;

物体呈现出体积形状,其实是由物体表面所反向的光线决定的。对于一个多边形圆柱体,如果我们将法线的角度变化,调整成圆柱形的,那么计算出来的着色也将是平滑过渡的,最后在我们肉眼看来,多边形变成了圆形。但实际上,底层的参数存储的是多边形;

将表面的法线角度与真实角度的偏差,单独抽离出来存储,那么这个偏差值的集合,就是所谓的法线贴图;

CPU 渲染逻辑

主要有四个工作:

  • 剔除工作:
    • 视锥体剔除;
    • 图层剔除;
    • 遮挡剔除;
  • 设置渲染顺序:
    • 不透明队列:根据距离摄像头的距离,由近到远依次渲染;
    • 半透明队列:从远到近渲染;
  • 打包数据:将数据打包发送给 GPU 渲染;
    • 模型信息:顶点坐标、法线、UV、切线、顶点颜色、索引列表等;
    • 变换矩阵:世界变换矩阵、VP 矩阵(基于相机位置和 FOV 参数);
    • 灯光、材质参数:着色器和材质参数,灯光信息等;
  • 调用渲染函数
    • SetPassCall
      • shader 脚本中的一个 Pass 语义块就是一个完整的渲染过程;一个着色器可包含多个 Pass 语义块;
    • DrawCall:CPU 调用图像编程接口,命令 GPU 渲染的操作,即渲染命令;渲染命令的参数为图元列表,其计算结果为显示在屏幕上的像素;

CPU 渲染阶段的一个重要输出是渲染图元,图元中包括 GPU 渲染需要用到的各种参数信息,例如点、线、面等几何信息;

GPU 渲染管线

GPU 渲染管线包含以下多个步骤:

  • 顶点处理
    • 顶点着色器:主要执行坐标转换,将顶点的坐标转换到齐次裁剪
    • 曲面细分着色器(可选)
    • 几何着色器(可选)
  • 图元装配
  • 光栅化
  • 片元着色器
  • 输出合并


渲染原理
https://ccw1078.github.io/2024/07/21/渲染原理/
作者
ccw
发布于
2024年7月21日
许可协议