模型空间,裁剪空间,世界空间
写shader的时候经常碰到模型空间坐标转裁剪空间坐标,裁剪空间坐标转世界空间坐标的需求.
模型空间
模型空间也被称为对象空间和局部空间.简单地可以理解为建模的时候规定好的一系列坐标.
世界空间
在unity中,如果一个gameObject没有父物体,则它的transform.position就是世界空间的坐标.
如果有父物体,则它的transform.position是父物体模型空间下的坐标,而不是世界空间的位置.
观察空间
观察空间也被称作摄像机空间
与模型和世界空间不同的是,观察的空间的+z轴指向摄像机的后方,摄像机的前方是-z轴.
加入当前camera相对于原点的坐标为transform.position.xyz,那么相当于在世界空间内平移了(+8.25,+0.62,-10)
要找到世界空间到观察空间的矩阵时,相当于将这个平移做的逆变换,即(-8.25,-0.62,+10),如果有旋转情况,则矩阵 M(世界空间到观察空间) =[旋转矩阵][平移矩阵].
观察空间的是右手坐标系,所以矩阵Z方向需要取反
裁剪空间
裁剪过程中,位于空间内的图元被保留,位于空间外的图元被剔除.裁剪的过程遵循正交投影和透视投影矩阵运算.
顶点从观察空间到裁剪空间的矩阵叫裁剪矩阵.
屏幕空间
将裁剪空间坐标投影到屏幕空间坐标,使用齐次除法.
其他
在unity shader中,坐标从模型->世界->观察->裁剪这一步其实是封装好了的,
struct v2f{
//用于在顶点和片元着色器之间传递信息
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(a2v v){
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
return o;
}
SV_POSITION告诉unity,pos冒号右边的数据就是顶点在裁剪空间的位置信息.