更多顶点数据或更昂贵的着色器?

More vertex data or more expensive shader?

我可以:

将顶点上传到缓冲区并执行一些额外的指令,没有什么很昂贵,一些 vec4 创建、添加和一个 vec4 x mat4 乘法。

将三倍数量的顶点上传到缓冲区并且不需要额外的数学运算。

在这两种情况下,相同数量的顶点被发送到着色器。只是缓冲区大小会有所不同,因为第一种方法使用了 indexing/instancing 技巧。

显然第一种情况对于缓冲区上传来说更快,但是对于绘图呢?在大多数机器上这可能更快?

虽然我使用的是 opengl,但这个问题也适用于 directx。

根据您提供的信息,我认为没有好的答案。这至少取决于以下几点:

  • 顶点数和其他数据(如果你是 CPU-GPU 带宽限制)
  • 您已经在顶点着色器中完成的工作量(如果 GPU 受限于顶点处理)
  • 像素着色器的工作量(如果 GPU 受像素处理限制)
  • 顶点着色器中的控制流(如果您需要做的额外工作需要动态分支或其他昂贵的东西)

一般来说,我认为渲染很少在顶点着色器中绑定 ALU,因此进行计算可能没问题,但如果不进行分析就无法知道。尝试两者并测量 GPU 时间(例如使用 Nvidia NSight 或 AMD PerfStudio)以获得实际答案。还记得在对渲染管道进行其他更改后重复分析,因为上述因素可能导致瓶颈转移。