用于常见3D操作的CPU或GPU上的矩阵数学运算

时间:2016-03-07 10:10:04

标签: opengl directx glsl shader hlsl

对于常见的3D操作,CPU和GPU之间应该进行多少矩阵数学运算是否存在常识?

典型的3D着色器可能需要多个矩阵。用于计算表面到光计算的世界矩阵。用于正常计算的世界逆转置矩阵。用于3d投影的世界视图投影矩阵。等

有两种基本方法可以解决这个问题。

  1. 计算CPU上的矩阵并将计算出的矩阵上传到GPU

    以某种CPU语言

    worldViewProjection = world * view * projection
    worldInverseTranspose = transpose(inverse(world));
    
    upload world, worldViewProjection, worldInverseProjection to GPU
    

    在GPU上使用world, worldViewProjection,worldInverseProjection

  2. 将各种组件矩阵传递给GPU(世界,视图,投影)并在GPU上计算所需的矩阵

    以某种CPU语言

    upload world, view, projection to GPU
    

    在GPU上

    worldViewProjection = world * view * projection
    worldInverseTranspose = transpose(inverse(world));
    
  3. 据我所知,在某种程度上我可能只需要在不同的机器和GPU上进行分析,并且在1次绘制调用中绘制一百万个顶点可能与在1次绘制调用中绘制4个顶点有不同的需求但是...我&#39我想知道......

    关于何时在GPU与CPU进行数学运算以进行矩阵计算,是否有任何共同的智慧。

    提出这个问题的另一种方法是我的默认值应该是上面的#1还是#2,之后我可以对那些默认不是最佳性能的情况进行分析。

1 个答案:

答案 0 :(得分:2)

在决定CPU / GPU计算时,问题不是计算,而是流式传输

GPU计算非常便宜。由于您的计算world * view * projection涉及制服,因此可能会对此进行优化。

但是,如果您选择在GPU上进行计算,则world viewprojection必须作为单独的统一矩阵进行流式处理。这比流式传输单个矩阵花费更多时间,并且还在着色器中使用更均匀的组件。

请注意,与纹理数据或缓冲区数据相比,制服的流式传输时间最短。您不太可能因此而达到性能限制,如果您这样做,则很容易进行优化。