我开始尝试一些DirectX类型的东西,我有一个关于缩放矩阵的问题。如果我将视图矩阵设置为:
XMMatrixTranspose(XMMatrixIdentity()* XMMatrixScaling(1.0f,2.0f,1.0f))
然后y轴上的所有东西(一个居中的正方形)看起来都是两倍大,这正是我所期待的。如果我将其设置为负数,则ala:
XMMatrixScaling(1.0F,-2.0f,1.0F)
然后一切都消失了。实际上,如果我将比例矩阵的任何值设置为< 0然后没有任何显示。我期待图像只是沿着相应的轴“翻转”,但它根本就没有显示出来。在缩放时是否可以使用负值,或者我只是做了一些完全错误的事情?
答案 0 :(得分:1)
这是由back-face culling和clipping引起的。假设您已启用剔除(默认情况下已启用),当您将x或y轴的比例设置为负时,它会翻转所有三角形的绕线顺序。这会导致所有三角形被认为是“向后”,GPU不会绘制它们。假设您没有应用其他变换矩阵,并且正方形位于xy平面中,则翻转z符号不会导致三角形朝后,而只是使正方形位于视口外(例如从z移动) = 0.5,在veiwport深度范围内的中间,到视口深度范围之外的z = -0.5)。
背面剔除是一种性能优化,因为大多数3D场景都具有封闭的几何体(或者至少,它们不会让您看到打开的部分)。这意味着每个向后的三角形都应该有一个覆盖它的正面三角形,因此绘制向后的三角形是没有意义的。这有时并不总是正确的,如果你曾经玩过一个游戏并且太靠近岩石或墙壁,并且能够透过整个物体,那是因为你已经穿过前面,并且因为另一边是朝后的,它没有被画出来。