3

所以目前我正在做的是在将我的元素加载到 VBO 之前创建一个新矩阵并将它们添加到其中。我这样做是为了可以随心所欲地使用矩阵。所以我所做的只是将相机位置添加到矩阵中的坐标上。

注意:对象的实际位置保存在其他地方,矩阵是一个平移阶段。

现在,这可行,但我不确定它是否正确,或者我是否应该在着色器中而不是在 CPU 中转换为相机位置。

所以这是我的问题:

相机转换应该发生在 GPU 还是 CPU 上?

4

1 回答 1

3

我不完全确定你目前在做什么。但这样做的明智方法是不要碰 VBO。相反,将一个或多个变换矩阵作为制服传递给您的顶点着色器并在 GPU 上执行矩阵乘法。

在 CPU 上更改 VBO 数据是疯狂的,这意味着要么在 CPU 上保留顶点数据的副本,然后对其进行迭代并上传或映射缓冲区并对其进行迭代。无论哪种方式,它都会非常缓慢。拥有 VBO 的全部意义在于,您可以一次上传顶点数据并在 CPU 上同时工作,而 GPU 则关闭并处理所述顶点数据。

相反,您只需将顶点存储在顶点缓冲区中一次,最好是在对象空间中(只是为了理智起见)。然后,您跟踪每个对象的转换矩阵,该矩阵将顶点从对象空间转换到剪辑空间。您将该矩阵传递给您的顶点着色器,并对 GPU 上的每个顶点进行乘法运算。

显然,GPU 在每一帧中将每个顶点乘以至少一个矩阵。但是 GPU 具有并行硬件,可以非常快地进行矩阵乘法。因此,特别是当您的矩阵不断变化(例如,您的对象移动)时,这比在 CPU 上执行并更新大量缓冲区要快得多。此外,您可以腾出 CPU 来做其他事情,例如物理或音频或其他任何事情。

现在我可以想象,如果您的对象从不移动,您将不希望这样做,但是,GPU 矩阵乘法可能与 CPU 浮点乘法的速度大致相同(我不知道具体情况)。因此,是否值得为静态对象使用更多着色器是值得怀疑的。

概括:

  • 更新 CPU 上的缓冲区很
  • GPU 上的矩阵乘法速度很快
  • 没有缓冲区更新?= 释放 CPU。
  • GPU上的乘法?= 轻松快速地移动对象(只需更改您上传的矩阵)。

希望这有所帮助。

于 2013-07-29T21:09:04.330 回答