【问题标题】:OpenGL Shaders - Should the camera translation happen on the GPU or the CPU?OpenGL 着色器 - 相机转换应该发生在 GPU 还是 CPU 上?
【发布时间】:2013-07-29 20:35:51
【问题描述】:

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

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

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

所以这是我的问题:

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

【问题讨论】:

  • 你是说,每一帧,你都会改变你的顶点数据?通过执行矩阵乘法?每个顶点(对于一个对象)都乘以同一个矩阵? 在 CPU 上
  • 每一帧我为每个对象创建一个矩阵,我在该矩阵上应用缩放、旋转和平移。

标签: opengl shader vbo perspectivecamera


【解决方案1】:

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

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

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

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

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

总结:

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

希望这会有所帮助。

【讨论】:

  • 完美答案。这也解决了我遇到的另一个问题,一切都被放大了:D 非常感谢!
  • “你跟踪每个对象的变换矩阵”——但这意味着 CPU 上可能有很多矩阵操作。我来这里是为了寻找有关是否在 GPU 上执行这些操作的信息(我在 GL ES 2 代码中遇到了一点,CPU 上的基本矩阵乘法正在成为一个严重的性能问题,我没想到会发生这种情况)。
  • 然后将它们移动到 GPU,例如上传相机矩阵和对象矩阵作为制服,并在着色器中将它们相乘。这为 GPU 添加了更多乘法,但从 CPU 中减去了它们。您可以将矩阵乘法移动到几乎任何地方,甚至可以将矩阵上传到流式缓冲区或类似内容。只是不要将每个顶点与 CPU 上的矩阵相乘(这是我的回答所强调的),但我假设你没有这样做。
猜你喜欢
  • 2022-01-02
  • 2011-11-04
  • 2013-05-13
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
相关资源
最近更新 更多