引子
Surface Shader 和 Fragment Shader 差异性
常用的Shader分下面三类
- Fixed function shader —— 属于固定渲染管线Shader, 基本用于高级Shader在老显卡无法显示时的Fallback。
- Vertex and Fragment Shader —— 属于Unity常见Shder之一,可编程渲染管线.。
- Surface Shade —— 属于Unity常见Shader之一,使用Unity预制的光照模型来进行光照运算。
主要说明一下Vertex and Fragment Shader与Surface Shade的一些常见性质,对总搞不清这两种常见可编程Shader的童鞋们科普一下。
共性
1. 必须从唯一一个根Shader开始
2. 可以设置Properties参数部分,作用及语法完全相同
3. 具体功能都在SubShader里(Subshader: 子Shader,Shader会自上而下运行第一个硬件能支持的Subshader,主要作用是对不用硬件的支持。)
4. 都可以打标签,例如Tags { “RenderType” = “Opaque” } LOD100 等
5. 都可以设置Fallback,如“Fallback “Legacy Shaders/Transparent/VertexLit””
6. 都可以处理基本的功能,例如光照漫反射(Diffuse)以及镜面反射(Specular)。
差异性
1. Pass{} 代码段
Surface Shader,由于已经将具体内容打包在光照模型了,不能加pass{},加了会报错。
Vertex and Fragment Shader在Subshader下面还有Pass{}
2. 核心写法不一样
Vertex and Fragment Shader的核心是:
1 | CGPROGRAM |
Surface Shader的核心:
Surface Shader是Unity3d自带光照模型,也不做顶点处理,那么只需要一个表面处理函数surf即可
1 | CGPROGRAM |
输出结构不一样
Surface Shader 标准的几个输出结构
1. SurfaceOutput
1 | struct SurfaceOutput |
2. SurfaceOutputStandard
1 | struct SurfaceOutputStandard |
3. SurfaceOutputStandardSpecular
1 | struct SurfaceOutputStandardSpecular |
Surface Shader 可用的光照模型
更多
要学习光照模型,一定要有比较深的数学基础