CVV canonical view volume
HCS homogeneous clip space
NDC nomolized device coordinates
pipeline 的 geometry stage 的 projection前后有这样一些概念
次序 以及什么时候做了什么 哪里做的 还有那时候的维度
model --world--view space---hcs- ndc -screen coordinates
从hcs开始说
这里的h就是齐次 齐次就是三维加一维 用四维表示三维数据 便于计算
clip是在这个空间hcs做的 因为 它就叫 homo Clip space
这里做肯定也是计算方便
做完之后把w除过去 w里放的就是z 这个过程叫perspective divide 这步是硬件做的
hsc里的数据是这样的
(x/rtan(a/2),y/tan(a/2),Az+B,z) 5.1
ndc这个空间里的数据是这样的
(x/rztan(a/2),y/ztan(a/2),A+B/z,1) 5.2
这两组数据都是4维的
我们先理解下5.2 看它前三项 这样的数据可以组成那个单位立方体
是个 标准的cube 并且符合透视原理 这个proj matix 第一项[0][0]里的/r它就是转到ndc的线性部分的数据
其它是透视投影的数据 这个数据就是个height/weight的ratio 让后续变换不受view frustrum长宽比影响
第二部分数据就是/z 和proj一样 是非线性部分 做完之后/w来解决的
这个数据 如果不看z项 只看xy项 那它就是 proj到二维的
如果看xyz三项 就是unit cube (至于cvv 你看他名字 canonical 我倾向认为它是homo cs里的概念是个四维下的unit cube)
所以对5.1来说我们可以理解成 就像一个点加w 变成齐次空间下的点一样
把5.2加了w得到的就是齐次空间下的unit cube 就是cvv
clip就是在这里做的 clip是在hcs做的 不在ndc做
至于你们以为的ndc下才有那个cube 那是在三维生物的眼里 hcs里也有这个cube只是还没转成能被三维生物认出来的形式
ndc是四维 但是它前三维也能组成三维数据 前两维也有proj数据 但它有z
所以到了 screen mapping 处理clip之后的 三维数据
screen coordinate有xy window coordinate 有xyz
就是在这个空间 dx和opengl是反着的 所以每次porting的时候 都有一个宏来处理这件事 后来有专门的api可以设置
图形程序应该能手推projmatrix 这样才好理解上面的事情 我也是拖了很近才推的