Opengl 细分如何提高性能?

Opengl 细分如何提高性能?,opengl,graphics,directx,glsl,tessellation,Opengl,Graphics,Directx,Glsl,Tessellation,计算更多顶点而不是仅仅从vram读取更多顶点的速度似乎与直觉相反。但是,如果内存带宽是使细分值得的问题,那么为什么会存在位移贴图之类的东西呢?在细分着色器中,如果从纹理读取,则访问vram的次数会更多。纹理查找是否比原始顶点更便宜?为什么镶嵌速度很快 假设顶点放大率为32,多边形模型非常低。这会比仅具有8或更多细分顶点放大的更高多边形模型更快吗。或者换句话说,细分越多,性能是否会线性提高?细分的要点是,在有用的地方(靠近摄影机)使用更多的顶点,在不太有用的地方(远离摄影机)使用更少的顶点。因此,

计算更多顶点而不是仅仅从vram读取更多顶点的速度似乎与直觉相反。但是,如果内存带宽是使细分值得的问题,那么为什么会存在位移贴图之类的东西呢?在细分着色器中,如果从纹理读取,则访问vram的次数会更多。纹理查找是否比原始顶点更便宜?为什么镶嵌速度很快


假设顶点放大率为32,多边形模型非常低。这会比仅具有8或更多细分顶点放大的更高多边形模型更快吗。或者换句话说,细分越多,性能是否会线性提高?

细分的要点是,在有用的地方(靠近摄影机)使用更多的顶点,在不太有用的地方(远离摄影机)使用更少的顶点。因此,您可以获得更详细几何体的效果,而不必在场景中的任何地方使用它。

没有一个点可以在每个可能的实例中提供更好的细分性能。在每个用例中应用不同的好处和权衡。一些可能有助于使细分比备选方案更快的因素:

  • 内存带宽:现代计算机很大程度上受到内存速度的限制。即使使用纹理,一次读取也可能低至4字节,而不是存储顶点数据通常需要的32+字节
  • 细节级别(LOD):使用细分着色器,可以避免区域过于详细,同时确保场景的其余部分具有足够的细节
  • 减少垂直方向:意味着顶点着色器的执行次数减少,以及在此之前管道的每个阶段的执行次数也减少
  • 更少的CPU开销:可能需要更少的draw调用,特别是当您不再需要在CPU上执行LOD时

我可能还遗漏了其他一些因素……

处理器和内存之间总是有一个权衡。细分是一种可以节省内存和带宽的方法,但以牺牲GPU性能为代价

为什么要使用细分: 使用置换贴图进行细分可显著减少场景中动画对象或多实例对象的内存带宽。但是它对于静态的单个对象不是很有用

假设你有一个精灵在屏幕上运行。如果精灵是一个高细节(100多万个顶点),则每次动画例程移动/变形网格时,所有100万个顶点都会变换并在每一帧重新加载到GPU

但是,如果使用具有细分和置换的低细节模型(50-100k顶点)。然后将置换贴图存储在gpu上一次。为动画更新50k网格,并在每帧中重新加载明显较少的网格,然后GPU使用已加载的置换贴图细分多达400-500万个Virt

最终结果是获得2-4倍的网格细节和1/20的内存带宽。现在想象一下,一次屏幕上有20-30个这样的精灵

不应使用细分的原因:要动态添加此细节,gpu必须消耗处理能力,以便在开始运行所有其他着色器之前计算每个细分顶点的3d位置

您需要注意的主要区别是,这仅在实例化和/或设置几何体动画时才有帮助

如果您的高细节静态网格从不移动,并且在屏幕上只有一个实例,那么上传完整细节的几何体会更快。细分只会增加复杂性并消耗管道中的周期

有一个折衷办法: 通过对静态网格使用细分,您可以获得轻微的内存带宽提升。因为顶点需要3个浮点坐标才能被gpu理解。但是,采样置换贴图时使用固定点数据的1个坐标是有用的。因为置换贴图是针对相邻顶点进行规格化的。因此,它会实时计算额外的数据。但此计算是针对每个细分顶点的每一帧执行的。这会占用着色器时间,如果使用静态网格,则不需要这些时间

但是,如果出于LOD目的禁用或禁用细分,则与高细节静态网格相比,可以为不需要细节的对象节省着色器时间

因此,对于改善动态/实例化网格的细节,细分始终是一个好主意

但对于静态网格或单一网格,它需要在LOD能力和管道复杂性之间进行权衡。距离中的高细节网格比禁用细分的细分网格消耗更多的计算时间。但是,前景中的高细节网格比打开细分的细分网格占用更少的计算时间

然而,要考虑的一个大问题是,随着物体越来越近,慢慢地将镶嵌变得更清晰,看起来比用一个高细节网格代替一个低细节网格要好得多。因此,当平滑LOD是一个大问题时,一定要使用细分。 …或对某一点使用细分,然后用高细节网格替换。但是,如果您不担心内存不足,并且始终将两个版本都保存在gpu上,那么这才是一个好主意。否则,在交换它们时,您将再次消耗带宽

同样,始终要在内存使用和处理器使用之间进行权衡

(在OpenGL的上下文中) 正如其他人已经指出的,可以将细分的使用看作是gpu计算时间增加和应用程序与OpenGL之间带宽减少之间的一种权衡

当你仔细考虑的时候,这是有道理的,对吗?如果没有发送所有顶点,则必须有一些方法可供选择