Unity3d 內(nèi)置世界變量
// The following built-in uniforms (except _LightColor0)
// are also defined in "UnityCG.cginc",
// i.e. one could #include "UnityCG.cginc"
uniform float4 _Time, _SinTime, _CosTime; // time values
uniform float4 _ProjectionParams;
// x = 1 or -1 (-1 if projection is flipped)
// y = near plane; z = far plane; w = 1/far plane
uniform float4 _ScreenParams;
// x = width; y = height; z = 1 + 1/width; w = 1 + 1/height
uniform float4 unity_Scale; // w = 1/scale; see _World2Object
uniform float3 _WorldSpaceCameraPos;
uniform float4x4 _Object2World; // model matrix
uniform float4x4 _World2Object; // inverse model matrix
// (all but the bottom-right element have to be scaled
// with unity_Scale.w if scaling is important)
uniform float4 _LightPositionRange; // xyz = pos, w = 1/range
uniform float4 _WorldSpaceLightPos0;
// position or direction of light source
uniform float4 _LightColor0; // color of light source
表面著色器的標(biāo)準(zhǔn)輸出結(jié)構(gòu)(Surface Output)
struct SurfaceOutput
{
half3 Albedo; //反射率,也就是紋理顏色值(r,g,b)
half3 Normal; //法線(xiàn)厚宰,法向量(x, y, z)
half3 Emission; //自發(fā)光顏色值(r, g,b)
half Specular; //鏡面反射度
half Gloss; //光澤度
half Alpha; //透明度
};
表面著色器輸入結(jié)構(gòu)(Input Structure)
float3 viewDir - 視圖方向( view direction)值培遵。為了計(jì)算視差效果(Parallax effects)法严,邊緣光照(rim lighting)等,需要包含視圖方向( view direction)值。
float4 with COLOR semantic -每個(gè)頂點(diǎn)(per-vertex)顏色的插值辜膝。
float4 screenPos - 屏幕空間中的位置。 為了反射效果漾肮,需要包含屏幕空間中的位置信息厂抖。比如在Dark Unity中所使用的 WetStreet著色器。
float3 worldPos - 世界空間中的位置初橘。
float3 worldRefl - 世界空間中的反射向量验游。如果表面著色器(surface shader)不寫(xiě)入法線(xiàn)(o.Normal)參數(shù)充岛,將包含這個(gè)參數(shù)。 請(qǐng)參考這個(gè)例子:Reflect-Diffuse 著色器耕蝉。
float3 worldNormal - 世界空間中的法線(xiàn)向量(normal vector)崔梗。如果表面著色器(surface shader)不寫(xiě)入法線(xiàn)(o.Normal)參數(shù),將包含這個(gè)參數(shù)垒在。
float3 worldRefl; INTERNAL_DATA - 世界空間中的反射向量蒜魄。如果表面著色器(surface shader)不寫(xiě)入法線(xiàn)(o.Normal)參數(shù),將包含這個(gè)參數(shù)场躯。為了獲得基于每個(gè)頂點(diǎn)法線(xiàn)貼圖( per-pixel normal map)的反射向量(reflection vector)需要使用世界反射向量(WorldReflectionVector (IN, o.Normal))谈为。請(qǐng)參考這個(gè)例子: Reflect-Bumped著色器。
float3 worldNormal; INTERNAL_DATA -世界空間中的法線(xiàn)向量(normal vector)踢关。如果表面著色器(surface shader)不寫(xiě)入法線(xiàn)(o.Normal)參數(shù)伞鲫,將包含這個(gè)參數(shù)。為了獲得基于每個(gè)頂點(diǎn)法線(xiàn)貼圖( per-pixel normal map)的法線(xiàn)向量(normal vector)需要使用世界法線(xiàn)向量(WorldNormalVector (IN, o.Normal))签舞。
saturate( )函數(shù)
saturate的字面解釋是浸濕秕脓,浸透。其作用其實(shí)也就是將取值轉(zhuǎn)化為[0,1]之內(nèi)的一個(gè)值儒搭。
輸入結(jié)構(gòu)
struct Input
{
//主紋理的uv值 _MainTex聲明的變量前面加uv 表示取變量uv值
float2 uv_MainTex;
//凹凸紋理的uv值
float2 uv_BumpMap;
};
//變量聲明
sampler2D _MainTex;//主紋理
sampler2D _BumpMap;//凹凸紋理
自定義光照模型
//【1】光照模式聲明:使用自定義的光照模式
#pragma surface surf SimpleSpecular
//【2】實(shí)現(xiàn)自定義的光照模式SimpleSpecular
half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
{
half3 h = normalize (lightDir + viewDir);
half diff = max (0, dot (s.Normal, lightDir));
float nh = max (0, dot (s.Normal, h));
float spec = pow (nh, 48.0);
half4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);
c.a = s.Alpha;
return c;
}
unity3d shader 常用的混合操作
Blend SrcAlpha OneMinusSrcAlpha // Alpha混合
Blend One One // 相加
Blend One OneMinusDstColor // 比較柔和的相加(SoftAdditive)
Blend DstColor Zero // 乘法
Blend DstColor SrcColor // 2倍乘法