现代 OpenGL 与 glsl 的最佳矩阵结构和 CPU/GPU 通信

Optimal matrix structure and CPU/GPU communication in modern OpenGL with glsl

我想知道您对应该在何处处理矩阵乘法、在何处存储结果以及 CPU 和 GPU 之间的一般通信的想法。

  1. 由于每个对象的 MVP 矩阵都相同,因此在 CPU 上计算它然后将其发送到着色器似乎是可行的方法,是吗?

  2. 如果我有多个着色器,有些只需要建模矩阵,有些只需要 MVP 矩阵,有些则两者都需要。我该如何进行?

  3. 我目前每个 vertex/fragment 着色器对都有一个着色器对象,用于存储着色器中每个制服的位置。这似乎是个好习惯,是吗?

  1. 这可能取决于您在一次绘制调用中处理了多少个顶点。如果您只处理少量顶点,那么您最好单独发送 M、V 和 P,因为 GPU 在浮点运算方面往往要快得多(尽管大多数情况下不会采用这种方法;您会想要使用您的特定模型进行分析以确保)。另一方面,如果你在每次调用中渲染很多顶点,你最好在 CPU 上计算一次(即使它会慢一点),因为这意味着你赢了'在着色器中一遍又一遍地重新计算相同的值。
  2. 如果您将整个 MVP 作为一个矩阵发送,那么在您同时需要 MVP 和 M 的情况下(我认为照明是我 运行 加入其中的情况)然后将两者都发送,因为你真的没有很多其他选择。如果你只需要 M 那么只发送 M.
  3. 我不明白你在这里的意思(而且我没有足够的代表在评论中提问)。如果您的意思是在外部存储统一 ID 而不是在每个渲染循环中查询它们,那么是的,这是非常标准的过程。

更一般地说,在解决此类性能问题时,最好的选择是使用分析器(像 GPUPerfStudio 这样的特定图形对此类问题很有用)并找出哪种方法在您的具体情况,因为许多性能调整具有不同程度的有用性,具体取决于更具体的情况。