汽车渲染
随着仪表盘用户界面(UI)的发展,现在是时候解决最具挑战的部分了:在一款小型的嵌入式GPU上渲染整个车身,并细节化处理。
精细的汽车模型要可以从不同的角度环绕查看,驾驶员可以在仪表上看到他们的汽车模型,以及车辆周围的真实场景,这要借助车载摄像头、雷达或者激光雷达(LiDAR)。汽车厂商以及车主都希望仪表上显示的是真实的车辆,越精确越好,而不是简单的汽车模型。与表盘上的文本一样,在汽车渲染问题上省去很多的三角形无疑是一种简便的方式,但是想要获得更好的效果还有更好的方法,下面我们来详细介绍一下。
2.1 纹理的一些技巧
鉴于纹理在解决UI几何瓶颈方面取得的成功,由此推测它们在其他方面也会非常有用。以这个看起来还不错的汽车内饰为例。
但是这是通过简单的纹理技巧实现的,使得实际的几何形状非常简单。这是怎么实现的呢?这是法线贴图与烘焙光照的简单组合,可能需要花费一定的时间来创建,但是带来的成果确实巨大的。
最明显的想法是将小的细节绘制到纹理中。然而这种方法的结果不足以让人信服,必须更进一步让纹理可以控制光照。
2.1.1 法线贴图
法线贴图是降低仪表盘渲染成本的便捷方法,不幸的是应用到汽车时,我们遇到两个主要的问题:
① 汽车是三维的(与表盘不一样,表盘几乎是平的),如果要让车体的轮廓非常的光滑,则需要非常密集的网格。
② 法线贴图在精度上是有限的,包括纹理精度以及深度精度,这会导致纹理外观并不理想以及出现一些条带状的假象。
这是否意味着我们应该完全忽略法线贴图呢?绝对不是!它们在很多地方都非常有用,不仅仅是汽车车身。
例如在仪表案例中,我们将车轮压缩到其原始尺寸的1.5%,而且没有明显的质量损失:
图16:法线贴图可以大大减少汽车很多部位几何图形的数量
2.1.2 烘焙光照(Baked Lighting)
将高质量的网格光照投射到用于渲染的较低质量对象上是仿造细节的另一个好方法。环境光遮蔽(Ambient Occlusion)通常是首选的照明方式:它完全可以取代动态光照,甚至可以更好的提升动态光照,减少几何图形的散光程度,在场景中创建让人舒服的柔和阴影。
环境光遮蔽(Ambient Occlusion)用于漫反射以及反射效果调试是非常有效的,而且通常也是非常有用的工具。
图17:整个汽车的环境光遮蔽烘焙贴图
2.1.3 插曲:UV管理
如果将整个车身转换成纹理(大概是带有环境光遮蔽的情况),那么需要进行完全的UV展开。但是车体是相对比较大的对象,使用4K纹理囊括所有的细节,这在数量上是有限制的。好消息是车身是对称的,而且环境光遮蔽是完全独立的。这意味着车身一侧的UV可以与另一面的重合,合并成一个,从而可以节省大量的纹理空间。如果我们可以提前知道车身的哪部分不需要细致的渲染,我们也可以缩小这部分UV,把空间分给更重要的部分。
图18:巧妙的打包策略,在UV中将重复的对称部分进行重叠(红色高亮部分)
2.1.4 浮动
还需要渲染最小的按钮,螺钉和螺栓?好吧,这里有一个非常简单的方法,可以处理超级小和重复的细节,而不用创建超大的纹理资源。这个方法通常称为“浮动”——创建包含很多细节的纹理组合,在原始网格上渲染一层透明的网格。
图19:基本的仪表板渲染,3万个三角形
图20:采用“浮动”技术的仪表板:1138个三角形
显而易见,由于所有细节都在法线贴图中模拟,因此优化后的版本缺乏深度,除了这个缺点,它与整个模型对于光照和反射的方式是一样的。
注:在上面的示例中,此优化版本的1138个三角形中,超过1000个用于金属旋钮,这显然是浪费,应该进一步优化。
图21:仅浮动网格的仪表板
由于这些元素都是重复和映射的,纹理空间中它们是最小化的,如下使用“浮动”方法的256 x 256分辨率的法线贴图所示:
图22:“浮动”的法线贴图
为了变得更好,从一定距离来看纹理技巧往往非常稳定,仅限几何图形的系统肯定不是这种情况,如下图所示,呈现了难以接受的不同级别的锯齿现象:
图23:原始的网格 - 没有MSAA(多重采样抗锯齿)处理
从静止图像上看起来可能很差,但是在动态情况下会下降一个数量级,尤其是当大部分像素以非常激进且分散的方式进行闪烁。
使用8倍MSAA可以极大的改善,但是不够完美,鉴于这种技术的成本,这实在令人遗憾:
图24:原始的网格 - 8倍MSAA处理
然而,采用基于纹理的解决方案,相比MSAA我们可以获得更清晰的图像,并且运动时的稳定性接近完美。
图25:优化后的网格,无MSAA
汽车渲染
随着仪表盘用户界面(UI)的发展,现在是时候解决最具挑战的部分了:在一款小型的嵌入式GPU上渲染整个车身,并细节化处理。
精细的汽车模型要可以从不同的角度环绕查看,驾驶员可以在仪表上看到他们的汽车模型,以及车辆周围的真实场景,这要借助车载摄像头、雷达或者激光雷达(LiDAR)。汽车厂商以及车主都希望仪表上显示的是真实的车辆,越精确越好,而不是简单的汽车模型。与表盘上的文本一样,在汽车渲染问题上省去很多的三角形无疑是一种简便的方式,但是想要获得更好的效果还有更好的方法,下面我们来详细介绍一下。
2.1 纹理的一些技巧
鉴于纹理在解决UI几何瓶颈方面取得的成功,由此推测它们在其他方面也会非常有用。以这个看起来还不错的汽车内饰为例。
但是这是通过简单的纹理技巧实现的,使得实际的几何形状非常简单。这是怎么实现的呢?这是法线贴图与烘焙光照的简单组合,可能需要花费一定的时间来创建,但是带来的成果确实巨大的。
最明显的想法是将小的细节绘制到纹理中。然而这种方法的结果不足以让人信服,必须更进一步让纹理可以控制光照。
2.1.1 法线贴图
法线贴图是降低仪表盘渲染成本的便捷方法,不幸的是应用到汽车时,我们遇到两个主要的问题:
① 汽车是三维的(与表盘不一样,表盘几乎是平的),如果要让车体的轮廓非常的光滑,则需要非常密集的网格。
② 法线贴图在精度上是有限的,包括纹理精度以及深度精度,这会导致纹理外观并不理想以及出现一些条带状的假象。
这是否意味着我们应该完全忽略法线贴图呢?绝对不是!它们在很多地方都非常有用,不仅仅是汽车车身。
例如在仪表案例中,我们将车轮压缩到其原始尺寸的1.5%,而且没有明显的质量损失:
图16:法线贴图可以大大减少汽车很多部位几何图形的数量
2.1.2 烘焙光照(Baked Lighting)
将高质量的网格光照投射到用于渲染的较低质量对象上是仿造细节的另一个好方法。环境光遮蔽(Ambient Occlusion)通常是首选的照明方式:它完全可以取代动态光照,甚至可以更好的提升动态光照,减少几何图形的散光程度,在场景中创建让人舒服的柔和阴影。
环境光遮蔽(Ambient Occlusion)用于漫反射以及反射效果调试是非常有效的,而且通常也是非常有用的工具。
图17:整个汽车的环境光遮蔽烘焙贴图
2.1.3 插曲:UV管理
如果将整个车身转换成纹理(大概是带有环境光遮蔽的情况),那么需要进行完全的UV展开。但是车体是相对比较大的对象,使用4K纹理囊括所有的细节,这在数量上是有限制的。好消息是车身是对称的,而且环境光遮蔽是完全独立的。这意味着车身一侧的UV可以与另一面的重合,合并成一个,从而可以节省大量的纹理空间。如果我们可以提前知道车身的哪部分不需要细致的渲染,我们也可以缩小这部分UV,把空间分给更重要的部分。
图18:巧妙的打包策略,在UV中将重复的对称部分进行重叠(红色高亮部分)
2.1.4 浮动
还需要渲染最小的按钮,螺钉和螺栓?好吧,这里有一个非常简单的方法,可以处理超级小和重复的细节,而不用创建超大的纹理资源。这个方法通常称为“浮动”——创建包含很多细节的纹理组合,在原始网格上渲染一层透明的网格。
图19:基本的仪表板渲染,3万个三角形
图20:采用“浮动”技术的仪表板:1138个三角形
显而易见,由于所有细节都在法线贴图中模拟,因此优化后的版本缺乏深度,除了这个缺点,它与整个模型对于光照和反射的方式是一样的。
注:在上面的示例中,此优化版本的1138个三角形中,超过1000个用于金属旋钮,这显然是浪费,应该进一步优化。
图21:仅浮动网格的仪表板
由于这些元素都是重复和映射的,纹理空间中它们是最小化的,如下使用“浮动”方法的256 x 256分辨率的法线贴图所示:
图22:“浮动”的法线贴图
为了变得更好,从一定距离来看纹理技巧往往非常稳定,仅限几何图形的系统肯定不是这种情况,如下图所示,呈现了难以接受的不同级别的锯齿现象:
图23:原始的网格 - 没有MSAA(多重采样抗锯齿)处理
从静止图像上看起来可能很差,但是在动态情况下会下降一个数量级,尤其是当大部分像素以非常激进且分散的方式进行闪烁。
使用8倍MSAA可以极大的改善,但是不够完美,鉴于这种技术的成本,这实在令人遗憾:
图24:原始的网格 - 8倍MSAA处理
然而,采用基于纹理的解决方案,相比MSAA我们可以获得更清晰的图像,并且运动时的稳定性接近完美。
图25:优化后的网格,无MSAA
举报