|
之前做一些效果的时候,被空间转换耽误了一些时间,在几个空间来回转换,确实比较容易晕。于是花了点时间,把各种转换都整理到一起了,下次再做类似需要各种转换空间的,就可以直接查表了,希望这样可以节约一点时间。大部分转换也都可以在Unity的UnityShaderVariables.cginc里查到对应关系,这里主要是分组列在一起方便查看。
从模型空间转换到裁剪空间
1. UNITY_MATRIX_MVP //当前的模型*观察*投影矩阵,
//用于将顶点方向矢量从模型空间转换到裁剪空间
2. UnityObjectToClipPos 推荐用这个,优化
o.pos = UnityObjectToClipPos(float4(Pos));
3. unity_MatrixMVP
float4x4 unity_MatrixMVP = mul(unity_MatrixVP, unity_ObjectToWorld);
从裁剪(屏幕)空间变换到相机空间
unity_CameraInvProjection(注意:这个是把世界空间当作了右手空间来使用)
从相机(View)空间变换到世界空间
1. unity_MatrixInvV
2. UNITY_MATRIX_I_V
float4 vertexworld = mul(UNITY_MATRIX_I_V, viewVertex);
3. unity_CameraToWorld(注意:这个是把世界空间当作了右手空间来使用)
viewVertex.z*=-1;
float3 worldPos = mul(unity_CameraToWorld, float4(viewVertex, 1)).xyz;
参考:https://blog.csdn.net/qq_35817700/article/details/94863234)
从模型空间转换到观察空间
1. UNITY_MATRIX_MV //当前的模型*观察矩阵,用于将顶点/方向矢量从模型空间转换到观察空间
2. unity_MatrixMV
unity_MatrixMV = mul(unity_MatrixV, unity_ObjectToWorld);
3. UNITY_MATRIX_T_MV //UNITY_MATRIX_MV的转置矩阵
4. unity_MatrixTMV
float4x4 unity_MatrixTMV = transpose(unity_MatrixMV);
从模型空间转换到观察空间(法线)
1. UNITY_MATRIX_IT_MV //UNITY_MATRIX_MV的逆转置矩阵,
//用于将法线从模型空间转换到观察空间,
//也可以用于得到UNITY_MATRIX_MV的逆矩阵
normal = mul((float3x3)UNITY_MATRIX_IT_MV,vNomral)
2. unity_MatrixITMV
float4x4 unity_MatrixITMV = transpose(mul(unity_WorldToObject, unity_MatrixInvV));
从世界空间转换到观察空间
1. UNITY_MATRIX_V //当前的观察矩阵,用于将顶点/方向矢量从世界空间转换到观察空间
2. unity_MatrixV
3. unity_WorldToCamera(注意:这个是把世界空间当作了右手空间来使用)
从观察空间转换到裁剪空间
1. UNITY_MATRIX_P //当前的投影矩阵,用于将顶点/方向矢量从观察空间转换到裁剪空间
2. glstate_matrix_projection
3. unity_CameraProjection(注意:这个是把世界空间当作了右手空间来使用)
从世界空间转换到裁剪空间
1. UNITY_MATRIX_VP //当前的观察*投影矩阵,用于将顶点/方向矢量从世界空间转换到裁剪空间
2. unity_MatrixVP
从模型空间变换到世界空间
1. unity_ObjectToWorld(_Object2World) //当前的模型矩阵,
//用于将顶点方向矢量从模型空间变换到世界空间
2. UNITY_MATRIX_M
从模型空间变换到世界空间(法线)
1. UnityObjectToWorldNormal();
o.normal = normalize(UnityObjectToWorldNormal(vNomral));
2. o.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject);
从模型空间变换到世界空间(方向向量)
UnityObjectToWorldDir(float3 dir)
从世界空间转换到模型空间
unity_WorldToObject(_World2Object) //用于将顶点/方向矢量从世界空间转换到模型空间
从世界空间转换到模型空间(方向向量)
UnityWorldToObjectDir(float3 dir)
为什么法线(方向向量)的转换是特殊的
因为一般的顶点变换不像法线是向量,有方向,如果三角面不等比拉伸,法线方向就会倾斜,不再垂直于表面,所以要特殊处理。
参考:http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/
参考:
https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/CGIncludes/UnityShaderVariables.cginc
https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|