表面着色器
- 表面着色器包括4个函数:
- (1)顶点变换函数;
- (2)表面着色函数;
- (3)光照模型;
- (4)最终颜色修改函数;
- 表面着色器最终会被编译为一个复杂的顶点着色程序;
定义入口函数
#pragma surface
入口函数名称光照模型[Options]- suface 后面跟表面着色的入口函数 surf (lnput IN,inout SurfaceOutput o);
- 光照模型:
- (1)系统内置Lambert(漫反射光照)BlinnPhong(高光光照)
- (2)自定义光照:名字为Name
- half4 Lighting
(SurfaceOutput s,half3 lightDir,half atten); - half4 Lighting
(SurfaceOutput s,half3 lightDir,half3 viewDir,half atten); - half4 Lighting
(SurfaceOutput s,half4 light);
可选参数
- vertexname vertex入口函数:
- void
(finout appdata_full v)只需改顶点着色器中的输入顶点数据; - half4
(inout appdata_full v,out Input o)修改输入顶点数据,以及为表面着色器传递数据;
- finalcolor:name 最终颜色修改函数:
- void
(nput IN,SurfaceOutput o,inout fixed4 color);
其它可选参数
- alpha:Alpha 混合模式,用户半透明着色器。
- alphatest:varirableName Alpha测试模式,用户透明镂空着色器。
- exclude_path:prepass 使用指定的渲染路径;
- addshadow:添加阴影投射器和集合通道;
- dualforward:将双重光照贴图用于正向道染路径中;
- fullforwardshadows在正想渲染路径中支持的所有的阴影类型;
- decal:add 附加印花著色器;
- decal:blend 附加半透明印花着色器;
- softvegetation 使用表面着色器,仅在Soft Vegetation 开启时被演染;
- noambient不使用任何光照
- novertexdights在正向道染中不适用球面调和光照或逐点光照;
- nolightmap在这个着色器上禁用光照贴图;
- nodirlightmap在这个着色器上禁用方向光照贴图;
- noforwardadd 禁用正向道染添加通道;
- approxview.对于有需要的着色器,逐顶点而不是逐像素计算规范化视线方向。
- halfasview.将半方向传递到光照函数中。
Input 结构附加数据
Input:包含着色器所需要的纹理坐标 uv 纹理名字;使用第二张纹理是uw2纹理名字;
附加数据:
- float3 viewDir 视图方向。
- float4 color 每个定点的颜色插值
- float4 screenPos屏幕空间中的位置。
- float3 worldPos 世界坐标空间;
- float3 worldRef1世界空间中的反射向量:
- float3 worldNormal世界空间中的法线向量;
- float3 worldRef1;INTERNAL DATA 世界坐标反射向量,但必须表面着色写入o.Normal参数;
- float3 worldNormal;INTERNAL_DATA 世界坐标法线向量,但必须表面着色写入o.Normal参数;
SurfaceOutput 结构体
SurfaceOutput:
- half3Albedo:漫反射的颜色值:I
- half3 Nomal:法线坐标标
- half3 Emission;自发光颜色;
- half Specular;镜面反射系数;
- half Gloss;光泽系数:
- half Alpha;透明度系数;SurfaceOutputStandard:
- half Smoothness;/∥0-粗糙,1-光滑
- half Metallic;//0-非金属,1-金属
1 | SurfaceOutputStandardSpecular: |