各种空间
裁剪空间的坐标原点在体的 “中心”, 而不是近剪裁平面
屏幕空间之前的变换矩阵
在Shader内, 可以访问一些已经算好的矩阵( 根据 Camera 组件的参数等 ,计算出的)也可以访问当前正在渲染的相机的参数信息, 这些参数对应了 Camera组件 上的属性值
屏幕(或视口)空间坐标
前面已经可用算出每个顶点的裁剪空间坐标. 由于是线性空间, 所以当希望知道每个片元的相应坐标时, 只需要进行简单的插值, 这个操作渲染管线会自动帮我们完成. 即在片元着色器中, 不需要做任何操作,拿来用即可.
而对于顶点的视口坐标, 我们只要用这个公式就可以得到:(注意到裁剪空间的原点是在"中心")
但是为了得到每个片元(而不只是顶点)的视口空间坐标,
由于视口空间的坐标是非线性的, 不能对其进行线性插值, 所以透视除法需要到片元着色器中进行操作.
- 顶点着色器:
做好准备工作, 片元着色器只需要做透视除法( 即除以w分量) 一个运算
( 不做操作也可以, 片元着色器要做的运算就多了)这个准备操作,被unity封装到了
ComputeScreenPos这个函数中.
如果需要的是屏幕坐标,那就再对xy分量,分别乘以屏幕的宽高像素个数即可 - 进行插值:
- 片元着色器:
进行透视除法, 得到视口坐标.