对于常见的3D操作,CPU和GPU之间应该进行多少矩阵数学运算是否存在常识?
典型的3D着色器可能需要多个矩阵。用于计算表面到光计算的世界矩阵。用于正常计算的世界逆转置矩阵。用于3d投影的世界视图投影矩阵。等
有两种基本方法可以解决这个问题。
计算CPU上的矩阵并将计算出的矩阵上传到GPU
以某种CPU语言
worldViewProjection = world * view * projection
worldInverseTranspose = transpose(inverse(world));
upload world, worldViewProjection, worldInverseProjection to GPU
在GPU上使用world,
worldViewProjection,worldInverseProjection
。
将各种组件矩阵传递给GPU(世界,视图,投影)并在GPU上计算所需的矩阵
以某种CPU语言
upload world, view, projection to GPU
在GPU上
worldViewProjection = world * view * projection
worldInverseTranspose = transpose(inverse(world));
据我所知,在某种程度上我可能只需要在不同的机器和GPU上进行分析,并且在1次绘制调用中绘制一百万个顶点可能与在1次绘制调用中绘制4个顶点有不同的需求但是...我&#39我想知道......
关于何时在GPU与CPU进行数学运算以进行矩阵计算,是否有任何共同的智慧。
提出这个问题的另一种方法是我的默认值应该是上面的#1还是#2,之后我可以对那些默认不是最佳性能的情况进行分析。
答案 0 :(得分:2)
在决定CPU / GPU计算时,问题不是计算,而是流式传输。
GPU计算非常便宜。由于您的计算world * view * projection
涉及制服,因此可能会对此进行优化。
但是,如果您选择在GPU上进行计算,则world
view
和projection
必须作为单独的统一矩阵进行流式处理。这比流式传输单个矩阵花费更多时间,并且还在着色器中使用更均匀的组件。
请注意,与纹理数据或缓冲区数据相比,制服的流式传输时间最短。您不太可能因此而达到性能限制,如果您这样做,则很容易进行优化。