表面着色器包括四个函数
- 顶点变换函数
- 表面着色函数
- 光照模型
- 最终颜色修改函数
表面着色器最终会被编译成一个复杂的顶点着色程序
- #pragma surface 入口函数名称 光照模型(Options)
- surface后面跟表面着色器的入口函数,surf(Input IN,inOut SurfaceOutput o)
- 光照模型
- 系统内置Lambert(漫反射光照),BlinnPhong(高光光照)
- 自定义光照:名字为Name
- harf4 Lighting<Name>(SurfaceOutput s,harf3 lightDir,harf atten)
- harf4 Lighting<Name>(SurfaceOutput s,harf3 lightDir,harf3 viewDir,harf atten)
- harf4 Lighting<Name>(SurfaceOutput s,harf3 light)
可选参数:
vertex:name vertex入口函数
void<Name>(inout appdata_full v)只需该顶点着色器中的输入顶点数据
harf4<Name>(inout appdata_full v,out input o)修改输入顶点数据,以及为表面着色器传递数据
finalcolor:name最终颜色修改函数
void<Name>(Input IN,SurfaeOutput o,inout fixed color)
其他可选参数
- alpha:Alpha混合模式,用户半透明着色器
- alphatest:varirableName Alpha测试模式,用户透明镂空着色器
- exclude_path:prepress使用指定的渲染路径
- addshadow:添加阴影投射器和集合通道
- dualforward:将双重光照贴图用于正向渲染路径中
- fullforwardshadow:在正向渲染路径中支持的所有阴影类型
- decal:add:附加印花着色器
- decal:blend:附加半透明印花着色器
- softvegetation:使用表面着色器,仅在Soft Vegetation开启时渲染
- noambient:不使用任何光照
- novertexlights:在正向渲染中不使用球面调和光照或逐点光照
- nolightmap:在这个着色器上禁用光照贴图
- nodirlightmap:在这个着色器上禁用方向光照贴图
- noforwardadd:禁用正向渲染添加通道
- approxview:对于有需要的着色器,逐顶点而不是逐像素计算规范化视线方向
- halfasview:将半方向传递到光照函数中
Input结构附加数据
Input:包含着色器所需要的纹理坐标,使用:uv+纹理名字,如果有第二张纹理,就使用uv2+纹理名字
附加数据:
- float3 viewDir:视图方向
- float4 color:每个定点的颜色插值
- float4 screenPos:屏幕坐标
- float3 worldPos:世界坐标
- float3 worldRefl:世界坐标中的反射向量
- float3 worldNormal:世界坐标中的法线
- float3 worldRefl;INTERNAL_DATA:世界坐标反射向量,但必须表面着色器写入o.Noraml参数
- float3 worldNormal;INTERNAL_DATA:世界坐标法线向量,但必须表面着色器写入o.Normal参数
shader——表面着色器
原文:https://www.cnblogs.com/joemono/p/13631618.html