GPU流水线
- CPU将数据(纹理、网格等)从硬盘加载到内存,然后再从内存加载到显存,因为显卡对于显存的访问速度更快,而且大多数显卡对于内存没有直接的访问权限
-
准备好之后,CPU调用DrawCall渲染命令开始进行GPU流水线渲染
- 几何阶段:
- 顶点着色器:完全可编程,顶点空间变换、着色、逐顶点光照
- 曲面细分着色器:可选着色器,细分图元
- 几何着色器:可选着色器,逐图元着色
- 裁剪:可配置,自定义裁剪区域、控制裁剪正面还是背面等,不在摄像机视野范围内不需要处理
- 屏幕映射:不可,把图元坐标转换到屏幕坐标系,对于OpenGL和DirectX对应的坐标系就不相同了
- 光栅化阶段:
- 三角形设置:绘制出三角形三条边
- 三角形遍历:三角形图形
- 片元着色器:完全可编程,逐片元着色
- 逐片元操作:可配置,修改颜色,深度缓冲,混合等
Unity Shader
- 四种模版
- Standard Surface Shader:包含标准光照模型 表面着色器
- Unlit Shader:不包含光照(包含烟雾)顶点片元着色器
- Image Effect Shader:处理屏幕后处理效果
- Compute Shader:…(少用)
语法
-
Properties
类型 语法 例子 Int n _Int(“Int”,Int)=2 Float n _Float(“Float”,Float)=1.5 Range(min,max) n _Range(“Range”,Range(0.0,5.5))=3.0 Color (n,n,n,n) _Color(“Color”,Color)=(1,1,1,1) Vector (n,n,n,n) _Vector(“Vector”,Vector)=(2,3,4,5) 2D “defaulttexture”{} _2D(“2D”,2D)=“”{} Cube “defaulttexture”{} _Cube(“Cube”,Cube)=“white”{} 3D “defaulttexture”{} _3D(“3D”,3D)=“black”{} -
SubShader
每个UnityShader可包含多个SubShader语义块,不支持就Fallback。
每个Pass都是一次完整的渲染流程,但是过多的Pass会造成渲染性能下降
状态和标签同样可以在Pass中设置,但是SubShader中一些标签设置是特定的,和在Pass中使用不一样,SubShader的设置会作用于所有Pass
SubShader{ [Tags] [RenderSetup] Pass{ } //other Passes }
-
状态设置:
状态指令可以设置显卡的各种状态,例如是否开启混合,深度测试等