0

我想使用 DirectX (11) 渲染 2D 几何图形,并尝试通过创建一个根本不转换顶点的效果文件来实现 - 这就是您通常应用世界/视图/投影矩阵的地方我只是返回(未转换的)输入。

这按预期工作,我的四边形被正确渲染到表面。然后我尝试通过沿 X 轴的平移(2D)对其进行转换,并得到了一些奇怪的视角变化。

谷歌搜索我看到人们在谈论使用正交变换矩阵,但不明白为什么 - 我不想将一般的 3d 数据转换为 2d,我想将 2d 数据转换为 2d(也许是 2d也翻译/缩放)

我觉得我错过了有关管道的一些重要内容?

任何帮助表示赞赏

4

2 回答 2

2

您正在使用的投影矩阵是提供透视的透视矩阵。当您在 3D 中工作时这很好,但是当您想要渲染 2D(例如渲染 GUI)时,您不想添加透视图。

正交矩阵是一个基本上忽略透视的矩阵,所以远处的物体和近处的物体一样大。

如果你画一个盒子(一个顶部缺失的立方体),它们之间的区别可以如下所示:

Perspective    vs    Orthigonal
O---------O             O---------O
|\       /|             |         |
| o-----o |             |         |
| |     | |             |         |
| o-----o |             |         |
|/       \|             |         |
O---------O             O---------O

那么在你的情况下会发生什么?好吧,不在屏幕中心的对象自然会远离屏幕中心附近的对象。正因为如此,他们被拉得更近了。

例子:

A      B      C        Point A (-5, 0, 5)
 \     |     /         Point B ( 0, 0, 5)
  \    |    /          Point C ( 5, 0, 5)
   \   |   /       
    \  |  /      
     \ | /    
      \|/
       V

如您所见,A 点和 B 点距离较远。如果我们使用非常基本的透视图(它更复杂,但作为示例就足够了)来计算每个点在屏幕上的位置,那么我们将使用以下公式:

Vector2 Perspective(Vector3 pos)
{
    return Vector2(pos.x, pos.y) / pos.length();
}

现在正交矩阵将更符合以下几点:

Vector2 Orthogonal(Vector3 pos)
{
    return Vector2(pos.x, pos.y);
}

因此,当您用新的正交矩阵替换旧的透视矩阵时,您应该不再有透视问题。

于 2013-04-08T20:37:06.753 回答
1

我认为您可能忘记在完成构造之后但在将其分配给设备之前在您的转换矩阵上调用 m.Transpose()

于 2013-04-09T13:30:29.940 回答