Unity3d 內置世界變量
// 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
表面著色器的標準輸出結構(Surface Output)
struct SurfaceOutput
{
half3 Albedo; //反射率,也就是紋理顏色值(r,g,b)
half3 Normal; //法線,法向量(x, y, z)
half3 Emission; //自發(fā)光顏色值(r, g,b)
half Specular; //鏡面反射度
half Gloss; //光澤度
half Alpha; //透明度
};
表面著色器輸入結構(Input Structure)
float3 viewDir - 視圖方向( view direction)值。為了計算視差效果(Parallax effects),邊緣光照(rim lighting)等,需要包含視圖方向( view direction)值。
float4 with COLOR semantic -每個頂點(per-vertex)顏色的插值。
float4 screenPos - 屏幕空間中的位置。 為了反射效果,需要包含屏幕空間中的位置信息。比如在Dark Unity中所使用的 WetStreet著色器。
float3 worldPos - 世界空間中的位置。
float3 worldRefl - 世界空間中的反射向量。如果表面著色器(surface shader)不寫入法線(o.Normal)參數,將包含這個參數。 請參考這個例子:Reflect-Diffuse 著色器。
float3 worldNormal - 世界空間中的法線向量(normal vector)。如果表面著色器(surface shader)不寫入法線(o.Normal)參數,將包含這個參數。
float3 worldRefl; INTERNAL_DATA - 世界空間中的反射向量。如果表面著色器(surface shader)不寫入法線(o.Normal)參數,將包含這個參數。為了獲得基于每個頂點法線貼圖( per-pixel normal map)的反射向量(reflection vector)需要使用世界反射向量(WorldReflectionVector (IN, o.Normal))。請參考這個例子: Reflect-Bumped著色器。
float3 worldNormal; INTERNAL_DATA -世界空間中的法線向量(normal vector)。如果表面著色器(surface shader)不寫入法線(o.Normal)參數,將包含這個參數。為了獲得基于每個頂點法線貼圖( per-pixel normal map)的法線向量(normal vector)需要使用世界法線向量(WorldNormalVector (IN, o.Normal))。
saturate( )函數
saturate的字面解釋是浸濕,浸透。其作用其實也就是將取值轉化為[0,1]之內的一個值。
輸入結構
struct Input
{
//主紋理的uv值 _MainTex聲明的變量前面加uv 表示取變量uv值
float2 uv_MainTex;
//凹凸紋理的uv值
float2 uv_BumpMap;
};
//變量聲明
sampler2D _MainTex;//主紋理
sampler2D _BumpMap;//凹凸紋理
自定義光照模型
//【1】光照模式聲明:使用自定義的光照模式
#pragma surface surf SimpleSpecular
//【2】實現自定義的光照模式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倍乘法