UnityCG.cginc 常用数据结构体
输入
appdata_base
顶点着色器输入,包含位置、法线和一个纹理坐标。
1 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 |
struct appdata_tan { float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; |
appdata_full
顶点着色器输入,包含位置、法线、切线、顶点颜色和两个纹理坐标。
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 }; |
appdata_img
顶点着色器输入,包含位置和一个纹理坐标。
1 2 3 4 5 6 |
struct appdata_img { float4 vertex : POSITION; half2 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; |
输出
v2f_img
可用于顶点着色器的输出,包含裁剪空间中的位置,纹理坐标
1 2 3 4 5 6 7 |
struct v2f_img { float4 pos : SV_POSITION; half2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO }; |
UnityCG.cginc 常用函数
摄像机方向(视角方向)
float3 WorldSpaceViewDir(float4 v)
输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
1 2 3 4 5 6 7 |
// Computes world space view direction, from object space position // *Legacy* Please use UnityWorldSpaceViewDir instead inline float3 WorldSpaceViewDir( in float4 localPos ) { float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz; return UnityWorldSpaceViewDir(worldPos); } |
float3 UnityWorldSpaceViewDir(float4 v)
输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
1 2 3 4 5 |
// Computes world space view direction, from object space position inline float3 UnityWorldSpaceViewDir( in float3 worldPos ) { return _WorldSpaceCameraPos.xyz - worldPos; } |
float3 ObjSpaceViewDir(float4 v)
输入一个模型空间中的顶点位置,返回模型空间中从该店到摄像机的观察方向
1 2 3 4 5 6 |
// Computes object space view direction 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)
输入一个模型空间中的顶点位置,返回世界空间中从这个点到平行光源的方向
1 2 3 4 5 6 7 |
// Computes world space light direction, from object space position // *Legacy* Please use UnityWorldSpaceLightDir instead inline float3 WorldSpaceLightDir( in float4 localPos ) { float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz; return UnityWorldSpaceLightDir(worldPos); } |
float3 UnityWorldSpaceLightDir(float3 v)
输入一个世界空间中的顶点位置,返回世界空间中从这个点到平行光源的方向
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Computes world space light direction, from world space position 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)
输入一个模型空间中的顶点位置,返回模型空间中从这个点到平行光源的方向
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Computes object space light direction 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)
把法线方向,从模型空间转为世界空间
1 2 3 4 5 6 7 8 9 10 |
// Transforms normal from object to world space 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)
把方向从模型空间,转为世界空间
1 2 3 4 5 |
// Transforms direction from object to world space inline float3 UnityObjectToWorldDir( in float3 dir ) { return normalize(mul((float3x3)unity_ObjectToWorld, dir)); } |
float3 UnityWorldToObjectDir(float3 dir)
把方向从世界空间,转为模型空间
1 2 3 4 5 |
// Transforms direction from world to object space inline float3 UnityWorldToObjectDir( in float3 dir ) { return normalize(mul((float3x3)unity_WorldToObject, dir)); } |
- 本文固定链接: http://www.u3d8.com/?p=2631
- 转载请注明: 网虫虫 在 u3d8.com 发表过