我们知道,viewport是用来设定渲染后的场景在render target中的位置和大小的,也就是场景会被拉伸到指定的viewport中。但是一旦和pre transformed坐标一起使用,那就是另外一回事了。rhw,即reciprocal homogeneous w,我们在指定pre transformed顶点坐标时,w分量被称为rhw。通常,经过投影变换后的顶点在clip space,此时dx会对该坐标进行clip,clip的依据是顶点坐标的w分量,在变换的最后才会进行透视除。一旦使用pre transformed坐标,我们就省略了model, view, projection这些变换,因为我们告诉dx,我们提供的坐标就是变换过的,已经变换到了屏幕坐标。但是dx还是会进行clipping,那么dx要做的就是,将我们的pre transformed坐标结合rhw值,和viewport变换回clip space进行clipping。
我们知道投影后,随后会透视除,再进行viewport变换。那么逆变换就是乘以viewport的逆矩阵,之后再乘以rhw值即可。
假设我们有pre transformed顶点(150, 50, 0, 1),viewport 大小为(150, 250),viewport坐标为(150, 50),那么,根据上边的逆变换可以得到变换到clip space的坐标为(-1, 1, 0, 1)。可以看出这个坐标为clip space左上角。
从实际效果可以看出,如果使用pre transformed顶点,若改变viewport位置,效果类似于clipping,而不像用未转换的顶点时的效果就是简单的拉伸和平移。
测试时我用了dx9的vetices例子。
参考:
Viewports And Clipping (DirectX 9)
DirectX Transformation Pipeline