我的想法是如何使用matrix在3D顶层2D上正确的?

我是使用matrix的新手,所以我希望能够在标题中描述的上下文中理解它们的用法。

现在我有一个小型的基于Direct3D 11的游戏引擎,从底部到顶部渲染一堆场景或屏幕。 我有一个静态的二维正射影像投影matrix,它只是映射到从(0,0)到(屏幕宽度,屏幕高度)的屏幕坐标。 不同实体的位置和结果世界matrix是相对于这个坐标设置的。

不过,我想通过使不同的场景能够使用不同的视角来扩展这一点,以便能够渲染具有透视的3D场景,然后在其上面绘制平面2Dgraphics用户界面。 但是由于我对使用matrix很陌生,因此我需要确认是否对改变之前会发生什么有正确的想法,因为需要大量的工作来按照设置的方式重构引擎现在。

假设我有Scene A作为3D场景, Scene B作为我的2D叠加。

Scene A实体被渲染时,以下matrix被传递给着色器:

  • View = 3D世界中的相机位置/方向
  • Projection =具有FoV,纵横比和近/远深度的透视matrix
  • World =个人实体在3D世界中的地位

然后,当我想渲染Scene B ,我转而使用这些matrix:

  • View =单位matrix,因为视图是静态的
  • Projection =具有屏幕坐标的正交matrix
  • World =个体在屏幕坐标系中的位置

在这两种情况下,顶点着色器都将这些matrix相乘: world * view * projection

它是否正确? 这是否会像预期的那样绘制我的3D场景,然后相对于屏幕坐标系正确地绘制2D元素? 还是我误解了这些matrix是如何工作的?

编辑:从头开始下面的问题; 我在相关的问题下find了答案: 模型视图和投影matrix应该在着色器还是CPU上计算?

原始问题:还有一件事,在将CPU传递给着色器的常量缓冲区之前计算View-Projection-Worldmatrix,还是GPU更适合接收三个matrix并将其相乘着色器方面? 我已经看到了两种方法的使用,但我还没有find任何结论,哪种方式更实用/更有效率。 顺便提一下,我有两个常量缓冲区,一个是每个场景更新一次的View和Projectionmatrix,另一个更新每个单独的实体的Worldmatrix,所以如果将乘法运算移动到CPU代替。 但是理论上这样做会更快吗?这样做是否有什么缺点?

matrix计算,只要它们对于正在渲染的帧是恒定的,就应该由CPU计算并发送给GPU。 您可能认为乘法matrix并不是CPU的昂贵操作。 但是,如果将它传递给顶点着色器,那么相同的matrix结果将被计算n次,其中n是该帧所呈现的3D顶点的总数,无论速度多快,这是完全低效的。 这是除非你有一个方法在顶点着色器中计算一次matrix。 如果你这样做,那么它的伟大。 否则只是“保持简单”。 在CPU中计算它们并将它们设置为着色器的常量。