使用DirectX管道进行2D渲染

时间:2013-04-08 18:57:56

标签: directx 2d shader

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

这按预期工作,我的四边形正确渲染到表面。然后我尝试沿X轴转换(2D)转换它,并得到一些奇怪的透视变化。

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

我觉得我错过了一些关于管道的重要事项?

任何帮助表示赞赏

2 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:1)

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