1.Unity3d shader分为三种基本类型
1.固定功能着色器(FixedFunction Shader)
2.表面着色器(SurfaceShader)
3.顶点着色器&片段着色器(Vertex Shader & Fragment Shader)
1.固定功能着色器
即固定管线着色.为了方便开发者使用,将底层包装。开发者可以在短时间内上手。
固定功能着色是为了兼容老式显卡的固定渲染管线。
固定渲染管线就是可配置(configurable)的管线,固定管线已经定下来渲染步骤和每个步骤的里面都有哪些参数。
其核心是Material属性块,Lighting的开启和关闭,SepareteSpecular(独立镜面反射)的开启和关闭,SetTexture设置纹理和纹理混合操作
SetTexture[_MainTex]
{
ConstantColor (1,1,1,1) //ConstantColor color 固定色
Combine texture * primary DOUBLE, texture * primary //Combine 合并
//matrix [MatrixPropertyName] 矩阵操作
}
2.表面着色器
Unity包装之后的
可认为是一个光照Shader语法块、一个光照VS/FS的生成器
在SubShader块中写cg,即出现CGPROGRAM和ENDCG块。不出现在Pass里。因为SurfaceShader自己会编译成多个Pass.
编译指令:
#pragma surface surfaceFunction lightMode[optionalparams]
- surfaceFunction,形如void surf(Input IN,inout SurfaceOutput o),IN为自己定义的输入结构,SurfaceOutput定义为:
struct SurfaceOutput { half3 Albedo; // 纹理颜色值(r, g, b) half3 Normal; // 法向量(x, y, z) half3 Emission; // 自发光颜色值(r, g, b) half Specular; // 镜面反射度 half Gloss; // 光泽度 half Alpha; // Alpha不透明度 };
-
lightMode:使用光照模式。eg.Lambert(漫反射),BlinnPhone(镜面反射)。也可以自定义光照模型,定义形如half4 lightingCustomLightModeName<_PrePass>( SurfaceOutput s, half3 lightDir,< half3 viewDir,> half atten)
3.可编程的顶点着色器和片段着色器
特点为:
- 功能最强大,最自由的形态
- 在Pass中写cg,即在Pass中出现CGPROGRAM和ENDCG块
- 编译指令#pragma.官网Cg snimmpts
最常见
#pragma vertex funcName
#pragma fragment funcName