OpenGL着色器 - 相机平移应该在GPU还是CPU上进行?

3

目前我所做的工作是在将我的元素加载到VBO之前,创建一个新的矩阵并将它们添加到其中。我这样做是因为我想尽可能多地操作这个矩阵。

所以我只是在矩阵中的坐标上添加了相机位置。

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

现在,这种方法可以运行,但我不确定是否正确,或者我应该在GPU中而不是在CPU中进行相机定位。

我的问题是:

相机的定位应该在GPU还是CPU上进行?


你是说,每一帧都要通过矩阵乘法来改变顶点数据?每个物体的每个顶点都要乘以同一个矩阵?这是在CPU上进行的吗? - Nicol Bolas
每一帧我都会为每个对象创建一个矩阵,然后在该矩阵上应用缩放、旋转和平移。 - Amit Assaraf
1个回答

3
我不确定您目前在做什么。但是,做这件事的明智方法是不要触碰VBO。相反,将一个或多个变换矩阵作为uniform传递到顶点着色器中,并在GPU上执行矩阵乘法。
在CPU上更改VBO数据是不明智的,这意味着要么在CPU上保留顶点数据的副本,迭代并上传它,要么映射缓冲区并迭代它。无论哪种方式,速度都会非常慢。拥有VBO的整个目的是让您只需上传一次顶点数据,就可以同时在CPU上工作,而GPU则使用该顶点数据进行其操作。
相反,您只需将顶点存储在顶点缓冲区中一次,最好是在对象空间中(仅出于安全起见)。然后,对于每个对象,您需要跟踪一个转换矩阵,该矩阵将顶点从对象空间转换为裁剪空间。您将该矩阵传递给顶点着色器,并在GPU上为每个顶点执行乘法。
显然,GPU每帧至少将每个顶点乘以一个矩阵。但是,GPU具有并行硬件,可以快速执行矩阵乘法。因此,尤其是当您的矩阵经常更改(例如,对象移动)时,这比在CPU上进行更新的大缓冲区要快得多。此外,您可以将CPU释放出来执行其他任务,例如物理或音频等。
现在我可以想象,如果您的对象从不移动,您可能不想这样做,但是GPU矩阵乘法的速度可能与CPU浮点乘法相同(我不知道具体情况)。因此,对于静态对象是否拥有更多着色器还有待商榷。
总结:
  • 在CPU上更新缓冲区会很慢
  • 在GPU上进行矩阵乘法非常
  • 没有缓冲区更新?=释放CPU。
  • 在GPU上进行乘法?=轻松快捷地移动对象(只需更改上传的矩阵)。
希望这有所帮助。

完美的答案。这也解决了我遇到的另一个问题,一切都被放大了:D 非常感谢! - Amit Assaraf
你需要为每个对象跟踪一个变换矩阵,但这可能意味着需要在CPU上执行大量矩阵操作。我来这里是想了解是否应该在GPU上执行这些操作(我在GL ES 2代码中遇到了基本的矩阵乘法在CPU上成为严重性能问题的瓶颈,并没有料到会出现这种情况)。 - Adam
然后将它们移动到GPU,例如将相机矩阵和对象矩阵作为uniform上传并在着色器中进行乘法运算。这会增加GPU的乘法运算量,但减少CPU的负担。你可以将矩阵乘法移动到任何地方,甚至将矩阵上传到流缓冲区或类似的位置。只是不要在CPU上对每个顶点进行矩阵乘法(这是我的答案强调的),但我假设你没有这样做。 - Invalid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接