Opengl 用于常见3D操作的CPU或GPU上的矩阵数学
对于常见的3D操作,CPU和GPU应该做多少矩阵运算,有什么共同的智慧吗 典型的3D着色器可能需要几个矩阵。用于计算面到光计算的世界矩阵。用于正常计算的世界逆转置矩阵。用于三维投影的世界视图投影矩阵。等等 有两种基本方法可以实现这一点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))
worldViewProjection = world * view * projection
worldInverseTranspose = transpose(inverse(world));
upload world, worldViewProjection, worldInverseProjection to GPU
upload world, view, projection to GPU
在GPU上,在需要的地方使用world,
worldwiewprojection,worldwinverseProjection
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));
问这个问题的另一种方式是,我的默认值应该是上面的#1或#2,之后我可以分析默认值不是最佳性能的情况 决定CPU/GPU计算时,问题不是计算,而是流 GPU计算非常便宜。由于您的计算
world*view*projection
涉及制服,因此这可能会得到优化
但是,如果您选择在GPU上计算,则必须将世界视图和投影作为单独的统一矩阵进行流式处理。这比流式处理单个矩阵需要更多的时间,并且在着色器中使用更均匀的组件
请注意,与纹理数据或缓冲区数据相比,制服的流化时间最小。因此,您不太可能达到性能限制,如果达到了,则很容易进行优化。这通常不是太大的瓶颈,因为单个矩阵(如果提供了预乘)可以服务数百万个点,但将准备好的内容发送到着色器应该更有效。此外,如果要渲染数千个实例,那么最经济有效的方法是硬件实例和单个预乘投影*视图矩阵。将所有计算保持在同一个空间也是一种很好的做法。例如,分别提供view X proj和world。在view X proj X world等中直接提供灯光坐标。Imho中有一个很好的答案。在GPU上执行此操作时,您将为每个顶点、像素。。。一次又一次。CPU计算它一次。对我来说,我在CPU上做所有的预计算。