本文主要是介绍DirectX投影变换矩阵的原理与推导,齐次裁剪空间的应用举例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
DirectX Geometry Pipeline的投影变换不是D3DXMatrixShadow或者几何书上的投影变换。
几何书上的投影变换是这样的:
分别是平行投影和透视投影,把空间中的三维物体变成二维平面上的图形。
而DirectX Geometry Pipeline的投影变换是这样的:
上图分别是 Perspective Camera
和 Orthographic Camera
的视景体1(图中的坐标架代表摄像机坐标系),不同的视景体决定了不同的投影类型,常见的是透视投影和正投影。DirectX Geometry Pipeline的投影变换是把视景体都变成DirectX规定的长方体 H(齐次裁剪空间, Normalized Device Coordinates):
w>0:2
齐次坐标
前者是三维到二维的变换,后者是三维到三维的变换;
后者去掉深度信息(z坐标)就相当于前者;
前者补上深度信息可以得到后者。
Perspective Camera
现在来求 把Perspective Camera的视景体变成DirectX规定的长方体的透视矩阵,
思路是先计算三维到二维的透视投影,再加上深度向量。
E是透视投影线的汇聚点,P’ 位于投影平面上,该平面过点Q,法向是N(单位法向量)朝右,
由质点几何易知P’的齐次坐标为 ((P−Q)N⊤E+(Q−E)N⊤P,(P−E)N⊤) 。
深度向量 d=((P−Q)N⊤N,0) .
要还原P’的深度信息,只需 把P’的位置坐标加上深度向量d 即可
但是因为含有 (P−E)N⊤(P−Q)N⊤N ,无法写成对 (P,1)的线性变换。这样我们不得不放弃使用真正的深度值了。
深度缓冲区是用来进行深度测试,处理物体的遮挡的。只要能保持相对深度关系,即使不是真正的深度值也没有关系。
如果我们把P’的齐次坐标和深度向量 d 直接相加:
这篇关于DirectX投影变换矩阵的原理与推导,齐次裁剪空间的应用举例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!