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

Opengl 用于常见3D操作的CPU或GPU上的矩阵数学,opengl,directx,glsl,shader,hlsl,Opengl,Directx,Glsl,Shader,Hlsl,对于常见的3D操作,CPU和GPU应该做多少矩阵运算,有什么共同的智慧吗 典型的3D着色器可能需要几个矩阵。用于计算面到光计算的世界矩阵。用于正常计算的世界逆转置矩阵。用于三维投影的世界视图投影矩阵。等等 有两种基本方法可以实现这一点 在CPU上计算矩阵,并将计算出的矩阵上载到GPU 在某些CPU语言中 worldViewProjection = world * view * projection worldInverseTranspose = transpose(inverse(world))

对于常见的3D操作,CPU和GPU应该做多少矩阵运算,有什么共同的智慧吗

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

有两种基本方法可以实现这一点

  • 在CPU上计算矩阵,并将计算出的矩阵上载到GPU

    在某些CPU语言中

    worldViewProjection = world * view * projection
    worldInverseTranspose = transpose(inverse(world));
    
    upload world, worldViewProjection, worldInverseProjection to GPU
    
    upload world, view, projection to GPU
    
    在GPU上,在需要的地方使用
    world,
    worldwiewprojection,
    worldwinverseProjection

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

    在某些CPU语言中

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

    worldViewProjection = world * view * projection
    worldInverseTranspose = transpose(inverse(world));
    
  • 我知道在某种程度上,我可能只需要在不同的机器和GPU上进行配置,在一次绘制调用中绘制一百万个顶点可能与在一次绘制调用中绘制四个顶点有不同的需求,但是。。。我想知道

    关于什么时候在GPU和CPU上进行矩阵计算,有什么共同的智慧吗


    问这个问题的另一种方式是,我的默认值应该是上面的#1或#2,之后我可以分析默认值不是最佳性能的情况

    决定CPU/GPU计算时,问题不是计算,而是

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

    但是,如果您选择在GPU上计算,则必须将
    世界
    视图
    投影
    作为单独的统一矩阵进行流式处理。这比流式处理单个矩阵需要更多的时间,并且在着色器中使用更均匀的组件


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

    这通常不是太大的瓶颈,因为单个矩阵(如果提供了预乘)可以服务数百万个点,但将准备好的内容发送到着色器应该更有效。此外,如果要渲染数千个实例,那么最经济有效的方法是硬件实例和单个预乘投影*视图矩阵。将所有计算保持在同一个空间也是一种很好的做法。例如,分别提供view X proj和world。在view X proj X world等中直接提供灯光坐标。Imho中有一个很好的答案。在GPU上执行此操作时,您将为每个顶点、像素。。。一次又一次。CPU计算它一次。对我来说,我在CPU上做所有的预计算。