到目前为止,在渲染我的场景并遍历场景图时,对于每个节点,其模型矩阵都是根据父级的模型矩阵和场景节点的姿势计算得出的。这非常简单,并且已经将矩阵乘法的数量减少到每个节点和帧一个乘法。

但是所有这些矩阵乘法都必须在CPU上和每一帧中完成,以便能够非常快速地执行(多个连续的)场景节点运动。但是,GPU可能更适合执行大量矩阵乘法,因此我正在考虑将多个部分模型矩阵发送到顶点着色器,而不是在CPU上计算所有内容。

发送每一个GPU的单个部分(因此每个节点的姿势)可能没有多大意义,因为在这种情况下,所有计算都是针对每个顶点而不是每个节点完成的,这实际上会降低性能。但是也许有很多孩子的场景节点或只有不移动的孩子(相对于其父对象)的场景节点可能是拆分模型矩阵并将乘法转移到着色器的地方。

那么,什么时候更好地将部分模型矩阵发送到着色器并将乘法运算移到GPU?还是对这根本不是一个好主意?

#1 楼

使用制服进行数学运算通常不会比在CPU上获得任何性能更高。在进行矩阵数学运算时,CPU并不比GPU慢,它的结构也无法并行执行大量数学运算。但是您实际上必须做大量的数学运算才能获胜。将额外的数据发送到GPU只是让GPU将两个矩阵相乘,几乎不会给您带来任何好处。

现在,说您有一个可以蒙皮的矩阵缓冲区。是将它们全部转换为CPU上的世界空间,还是只是将额外的模型到世界空间矩阵传递给GPU,可能会变得很重要。但即使如此,它仍然取决于您的顶点与骨骼的比率。

评论


$ \ begingroup $
我依赖于计算量。GPU在数学运算方面确实非常快,因此这是尝试和基准测试的问题。
$ \ endgroup $
–迈克尔四世
15年9月3日,9:30

#2 楼

很少,如果有的话。您在自己的问题中回答了一半:顶点着色器每个顶点运行一次,片段着色器每个片段运行一次。如果您没有执行该顶点或片段所独有的操作,那么每次调用着色器时,您实际上所做的就是完全相同的操作。这听起来对我来说效率不高。