模型空间,裁剪空间,世界空间

写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冒号右边的数据就是顶点在裁剪空间的位置信息.

posted @ 2022-01-05 13:15  melt00  阅读(1496)  评论(0编辑  收藏  举报