计算更多的顶点而不是仅从vram中读取更多似乎是一种违反直觉的做法。但如果内存带宽是使曲面细分值得的问题,那么为什么会存在像置换映射这样的东西?在曲面细分着色器中,如果你从纹理中读取,你仍然会访问vram。纹理查找比更多的原始顶点廉价吗?为什么曲面细分很快?
假设您有一个32个顶点扩充的低多边形模型。这比只有8个曲面细分顶点扩充的更高多边形模型更快吗?换句话说,您是否可以线性地获得更高的性能,越多细分曲面?
计算更多的顶点而不是仅从vram中读取更多似乎是一种违反直觉的做法。但如果内存带宽是使曲面细分值得的问题,那么为什么会存在像置换映射这样的东西?在曲面细分着色器中,如果你从纹理中读取,你仍然会访问vram。纹理查找比更多的原始顶点廉价吗?为什么曲面细分很快?
假设您有一个32个顶点扩充的低多边形模型。这比只有8个曲面细分顶点扩充的更高多边形模型更快吗?换句话说,您是否可以线性地获得更高的性能,越多细分曲面?
在处理器和内存之间总是要进行一定的权衡。Tessellation(细分)是一种可以节省内存和带宽但会牺牲GPU性能的方式。
为什么要使用细分: 使用位移映射的细分可以显著降低场景中动态或多实例对象的内存带宽,但对于静态单个对象则没有太大用处。
假设屏幕上有一个沿着屏幕奔跑的精灵。如果精灵是高细节(超过100万个顶点),那么每次动画程序移动/变形网格时,所有100万个顶点都会被转换并重新加载到GPU中。
然而,如果您使用低细节模型(50-100k个顶点)进行细分和位移,则只需在GPU上存储一次位移图。您更新包含50k个顶点的网格进行动画并且每帧重新加载更少的网格,然后GPU根据已加载的位移图将其细分为4-5百万个虚拟点。
最终结果是您可以获得2-4倍的网格细节,同时只使用1/20的内存带宽。现在想象一下您同时在屏幕上有20-30个这样的精灵。
为什么不应使用细分:为了在逐步添加细节时实现此目的,GPU必须消耗处理能力,以便在开始运行所有其他着色器之前计算每个细分顶点的3D位置。
您需要注意的主要区别是:只有在实例化和/或动画几何体时,这才对您有帮助。
如果您有一个高细节静态网格,它永远不会移动,并且只在屏幕上有一个实例,则上传完整细节的几何体更快。细分只会增加管道复杂度,而不会带来任何好处。
权衡: 使用细分静态网格可以获得轻微的内存带宽优势。因为顶点需要3个浮点坐标才能被GPU理解。但是采样位移图只需要1个固定点数据坐标才能发挥作用。因为位移图针对相邻顶点进行了归一化。所以必须每帧为每个细分顶点计算额外数据。这将消耗着色器时间,如果使用静态网格则不需要此操作。
但是,如果出于LOD目的将细分降低或关闭,则相对于高细节静态网格,它可以为不需要详细信息的对象节省着色器时间。
所以,针对动态/实例化网格来提高细节总是一个好主意。
但对于静态网格或单个网格,则是LOD能力和管道复杂性之间的权衡。远处的高细节网格比打开细分的细分网格消耗更多的计算时间。但近处的高细节网格比打开细分的细分网格消耗更少的计算时间。
考虑到物体越靠近,缓慢增加镶嵌细节比立即用高细节网格替换低细节网格要好得多。因此,如果平滑LOD是一个重要问题,那么一定要选择镶嵌技术。或者使用镶嵌技术到一定程度,然后再用高细节网格替换它。但这只是一个好主意,如果您不担心内存不足,并且始终在GPU上保留两个版本。否则,您将再次烧掉带宽来交换它们。简单总结结论。 镶嵌如何提高性能?
当不可能在开始渲染之前从应用程序定义和上传顶点数据到GPU时。这是唯一需要使用镶嵌的时候。往往情况并非如此。
细分网格的优点在于,在有用的地方(靠近摄像机),使用更多的顶点,而在不太有用的地方(远离摄像机)使用更少的顶点。因此,您可以获得更加详细的几何效果,而无需在场景中的所有位置都使用它。