Unity Shader 入门精要
2. 渲染管线
应用阶段
- 把数据(顶点的位悝信息、 法线方向、 顶点颜色、 纹理坐标)加载到显存中。
- 设置渲染状态(使用哪个顶点着色器/片元着色器、 光源属性、材质等)。
- 调用 Draw Call(一个渲染命令来告诉GPU开始渲染)
几何阶段
- 光栅化阶段
- 逐片元操作(片元并不是真正意义上的像素 而是包含了很多状态的集合 包括屏幕坐标 深度信息,以及其他从几何阶段输出的顶点信息 例如法线、纹理坐标等)
双重缓冲
对场景的渲染是在幕后发生的后置缓冲中。 一旦场景已经被渲染到了后置缓冲中, GPU 就会交换后置缓冲区和前置缓冲,前置缓冲区是之前显示在屏幕上的图像。保证看到的图像总是连续的OpenGL/DirectX
图像应用编程接口
应用程序运行在 CPU 上通过调用 OpenGL DirectX 的图形接口将渲染所需的数据,如顶点数据、纹理数据、材质参数等数据存储在显存中的特定区域 随后,开发者可以通过图像编程接口发出渲染命令(Draw Call), 它们将会被显卡驱动翻译成 GPU 够理解的代码,进行真正的绘制。
命令缓冲区
包含命令队列 CPU 向其中添加命令 而由 GPU 从中读取命令,添加和读取的过程是互相独立的 命令缓冲区使得 CPU GPU 可以相互独立工作批处理
GPU渲染速度往往快于 CPU 提交命令的速度 Draw Call 的数量太多, CPU 就会把大量时间花费在提交 Draw Call 上,造成 CPU 的过载
把很多小的 DrawCall 合并成一个大DrawCall 更加适合于那些静态的物体 只需要合并一次即可 动态物体每一帧都需要重新进行合并然后再发送给 GPU
使用批处理合并的网格将会使用同一种渲染状态减少DrawCall开销:
避免使用大量很小的网格
避免使用过多的材质Shader
GPU 流水线上一些可高度编程的阶段 可以控制流水线中的渲染细节
4.数学基础
矩阵变换顺序 缩放旋转平移
模型变换 将顶点坐标从模型空间变换到世界空间中
法线变换 逆转置矩阵
7.纹理
模型空间的法线纹理
更加直观 记录的是绝对法线信息
可以提供平滑的边界切线空间的法线纹理
自由度很高 相对法线信息 可以重用法线纹理
可进行 UV 动画
可压缩 仅存储XY 方向,而推导得到Z方向计算光照模型
- 在切线空间下进行光照计算,把光照方向、视角方向变换到切线空间下;
- 在世界空间下进行光照计算,把采样得到的法线方向变换到世界空间下,
8.透明
- 先渲染所有不透明物体,并开启它们的深度测试和深度写入 可从近到远渲染(优化)
- 再渲染全透明物, 使用透明度测试
- 把半透明物体按它们距离摄像机的远近进行排序,然后按照从后往前的顺序渲染这些半透明物体,并开启它们的深度测试,但关闭深度写入。
- 循环覆盖分割网格解决
关闭背面剔除
两个pass