转载:https://blog.csdn.net/softwarekid/article/details/45055253
图形流水线中齐次空间的裁剪(1)
1. 本文将分为下面三部分
- 引入:为什么不在投影除法后裁剪?
- 为什么能用齐次坐标进行裁剪
- 使用齐次坐标裁剪的步骤
2. 引入:为什么不在投影除法后裁剪
在齐次空间对顶点和线裁剪是如今图形学管线进行裁剪的标准做法。一个世界坐标系下点经过观察变换后会映射到屏幕空间,在这其中会经过如下的矩阵变换:世界坐标系到相机坐标系的变化,相机坐标系下的透视投影变换到规范化空间,然后从规范化空间变换到屏幕空间。其中,裁剪就发生在透视投影变化之后,但在透视除法之前。先简单解释透视投影和透视除法:
透视投影指经过透视变化矩阵之后的得到齐次坐标;
透视除法指将透视投影得到的齐次坐标转化为三维坐标,即除以齐次分量,经过透视除法的点才是在规范化裁剪立方体中的点。
为什么不在投影除法后裁剪呢?为了简单起见,取投影参考点是观察坐标原点,近裁剪平面是观察平面的透视变化矩阵:
其中θθ 是相机的视角,aspectaspect是近裁剪平面的纵横比,znearznear和zfarzfar分别是近裁剪平面和远裁剪平面。
对于相机坐标系下的任意一点 P(x0,y0,z0,1)P(x0,y0,z0,1),经过该矩阵变化后得到P1=MP0P1=MP0,P1P1的坐标为(x1,y1,z1,w)(x1,y1,z1,w)。从该矩阵中可以看到z1=s∗z0+tz1=s∗z0+t,其中s=znear+zfarznear−zfars=znear+zfarznear−zfar,t=−2znearzfarznear−zfart=−2znearzfarznear−zfar,可以看到ss和tt都是常数,所以z1z1和z0z0之间是线性关系,同理x1x1与x0x0,y1y1与y0y0都是线性关系。w=−z0w=−z0。如果此时对P1P1进行透视除法,得到P′1=(x′1,y′1,z′1,w′)=(x1/w,y1/w,z1/w,1)P1′=(x1′,y1′,z1′,w′)=(x1/w,y1/w,z1/w,1),此时x′1x1′与原x0x0之间不再是线性关系,x′1x1′是以x0x0和z0z0为变量的函数。如果在透视除法后进行裁剪,那么将不能运用线性插值,否则很多在原来坐标系中的存储信息将会变形,比如:纹理、颜色等。所以,一般直接在齐次空间中做裁剪,在该空间中进行裁剪可以直接用线性插值。
3. 为什么能用齐次坐标进行裁剪
从世界坐标系到透视变换的矩阵的一般形式是:
其中 rr 表示旋转分量, tt 表示平移分量,旋转和平移变换都不会改变被变换者的形状和性质,二者称为 仿射变换(affine transformation) , pp表示投影分量(这个分量,好多教科书都没提及过) , ss 的作用类似与齐次坐标中的 ww ,可用作矩阵的归一化处理。从上面的分析可以看出对于没有经过透视除法的的点 P1P1 来说, (x1,y1,z1)(x1,y1,z1) 是 (x0,y0,z0)(x0,y0,z0) 经过仿射变换后得到的点,由于仿射变换不改变原来坐标系下顶点的属性(纹理,颜色)关系,所以可以直接线性插值。但我们毕竟需要的是透视投影后的点,然后才能进行光栅化, 而且裁剪的范围也是在透视除法后确定的,也就是规范化立方体 。那么在齐次空间的线性插值和透视投影后的点之间是什么关系呢?是一一映射吗?透视投影后的裁剪范围是怎么映射到齐次空间的?
由于齐次坐标是四维空间,为了方便展示,可以将 y,zy,z 固定。下图展示了 (x,w)(x,w) 之间的关系。所谓的透视除法就是将齐次空间中的一点与原点相连后得到的直线在 w=1w=1 上的投影。对于 w=1w=1 上的一点,该直线上的任意一点都与其相对应。如图所示,齐次空间的 P1P1 和 P0P0 经过透视除法后得到的坐标是 P1′P1′ 和 P′0P0′ ,如果裁剪范围在{P^{‘}}处,那么 P′P′ 与原点相连的直线与齐次空间中原来两点的连线的交点就是它在齐次空间的映射,而且这个映射是一一对应的。当然这是建立在齐次空间中的点是线性关系的基础上。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/c7c19bf07ade5bb529e5c01210bc4741.png)
4. 使用齐次坐标裁剪的步骤
从上面的分析中可以看到在其次空间进行裁剪的步骤分为如下步骤:
(1)经过投影变化后得到其次坐标
(2)根据规范化立方体所确定的裁剪空间求得齐次空间中进行线性插值的参数
(3)利用该参数对齐次空间中的点进行线性插值,包括坐标,纹理,颜色等
举例说明:
(1) 对于相机坐标系的两个点a(x0,y0,z0,1,u0,v0,c0)a(x0,y0,z0,1,u0,v0,c0) 和 b(x1,y1,z1,1,u1,v1,c1)b(x1,y1,z1,1,u1,v1,c1)其中(u,v)(u,v)是纹理坐标,cc是颜色值。经过透视变化后的得到a′(x′0,y′0,z′0,w0,u′0,v′0,c′0)a′(x0′,y0′,z0′,w0,u0′,v0′,c0′)和b′(x′1,y′1,z′1,w1,u′1,v′1,c′1)b′(x1′,y1′,z1′,w1,u1′,v1′,c1′)
(2) 对于规范化后的裁剪立方体(−1,1)×(−1,1)×(−1,1)(−1,1)×(−1,1)×(−1,1),只看对于x=−1x=−1的裁剪。注意此时x=−1x=−1是指经过透视除法后得到的xx。
上面的分析指出齐次空间的点与透视除法后的点是一一映射的,所以对于其次空间中与x=−1x=−1相对应的点c′c′,可以设c′=a′+tb′c′=a′+tb′。只看c′c′的xx和ww分量:c′(x′0+x′1t,w0+w1t)c′(x0′+x1′t,w0+w1t),将c′c′投影到w=1w=1平面得到透视除法后的点,即:
(3) 将 tt 带到齐次空间中求得裁剪所得点的坐标、纹理、颜色等。即利用公式 c′=a′+tb′c′=a′+tb′ 求得 c′c′ 的属性。
下期将介绍一种特殊情形:经过透视投影后w<0该怎么处理。同时介绍一些GPU在裁剪时真正的做法是什么。
(哎,其实介绍了这么多,现今的GPU根
本不是这么做的裁剪,这只是理论上的东
西,想想真是学术界和工业界的距离啊。
。)