unity5.6之后,对shader的坐标转换做了封装,通过引用 #include "Lighting.cginc" 则可以使用下面方法:
- 常用的坐标转换 UnityObjectToClipPos(v.vertex);
-
v2f vert(a2v v) { v2f o; float3 worldPos = UnityObjectToClipPos(v.vertex);//将模型的顶点转化为裁剪空间的世界顶点坐标 return o; }
- 另外上面的代码是通过封装得到的,如果看到unity5.6以前的shader代码,还会看到下面的坐标转换,功能作用如出一辙: mul(UNITY_MATRIX_MVP, v.vertex)
v2f vert(appdata v) { v2f o; float3 worldPos = mul(UNITY_MATRIX_MVP, v.vertex);//从模型的本地空间转化为投影空间坐标 return o; }
- 也可使用mul()内置函数转换
v2f vert(appdata v)
{
v2f o;
float3 worldPos = mul(UNITY_MATRIX_MVP, v.vertex);//从模型的本地空间转化为投影空间坐标
float3 worldPos = mul(_Object2World, v.vertex).xyz;//从模型的本地空间转化为世界空间矩阵
return o;
}
- 其他对应的封装函数
UNITY_MATRIX_VP -->UnityWorldToClipPos
UNITY_MATRIX_P -->UnityViewToClipPos
UNITY_MATRIX_MVP | 模型矩阵 * 相机矩阵 * 投影矩阵 |
UNITY_MATRIX_MV | 模型矩阵 * 相机矩阵 |
UNITY_MATRIX_V | 相机矩阵 |
UNITY_MATRIX_P | 投影矩阵 |
UNITY_MATRIX_T_MV | 模型到相机空间矩阵取转置 |
UNITY_MATRIX_IT_MV | 模型到相机空间矩阵取转置的逆 |
_Object2World | 物体到世界(模型矩阵) |
_World2Object | 世界到物体 |