refract(I, N, eta) 根据入射光线方向I,表面法向量N和折射相对系数eta,计算折射向量。如果对给定的eta,I和N之间的角度太大,返回(0,0,0)。只对三元向量有效。
appdata_full
顶点着色器输入,包含位置、法线、切线、顶点颜色和两个纹理坐标。
2 3 4 5 6 7 8 9 10 11 | struct appdata_full { float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; float4 texcoord1 : TEXCOORD1; float4 texcoord2 : TEXCOORD2; float4 texcoord3 : TEXCOORD3; fixed4 color : COLOR; UNITY_VERTEX_INPUT_INSTANCE_ID }; |
appdata_base
顶点着色器输入,包含位置、法线和一个纹理坐标。
2 3 4 5 6 | struct appdata_base { float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; |
appdata_tan
顶点着色器输入,包含位置、法线、切线和一个纹理坐标。
1 2 3 4 5 6 7 8 9 10 11 | struct appdata_full { float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; float4 texcoord1 : TEXCOORD1; float4 texcoord2 : TEXCOORD2; float4 texcoord3 : TEXCOORD3; fixed4 color : COLOR; UNITY_VERTEX_INPUT_INSTANCE_ID }; |
float3 WorldSpaceViewDir(float4 v)
输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
inline float3 WorldSpaceViewDir( in float4 localPos )
{
float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz;
return UnityWorldSpaceViewDir(worldPos);
}
float3 UnityWorldSpaceViewDir(float4 v)
输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
inline float3 UnityWorldSpaceViewDir( in float3 worldPos )
{
return _WorldSpaceCameraPos.xyz - worldPos;
}
float3 ObjSpaceViewDir(float4 v)
输入一个模型空间中的顶点位置,返回模型空间中从该店到摄像机的观察方向
inline float3 ObjSpaceViewDir( in float4 v )
{
float3 objSpaceCameraPos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos.xyz, 1)).xyz;
return objSpaceCameraPos - v.xyz;
}
光源方向
仅当使用前向渲染(ForwardBase 或 ForwardAdd 通道类型)时,这些函数才有用
float3 WorldSpaceLightDir(float4 v)
输入一个模型空间中的顶点位置,返回世界空间中从这个点到平行光源的方向
inline float3 WorldSpaceLightDir( in float4 localPos )
{
float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz;
return UnityWorldSpaceLightDir(worldPos);
}
float3 UnityWorldSpaceLightDir(float3 v)
输入一个世界空间中的顶点位置,返回世界空间中从这个点到平行光源的方向
inline float3 UnityWorldSpaceLightDir( in float3 worldPos )
{
#ifndef USING_LIGHT_MULTI_COMPILE
return _WorldSpaceLightPos0.xyz - worldPos * _WorldSpaceLightPos0.w;
#else
#ifndef USING_DIRECTIONAL_LIGHT
return _WorldSpaceLightPos0.xyz - worldPos;
#else
return _WorldSpaceLightPos0.xyz;
#endif
#endif
}
float3 ObjSpaceLightDir(float4 v)
输入一个模型空间中的顶点位置,返回模型空间中从这个点到平行光源的方向
inline float3 ObjSpaceLightDir( in float4 v )
{
float3 objSpaceLightPos = mul(unity_WorldToObject, _WorldSpaceLightPos0).xyz;
#ifndef USING_LIGHT_MULTI_COMPILE
return objSpaceLightPos.xyz - v.xyz * _WorldSpaceLightPos0.w;
#else
#ifndef USING_DIRECTIONAL_LIGHT
return objSpaceLightPos.xyz - v.xyz;
#else
return objSpaceLightPos.xyz;
#endif
#endif
}
方向转换
float3 UnityObjectToWorldNormal(float3 norm)
把法线方向,从模型空间转为世界空间
inline float3 UnityObjectToWorldNormal( in float3 norm )
{
#ifdef UNITY_ASSUME_UNIFORM_SCALING
return UnityObjectToWorldDir(norm);
#else
// mul(IT_M, norm) => mul(norm, I_M) => {dot(norm, I_M.col0), dot(norm, I_M.col1), dot(norm, I_M.col2)}
return normalize(mul(norm, (float3x3)unity_WorldToObject));
#endif
}
float3 UnityObjectToWorldDir(float3 dir)
把方向从模型空间,转为世界空间
inline float3 UnityObjectToWorldDir( in float3 dir )
{
return normalize(mul((float3x3)unity_ObjectToWorld, dir));
}
float3 UnityWorldToObjectDir(float3 dir)
把方向从世界空间,转为模型空间
inline float3 UnityWorldToObjectDir( in float3 dir )
{
return normalize(mul((float3x3)unity_WorldToObject, dir));
}