我应该在 CPU 或 GPU 上计算矩阵吗?
假设我有以下矩阵P * V * M
,我应该在 CPU 上计算它们,以便将最终矩阵发送到 GPU(GLSL),还是应该将这三个矩阵分别发送到 GPU,以便 GLSL 可以计算最终矩阵?
我的意思是,在这种情况下,GLSL 必须为每个顶点计算 MVP 矩阵,因此在 CPU 上预先计算可能更快。
但是,假设 GLSL 只需要计算一次 MVP 矩阵,那么 GPU 是否比 CPU 更快地计算出最终矩阵?
我应该在 CPU 或 GPU 上计算矩阵吗?
假设我有以下矩阵P * V * M
,我应该在 CPU 上计算它们,以便将最终矩阵发送到 GPU(GLSL),还是应该将这三个矩阵分别发送到 GPU,以便 GLSL 可以计算最终矩阵?
我的意思是,在这种情况下,GLSL 必须为每个顶点计算 MVP 矩阵,因此在 CPU 上预先计算可能更快。
但是,假设 GLSL 只需要计算一次 MVP 矩阵,那么 GPU 是否比 CPU 更快地计算出最终矩阵?
通用规则:如果可以将计算结果以 uniform(一致变量) 的形式传递给着色器,则始终在 CPU 上预先计算,没有例外。在顶点和片段之间发生变化的值才有意义会在着色器上进行计算。整个顶点批次中始终保持不变的所有内容最好在 CPU 上处理,效率最高。
GPU 不是能够快速处理所有任务的神器。对于某些任务,即使对于非常大的数据集,CPU 也能够轻松地胜过 GPU。因此,一个非常简单的指南是:如果可以将其移动到 CPU 上,在计算所需的 CPU 时间不超过 GPU 处理总开销的情况下,请在 CPU 上进行计算。单个矩阵的计算就属于这些任务之一。
与OpenGL的大多数情况一样,这取决于具体情况。
在大多数情况下,单个计算在CPU上比GPU上更快。 GPU的优点在于它可以同时执行大量计算。
另一方面,这也取决于您的瓶颈在哪里。如果您的CPU正在进行大量其他工作,但是您的着色器在最低功率目标系统上尚未成为瓶颈,则通过将某些矩阵乘法移动到顶点着色器中可能很容易地看到一些性能提升。
通常,您应避免在片段着色器中执行任何可以在顶点着色器或CPU上执行的工作,但除此之外,这取决于具体情况。除非您遇到性能问题,否则只需以最简单的方式进行操作;如果您遇到性能问题,请使用两种方法并分析性能以查看哪种方法效果更好。
projection * view * model * vertex
,那么实际上没有矩阵
乘法。只有从右到左进行的矩阵*向量
乘法,因为它从右到左计算(projection * (view * (model * vertex)))
。这在计算上要轻松得多。 - Justin Meiners