参考书籍:UnityShader入门精要(冯乐乐著)
参考视频:Bilibili《Unity Shader 入门精要》
写在前面:前置知识需要一些计算机组成原理、线性代数、Unity的基础
这篇记录一些学历过程中的理解和笔记(更新中)
文章目录
- 一、 渲染流水线
- 📚️1.1 什么是流水线
- 📚️1.2 什么是渲染流水线
- 📚️1.3 CPU流水线
- 📚️1.4 GPU流水线
- 1.4.1 几何阶段
- 1.4.2 光栅化阶段
- 📚️1.5什么是Shader
- 二、Unity Shader基础
一、 渲染流水线
📚️1.1 什么是流水线
🚩 流水线其实就是并行和串行的区别,非流水线的串行工序只能完成一个目标后去制作下一个目标,而流水线工序使得每个工序都在同时工作,如图参考。
📚️1.2 什么是渲染流水线
🚩 将流水线运用于图像渲染中为渲染流水线,渲染流水线是一个概念流水线,实际的流水线需要配合硬件的操作,是便于理解和流水线功能划分而提出的。
渲染流水线的三个概念阶段:应用阶段、几何阶段、光栅化阶段
-
✔️ 应用阶段:
这个阶段由应用主导,通常由CPU负责实现。开发者可以进行大部分操作:准备场景数据(摄像机位置、模型摆放、光源摆放)、粗粒度剔除(剔除一些遮挡物而不递交给几何阶段,比如Unity中的遮挡剔除、视锥剔除、LOD选择、批处理就属于应用阶段)、设置渲染状态(设置材质、纹理、使用的Shader)。最终输出渲染图元传递给下一个阶段,图元可以是点、线、三角面等类型。 -
✔️ 几何阶段:
几何阶段通常在GPU上进行,负责每个图元的操作,通过输入图元进一步处理转换为屏幕空间的二维坐标,输出顶点信息传递给下一个阶段。简单来说就是操作图元、转换屏幕坐标、输出顶点信息,这一部分内容在后续GPU流水线部分详细展开。 -
✔️ 光栅化阶段
光栅化阶段在GPU上进行,通过输入的顶点信息最终产生屏幕像素,渲染输出最终图像。根据上个阶段的顶点信息决定图元中的哪些像素应该被绘制在屏幕上,后续GPU流水线部分详细展开。
参考部分:遮挡剔除、网格的细节级别 (LOD)、绘制调用批处理
补充部分:
图元:图元的类型是与渲染内容的几何描述相关,比如3D模型用三角面描述,UI边框和和线框渲染用线描述、粒子用点描述。
📚️1.3 CPU流水线
🚩 渲染流水线的起点是CPU,也就是应用阶段,共有三个阶段:把数据加载到显存中、设置渲染状态、调用 DrawCall。
- ✔️ 把数据加载到显存中:
因为显卡对显存的访问速度更快,并且显卡对于大部分RAM没有直接访问权力,所以要将渲染数据从硬盘加载到显存中。过程如下图,硬盘→ RAM系统内存 → 显存。
- ✔️ 设置渲染状态:
定义场景中的网格需要怎么样被渲染,比如使用的顶点着色器、片元着色器、光源、材质等。 - ✔️ 调用 DrawCall:
CPU像GPU发送渲染指令,命令指向一个需要被渲染的图元,GPU根据设置渲染状态输出到屏幕上(GPU流水线)。
📚️1.4 GPU流水线
🚩 GPU获得渲染命令后,进行一系列操作最终把图元渲染到屏幕上。
🚩 几何阶段进行:顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕映射。光栅化阶段进行:三角形设置、三角形遍历、片元着色器、逐片元操作。
1.4.1 几何阶段
🚩 有的同学容易将几何阶段和光栅化阶段中的内容混淆,其实和字面意思一样几何阶段就是还在三维时的操作,也就是将三维逐步转为二维的操作,光栅化阶段则处理的是怎么转换为像素,所以是将几何阶段的结果及二维的屏幕结果进行操作。
-
✔️ 顶点着色器:
顶点着色器用于处理顶点,每个顶点都会调用一次顶点着色器,顶点着色器需要完成坐标转换和顶点光照,如图所示。我们可以通过改变顶点坐标模拟水面、布料等就是通过顶点着色器,所以顶点着色器阶段是可编程的。
其中坐标转换是将顶点从模型空间转换到齐次裁剪空间
-
✔️ 裁剪:
图元和摄像机的关系有:完全在视野内、部分在视野内、完全在视野内
对于完全在视野内的图元直接传递给下一个流水线,对于完全在视野外的图元不继续向下传递,而部分在视野内的图元则需要进行裁剪(Clipping)处理,裁剪规则如图所示。
-
✔️ 屏幕映射:
在顶点光栅化时我们获得了齐次裁剪空间的坐标这时我们进一步转换到屏幕坐标系下,这时就与屏幕的分辨率有关系了,而z坐标信息会进一步传递到光栅化阶段做处理。
1.4.2 光栅化阶段
-
✔️ 三角形设置:
我们得到了三角形的顶点信息,但是不知道三角形的覆盖情况,进一步获得三角形的边界表达方式,计算三角形网格表示数据计算计算三角形设置。 -
✔️ 三角形遍历:
三角形遍历检查每个像素是否被三角形覆盖,如果覆盖的话就会生成片元,使用三角形的3个顶点对覆盖区域深度进行插值,最终输出片元序列,片元并不是像素,片元包含了很多信息用于计算像素的最终颜色。
-
✔️ 片元着色器:
片元着色器是一个重要的可编程着色器阶段,片元着色器主要是计算每个片元的最终颜色和其他属性
-
✔️ 逐片元操作:
对像素正在产生影响的阶段是逐片元操作,这一阶段会进行可见性测试,片元需要经过深度测试、模板测试等,如果片元通过了所有测试则需要与缓冲区的的颜色进行合并或者混合。
经过以上计算和测试模型图元显示到了屏幕上,为了避免看见正在光栅化的图元,GPU会使用双重缓冲策略,那么场景渲染则像是在幕后发生一样即后置缓冲,后置缓冲完成GPU交换前置缓冲中的内容,保证了我们看到的图片总是连续的。
📚️1.5什么是Shader
🚩 Shader就是渲染流水线的一部分,GPU上可高度编程的阶段,由着色器编译最终代码会在GPU上运行。
二、Unity Shader基础
这里不会过多的赘述Material材质、Shader在Unity中的使用步骤,具体可以参考文章开头的书籍和视频链接