Please enable Javascript to view the contents

贴图精度问题的“一揽子”解决方案

 ·  ☕ 5 分钟

前言

    本文主要是针对实时渲染的 3D 场景实践过程中贴图精度问题多种解决方案的整理。

遇到的问题

    在 3D 场景中我们可以大概将物体分为 “远”,“中”,“近” 3 个层次。这里的层次是按照摄像机所能到达距离物体最近的位置划分的。举个例子:
一个物体离我们的摄像机很远,但是我们是能够移动到它很近的地方。这时虽然他在远处,但是他也是属于近处的物体,因为我们可以通过移动离他很近。那什么属于“远”这个层次呢?很简单的例子就是场景远处的山。这些山离我们很远,而且我们也无法到达,无情的沦为为“工具人”充当背景板,这时我们说这些山属于“远”这个层次。

    对于 “远” 这个层次来说,因为距离问题,本身就很难看到物体的细节,再加上场景中的一些物体遮挡,雾效果,后期特效等等最后我们能看到的信息十分有限,很多时候直接放张图片在那都很难分辨出来。所以一般这个层次的物体主要追求轮廓和“感觉”。

    对于 “中” 这个层次来说,我们只能够观察到它比较大的细节,细微的细节也会被淡化掉。所以一般这个层次物体主要追求线条和色彩的变化,有时还需要考虑它在场景中的功能确定具体的位置。

    对于 “近” 这个层次来说,它需要有场景最多的细节表现,因为我们的摄像机很有可能直接“贴”在物体上看。这也是本文问题要讨论的层次。

    上面提到了物体的层次划分方式,对于“近”处的物体来说,我们并不能控制它的尺寸。有的物体是地上一个小石子,有的是插入云层的摩天大楼。而目前对于计算机来讲,贴图尺寸并不能是任意大小,一般都会规定一些尺寸范围和约束(例如必须是 2 的次幂),我们可以从中选择,例如 1024x1024, 4096x4096。如果我们单纯拿贴图和物体一对一的话就会发生小石头的贴图尺寸和摩天大楼的一样大,这就会出现石头的贴图浪费掉了,而摩天大楼的贴图空间不够,就算用着 4K 的贴图在我们眼里依然是模糊的一片。为了解决这个问题我就需要针对场景的需求对不同的物体采用不同的解决方案。

解决方案概述

    一般来说根据你所设计的场景风格往往会有一个需要精度的上限。例如对于 Lowploy 风格来讲整个场景使用一张充当调色板的贴图就够了。

而对于写实风格来讲更高的精度就能承载更对的细节,所以制作者就会在考虑成本和大众市场的终端性能前提下尽可能利用更高的精度来满足自己在细节上的艺术表现力。

作为创作者,我们需要结合自身能力,成本,目标平台兼容性等诸多方面因素最终确定自己选择什么样的风格,需要多大的精度。

这里就不得不提到一个很多人的错觉,那就是 2D 像素风比大部分 3D 场景制作简单吗?答案当然是否定的,因为像素风对精度的限制,会对创作者有更高的艺术要求,在加上创作工具上面的限制,所以很多不是很复杂的 3D 场景可能比 2D 的像素风更加容易制作。

    上文对精度的选择做了一下阐述,目的是说在精度方面 “极大” 和 “极小” 都对制作者有着较高的要求。而对于初学者选择“中庸”更加保险,既不会让我们为数不多的想法难于表现,也不会过度浪费贴图空间。我们下面讨论的具体解决方案也会主要聚焦在这个层次。下文我会把我选择这种 “中庸” 的精度叫做目标精度。

小物件的解决方案

    小物件主要的问题是贴图空间的浪费。小物件本身的尺寸较小,在匹配目标精度的过程中很可能完全不需要很大的贴图,如果每个物件都对应一张贴图明显会很浪费。而且因为小物件一般种类繁多,过多的贴图加载也会对性能造成不利影响。对此我们可以选择将多个物件打包到一张贴图上。

上图下方就是将多个招牌的内容都打包到一张贴图里以节省空间。

大物体的解决方案

    大物体的问题主要是我们无法把所有部分简单的打包进一张贴图。这时就需要根据具体情况做不同的处理。

模块化拆分

    首先要试图进行模块化拆分。例如一个楼房可能他的墙体和窗户都是高度相似的,我们可以把它拆分成一种或者几种窗户,墙,大门的模块化部分,然后再在场景中不断重复利用每个部分。

处理相似部分

    像科幻或者偏工业风格的场景一般都会有很多形状以某种形式重复的部分,最常见的就是左右对称的物体。其实我们完全可以在拆 UV 的时候将它们合并在一起,自己稍微处理一下接缝就能省下很可观的贴图空间。

    上面的策略可能不适用于所有物体,或者拆分之后还是很复杂。这时还可以根据不同材质再拆分为不同的部分。针对不同部分还可以分为例如:

规则形状物体

    这里拿柱类物体举例。柱类物体的问题是在某个方向上尺寸非常长。例如我们想做一个立交桥的石墩,就会遇到这种问题。一种非常简单的解决方案就是制作贴图时保证其是二方连续的,然后在拆分几何体 UV 的时候保证长边与贴图连续方向一致,宽边在贴图元素内就可以了。

    如果是四方连续的贴图(例如各种网格贴图)更加简单,只要保证长边的方向在四方的任意一方,并且不产生明显接缝接可以了,这主要考验制作者对 UV 基础的理解。

不规则形状物体

    在经过层层拆分后依然还是不规则且不能满足精度要求的物体其实不是很多,比较有代表性的就是像龙头这样的雕刻物体。如果是大型静态物体可以考虑根据精度和摄像机的视角把他切成多个物体,尽量避免在镜头中出现接缝。更规范一点的就是利用多象限技术(UDIM)解决。不过这其实也变相增加了贴图使用量。不过目前针对这个还没接触到更好的方案。好在如果不做大型生物(类似 MHR),这种问题占比较低,一般不会特别影响画面表现。

在设计阶段尽量规避问题

    虽然上面列出了很多解决方案,不过这都是对于一些我们无法控制部分的补救措施。在我们制作场景时我们可以利用设计来避免很多问题。假如把场景更好的分割成模块化,在容易产生接缝的地方添加其他结构来避免,奇形物体利用结构设计来自然分段等等。总之设计并不只是纯粹的艺术,还有很多实践经验在里面。

分享

saberuster
作者
saberuster
一个喜欢编程和折腾的追风少年