矩阵乘法哪个更好? GLM 的重载 * 运算符或直接使用着色器
Which one is better in matrix multiplication? GLM's overloaded * operator or using directly shaders
在 GLM 中,我们有一个用于矩阵乘法的重载 '*' 运算符。
我们可以在 GLM 中使用这个运算符来进行矩阵乘法:
glm::mat4 MVP = Projection * View * Model;
//after that pass MVP to uniform 'MVP'
但换一种方式,我们可以将Projection、View和Model传给三个不同的uniform,在shader程序中做乘法。
GLM 运行s 在 CPU 上,但着色器程序 运行 在 GPU 上。由于 GPU 的架构,我们可以在着色器程序中比 CPU 更快地进行矩阵运算。
但我不能确定。哪种方式更快?
理想情况下,如果您出于其他目的在着色器中需要单独传递它们,则最好单独传递它们。如果您只需要 MVP,最好将 MVP 作为单个矩阵乘以并传递给着色器。
什么是最好的,很大程度上取决于您渲染的顶点数量,以及您的渲染是具有多个具有少量顶点的绘制调用还是具有许多顶点的少量绘制调用。
Always CPU 上的乘法会更好,因为它是每个绘制调用一次,而不是每个顶点一次。如果值需要在着色器之间变化,则必须在着色器中执行乘法。
我想我回答得太快了,但这可能与问题非常相似Should I calculate matrices on the GPU or on the CPU?
在 GLM 中,我们有一个用于矩阵乘法的重载 '*' 运算符。
我们可以在 GLM 中使用这个运算符来进行矩阵乘法:
glm::mat4 MVP = Projection * View * Model;
//after that pass MVP to uniform 'MVP'
但换一种方式,我们可以将Projection、View和Model传给三个不同的uniform,在shader程序中做乘法。
GLM 运行s 在 CPU 上,但着色器程序 运行 在 GPU 上。由于 GPU 的架构,我们可以在着色器程序中比 CPU 更快地进行矩阵运算。
但我不能确定。哪种方式更快?
理想情况下,如果您出于其他目的在着色器中需要单独传递它们,则最好单独传递它们。如果您只需要 MVP,最好将 MVP 作为单个矩阵乘以并传递给着色器。
什么是最好的,很大程度上取决于您渲染的顶点数量,以及您的渲染是具有多个具有少量顶点的绘制调用还是具有许多顶点的少量绘制调用。
Always CPU 上的乘法会更好,因为它是每个绘制调用一次,而不是每个顶点一次。如果值需要在着色器之间变化,则必须在着色器中执行乘法。
我想我回答得太快了,但这可能与问题非常相似Should I calculate matrices on the GPU or on the CPU?