表面着色器语法
在Unity所有着色器文件都写在一个声明称为ShaderLab语言”。在文件中,一个嵌套的括号语法声明各种事物描述着色器–例如的着色器性能应在材料检验证明;什么样的硬件特点做;什么样的混合模式的使用等;实际“着色器代码”就是写的CGPROGRAM片段在同一着色器文件(见表着色和顶点和片段着色器)。
这页和子页介绍了嵌套的括号“ShaderLab语法。的CGPROGRAM片断定期书面HLSL / CG着色语言,看到他们的文档的页面。
Shader是一个着色文件的根命令。每个文件必须定义一个(和唯一一个)。它指定了材质使用该着色器的对象是如何呈现的.。
语法:
Shader "name" { [Properties] Subshaders [Fallback] [CustomEditor] }
细节
Properties
着色器可以有一个属性列表。在着色器中声明的任何属性都显示在Unity内部的检视面板中。典型的属性是对象颜色,纹理,或者只是由着色器使用的任意值。
SubShaders & Fallback
着色器包含一系列的子着色器。你必须至少有一个。当加载一个着色器,Unity将通过着色器的列表,并选择第一个,是由最终用户的机器支持。如果没有子着色器的支持,Unity将尝试使用备用着色器。
不同的显卡有不同的功能。这为游戏开发者提出了一个永恒的问题:你希望你的游戏在最新的硬件上看起来很棒,但不希望它只对3%的人有用。这是着色器来。创建一个着色器,所有花哨的图形效果你可以梦想,然后增加老年卡多着色器。这些着色器可以实现你想要在一个缓慢的影响,或者他们可以选择不执行的一些细节。
着色器”层次细节(LOD)和“着色”替代“两种技术,也是建立在着色器,详情请参阅着色器LOD和着色器replacemement。
Examples
Here is one of the simplest shaders possible:
// colored vertex lighting
Shader "Simple colored lighting"
{
// a single color property
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
// define one subshader
SubShader
{
// a single pass in our subshader
Pass
{
// use fixed function per-vertex lighting
Material
{
Diffuse [_Color]
}
Lighting On
}
}
}
这个着色器定义颜色属性_color(显示在材料检验为主要颜色)用默认值(1,0.5,0.5,1)。然后一个单一的SubShader
定义。该着色器包含一个通过打开固定功能顶点照明和设置了它的基本材质。
表面着色器
#pragma surface <表面着色器函数名> <光照模型> [可选参数]
光照模型:
Lambert / Blinnphong
Lambert和BlinnPhong光照模型是不基于物理的(大部分在Unity4.x中),但是在低端设备上使用会更加快,性能更好。
可选参数:(:前后不加空格)
alpha 或者 alpha:auto: 将会为简单的光照函数挑出淡出透明度
(就像alpha:fade),并且为基于物理的光照函数预乘透明度(就像 alpha:premul)。
alpha:fade:使用传统的淡出透明。
alpha:premul:使用预乘alpha透明度。
alphatest : variableName:使用alpha裁剪透明度。剔除值是一个浮点型变量variableName,你可能也会想使用addshadow指令去生成适当的阴影接受通道(shadow caster pass)。
keepalpha:默认不透明(Opaque)选项,不管输出结构的Alpha或者光照函数的返回值都将表面着色器将Alpha通道值设置为1.0。使用这个选项允许保持光照函数的返回alpha值,即使使用的是不透明表面着色器。
decal:add: 额外的贴花着色器(例如,terrian AddPass),这意味着物体在其它表面之上使用additive blending。
decal:blend:半透明贴花着色器,这意味物体可以在其它物体表面使用alpha blending。
自定义函数可以被用来改变或计算来自顶点的数据,或者改变最后计算得出的片段颜色。
vertex:VertexFunction,用户自定义的顶点修改函数。这个函数会在生成的顶点着色器开始被调用,并且可以修改或计算每个顶点的数据。
举例: void vert(inout appdata_full v){}
void vert(inout appdata_full v, out Input o)
{
UNITY_INITIALIZE_OUTPUT(Input, o);
// ...
}
finalcolor:ColorFunction,自定义的最终颜色修改函数。
举例: void mycolor(Input IN, SurfaceOutput o, inout fixed4 o)
{
color *= _ColorTint;
}
其他可选参数:
addshadow --- 生成一给影子。常用于自定义顶点修改。
fullforwardshadows -- 支持渲染路径中的所有光影类型。默认情况下在前向渲染只支持一个平行光的阴影。如果你需要点光源阴影的渲染,可以使用这个指令。
标准表面着色器结构
struct SurfaceOutput
{
half3 Albedo; // 反射率,就是纹理颜色值(RGB)
half3 Normal; // 法线,法向量(xyz)
half3 Emission; // 自发光颜色值(RGB)
half Specular; // 镜面反射度
fixed Gloss; // 光泽度
fixed Alpha; // 透明度
};
Unity5中内置的Standard和StandardSpecular使用的结构
struct SurfaceOutputStandard // 金属workflow 物理属性
{
fixed3 Albedo;
fixed3 Normal;
fixed3 Emission;
half Metallic; // 0=non-metal, 1=metal,金属度
half Smoothness; // 0=rough, 1=smooth,光滑度
half Occlusion; // occlusion (default 1),遮挡率
half Alpha;
};
struct SurfaceOutputStandardSpecular // 高光workflow
{
fixed3 Albedo;
fixed3 Specular;
fixed3 Normal;
fixed3 Emission;
half Smoothness;
half Occlusion;
fixed Alpha;
};
输入结构体(必须要有,颜色或者纹理uv,在纹理的变量前加uv前缀,表示的是纹理坐标)
float3 viewDir,将含有视角方向,用于计算视差效果,边缘光照等。
float4 加上COLOR语意绑定**,将会包含差值的逐顶点颜色。
float4 screenPos,将包含屏幕空间位置,用于反射后屏幕空间效果。
float3 worldPos,包含世界空间位置信息。
float3 worldRef1,如果表面着色器没有写给o.Normal,将包含世界反射向量。
float3 worldNormal,如果表面着色器没有写给o.Normal,将包含世界法向量。
float3 worldRef1;INTERNAL_DATA,如果表面着色器没有写给o.Normal,将包含世界反射向量。使用WorldReflectionVector (IN, o.Normal)基于逐顶点法线贴图获取反射向量。
float3 worldNomal;INTERANT_DATA,如果表面着色器没有写给o.Normal,使用WorldReflectionVector (IN, o.Normal)基于逐顶点法线贴图获取法线向量。
自定义光照模型
1、half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten)
用于前向渲染光照模式,不依赖取景方向
2、half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
用于前向渲染光照模式,不依赖取景方向
3、half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light)
用于延迟渲染光照模式
🔚