OpenGL着色器 - 相机转换应该发生在GPU还是CPU上?

时间:2013-07-29 20:35:51

标签: opengl shader vbo perspectivecamera

所以目前我正在做的是在将我的元素加载到VBO之前我创建了一个新的矩阵并将它添加到它。我这样做,所以我可以尽可能多地使用矩阵。 所以我所做的就是将相机位置添加到矩阵中的坐标上。

注意:对象的实际位置保存在矩阵的其他位置。

现在,这有效,但我不确定它是否正确,或者我是否应该转换为着色器中的摄像机位置而不是CPU。

所以这是我的问题:

是否应在GPU或CPU上进行相机转换?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

要点:

  • 更新CPU上的缓冲区 SLOW
  • GPU上的矩阵乘法是 FAST
  • 没有缓冲区更新? =释放CPU。
  • GPU上的乘法? =移动对象简单快捷(只需更改上传的矩阵)。

希望这有点帮助。