unity之shader入门
1 渲染流水线
渲染流水线分为三个阶段,分别是应用阶段,几何阶段,光栅化阶段。
1.1 应用阶段:CPU实现,输出渲染图元。
数据加载到显存中:显卡对显存(VRAM)的访问速度比对内存(RAM)要快,并且大多数显卡对RAM没有访问权限。
设置渲染状态:定义场景中的网格是怎样被渲染的。
调用DrawCall:CPU通过调用DrawCall告诉CPU开始一个渲染过程,一个DrawCall会指向本次渲染图元列表
1.2 几何结算:GPU实现,输出屏幕空间的二位点坐标,深度,着色信息,传送给光栅化阶段。
顶点着色器:对输入的每个顶点都会调用一次顶点着色器,而且无法得到顶点与顶点之间的关系。顶点着色器的主要功能是坐标变换,把顶点坐标从模型空间转换到齐次裁剪空间。再由硬件进行透视除法,最终得到归一化的设备坐标。
裁剪:裁剪删除不在摄像机范围内的顶点。
屏幕映射:将x和y转到屏幕坐标系,z坐标无作为,但会被一起传进光栅化后发挥作用。
1.3 光栅化阶段:GPU实现,决定每个渲染图元哪些像素应该被绘制在屏幕上,将几何阶段传来的顶点数据进行插值。
三角形设置:计算光栅化一个三角网格所需的信息。
三角形遍历:检查每个像素是否被一个三角网格所覆盖,覆盖则赋予片元着色器。
片元着色器;对从顶点着色器来的数据进行插值数据完成很多渲染技术,最重要的一个是纹理采样。
逐片元操作;合并数据加操作,通过测试来决定每个片元的可见性。半透明物体必须开启混合操作。
2 shader入门
Shader(着色器)就是GPU执行的一段针对3D对象进行一系列操作的程序。
2.1 Unity中的Shader类型
Fixed function Shader :属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的回滚。 使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似。
Vertex and Fragment Shader:最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。
Surface Shader:Unity3d推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。 使用的也是CG/HLSL语法。
3 shader编写
简单的shader示例