|
2020年12月9日,由腾讯游戏学院举办的第四届腾讯游戏开发者大会(Tencent Game Developers Conference,简称TGDC)于线上举行。来自腾讯互动娱乐NExT Studios的高级技术美术师金力和高级工程师李奇先生,分享了Photogrammetry技术的使用流程和实践经验。以下是文字实录:
大家好,我叫金力,我是一名技术美术,来自腾讯NExT工作室,今天我要分享的题目是《Photogrammetry在游戏领域中的应用》。这次分享主要由三部分组成,介绍Photogrammetry的美术制作流程,我们在实际应用中遇到的问题,还有Delight工具的介绍,最后一部分将由我的同事李奇做详细的介绍。
Photogrammetry介绍
Photogrammetry,近些年来,这个词在游戏领域越来越多地被提及。它是什么?它是一种通过对一系列照片里的图像信息做对比,测量,并把这些信息翻译成模型,贴图等有用信息的技术。他的输入是一系列照片,输出是一系列点云信息/3D模型信息。简而言之:使用这种技术我们可以通过对物体拍摄各个角度的照片,从而在软件里快速还原模型的形状和颜色。
让我们来更清楚地认识它,首先请看这两张照片,哪张是真实拍摄的照片,哪张是3D模型的截图吗?是右边这张 你猜对了吗?从肉眼上确实很难分清,这也是Photogrammetry的优点:还原真实性。
接下来让我们更仔细地了解它。首先它是一组点云数据,并且通过点云生成模型数据。最后再把照片的颜色投射到模型上。
这个模型是我用手机,在我的办公桌前拍摄的,一共拍了27张,并导入软件输出的,整个模型的生成过程耗时不超过15分钟。
那么它有什么优缺点呢:优点是快速高模的生成,精准的外形还原,以及真实的颜色还原。例如照片里的头骨,可能通常美术需要一周甚至更久去制作高模和它的颜色信息,而使用Photogrammetry可以在短短数小时完成。但是前提就如它的缺点。
1. 一定需要有实际可拍摄的物体,对于非写实类的没有办法制作。
2. 拍摄时非常依赖有良好的光照环境,棚拍需要打灯,外拍需要选择阴天以避免生成贴图上的强烈阴影 。
3. 对于表面光泽度较高的物体,没有办法生成模型。
Photogrammetry已经在大量的写实类游戏里广泛应用。例如EA的《战地》,《星战系列》以及《FIFA》系列。育碧的《刺客信条》等游戏里都有大量应用。极大地提高真实度的同时,并极大地缩短了一些物件的制作周期。
另外Photogrammetry在其他领域也有很多用武之地,比如对古生物化石和古文物的数字化保存。对地貌的三维重建。甚至可以通过显微镜拍摄的照片,制作微生物的三维模型!可以说只要照片能拍清楚,它都能用。
这样一个技术如何应用到游戏制作呢?我们梳理了一下美术的制作流程,分为拍摄照片、照片校色、模型/颜色生成、模型优化、贴图烘培、导入引擎。和普通美术管线相比,可以看出Photogrammetry的另一个优势在于高模的制作周期极大地缩短。
Photogrammetry的制作流程
首先是设备的选择:
推荐采用单反相机,可以输出Raw格式方便后期校色,更好EV控制和更高的成像质量。镜头采用可变焦镜头针对不同的环境。外拍记忆卡和电池要准备充足。准备好色卡,测量卷尺。
调整相机到手动M档,固定白平衡,输出格式为RAW方便后期校色。
选定拍摄目标后,使用色卡的18灰卡面确定相机在当前环境下的曝光。调节ISO,快门速度以及光圈让当前环境下,相机的曝光达到一个合理的范围。拍摄物体前,先拍摄色卡。
对物体进行拍摄时,要保持刚才调节好的相机参数中途不要修改。每一张照片需要保证和另一张有20-30%的重叠区域。对焦方式自动单点对焦AF-S以拍摄物体为中心,大约每15度拍摄一张照片,蹲拍,立拍,俯拍保证各个角度都有覆盖。最后检查是否有模糊/失焦的照片,补拍。右边的图每个小点代表相机位置。
对于一些高大的建筑,可以借助无人机来拍摄高处。 这座教堂是位于佘山顶上的教堂, 我们借助无人机一共拍摄了2000多张各个角度的照片进行还原。
色卡校色:为什么要校色?相机不同,照片颜色不同,需要还原真实。对拍摄色卡的RAW格式照片校色,对其颜色,白平衡,曝光这三项进行校准,生成颜色配置文件。并使用配置文件,对一系列照片进行批量的校色,
3D模型生成。主要使用软件:Reality capture、Photoscan。输入:校色完成的照片。输出:高模,顶点色,颜色贴图。(高模的面数需要限制,不然可能打不开3000w左右)
高模生成结束以后,由于它的面数非常高,模型复杂程度从数百万到数千万。我们需要先优化它的面数,再Zbrush里把这个石雕的面数从800W降低到了1.4W(可以用zRemesher对拓扑做一次优化)。
优化完面数的模型导入Maya/Max进行拓扑修正和UV展开,为之后的贴图烘培做准备。
之前导出的高模包含了模型和自身的颜色贴图。把这些信息以贴图的形式烘培到制作好的低模UV上。
烘培的贴图有basecolor, Tangent normal和AO贴图。
除此之外,我们PBR管线还需要Roughness和metallic贴图。由于我们拍摄的模型都是粗糙的非金属模型,可以用。用basecolor 和 normalmap推算出大致的roughness。
并且把Metallic和Roughness以及AO贴图,分别存到一张贴图的RGB通道里,以减少材质里使用的贴图数量。
最后把低模,和烘培好的贴图一起导入引擎,把贴图输入到材质的相应通道,并赋予模型就大功告成了。
以上就是大致的工作流程。
这是一些我们用扫描还原到引擎的模型展示。包含航拍建筑,古建筑,石雕,树木,石头,砖墙,甚至时一些人为去除高光的车辆模型。都可以采用Photogrammetry去还原他们的真实面貌。
没时间?没预算?但是没有问题!
这是我们的一次拍摄和制作经历。实际上期间遇到了非常多的问题。
我们的目标是一个废弃的厂房。事先我们在网上寻找合适的目标,并最终选定了一个即将要拆除的工厂。我们在地图上大致上找了一些参考,并且有一些简单的拍摄规划,但由于厂区是不对外开放的,谁也不知道里面究竟如何,我们能否取到有用的素材。
最终,在有限的经费和协商下,我们有了一天进场拍摄的机会。 我们按照事先的分配对工厂的各个角落进行取材,最终收集到了大约5000多张照片,并从中筛选出大约69个可还原的模型。但是,我们只有4位美术师,由于年底,每周只能工作3-5小时,而我们的deadline 是2个月后。
而困扰我们的另一个问题是,由于事先没有机会实地考察,有一些规划要拍摄的东西和实际上看到的有较大的出入,有些无法取景。这就让我们反思了关卡的制作流程。
普通来说,一个关卡的制作可以概括为“原画设计-白盒制作-模型制作-白盒替换”,基本上要做的东西都是实现规划好的,模型也是人工制作的。
但对我们来说,即使制作了白盒模型,实地也不一定可以取材到合适的模型去替换。 我们所拥有的是大量的实际扫描数据。这就让我么重新指定了计划,从现有的模型里选择合适的来搭建关卡。
看到这个让我们非常绝望,以我们的预算和人力,是不可能在短时间内把所有的模型都按照之前介绍的流程做好,并导入引擎,交给关卡设计师的。
所以我们重新定义了美术制作管线。我们必须要自动化处理大部分模型,把这部分自动处理的模型定义为placeholder,可以作为预览或者远景。先交给场景搭建,并且在有限的人力下,合理选择模型做人工优化处理。
我们加入了houdini自动生成管线,对生成的超高模进行自动减面和拓扑。
自动进行uv展开,并且烘培贴图,以及自动lod的制作。不得不说,自动处理的模型和人工对比,大部分是有缺陷的,比如拓扑和uv。但是也有一部分形状较简单的是可以处理较好的,比如这个物件。
之前说的roughness贴图生成和贴图合并,我们使用了substance designer对他们进行处理。
但这样就可以了吗?不,外拍的时候由于天气原因,照片上多少都会带有一些阴影,或者有些是背光的面,会比较暗。而我们的base color不可以包含阴影。所以我们也开发了工具并在自动化流程里也加入了对basecolor的去阴影处理。
最终我们在3天内自动生成所有place holder模型,供场景美术进行关卡摆放设计,并把时间留给后续逐步人工优化近处的物件。
这是引擎里截取的场景的一些角落。借助delight工具对贴图进行了去光照处理,我们可以给场景加入一些时间上的变化。
Delight工具介绍
大家好,我叫李奇,来自NExT工作室。刚才金力已经大致介绍了一下我们工作室Photogrammetry的内容生产管线,接下来由我介绍一下,我们在去光照上做的工作。
那为什么要去光照呢?我们用来建模的照片,都是在外面不同的环境下拍摄的,在不同的光照环境下,照片带有外界的各种光照信息,生成的三维模型的贴图也是由多张照片采集而来的平均色。
我们有时候无法选择在什么条件下完成模型拍摄任务,就像这个模型一样,完成建模以后效果是这样子的,是有影子的。
导入引擎中的使用的话,肯定在会在不同环境光照下使用。必须得想办法把光照给去除,这样才可以重新在引擎中打光。
所以我们提出了一个可以去掉太阳光影子的方案。
首先我们需要准备一些贴图数据。因为我们在工具中不会直接使用模型数据,所以我们会由模型生成位置贴图和法线贴图来使用。可以使用高模烘焙,也可以使用简单的 Shader 来转写。
下一步,我们需要在模型视图上指定两个点,我们可以通过这两个点的位置简单的算出直射光的方向。
有了直射光方向,我们便可以渲染模型自身的Shadow Map。然后在通过跟刚才生成贴图,一样的方式生成 Shadow Mask。这样我们便得到了哪里处于影子中的信息。
我们需要申请两张五维的 LUT,以贴图读取的位置和法线经纬度为坐标,将亮暗面的颜色累加到对应的位置上,得到亮面和暗面的平均色信息。
然后为 LUT 生成 Mips。将相邻的像素的颜色和权重加起来,获得更为平均的颜色信息。这样可以保证采样时每一个坐标都会有采样值可用。
以两张 LUT 在相同坐标下,查询到的颜色值计算出亮度差,然后直接应用到漫反射贴图上,即可得到去光照的结果。
为了改善结果,还要为LUT采样实现线性插值来改善效果。左边为未插值的结果,右边为实现插值后的结果,可见效果有明显改善。
完成去光照以后,模型在无光模式下,渲染出来是这样子的。左边是未去光照的对比图。
但是在用这个方法,对一些颜色比较复杂的模型进行去光照,可能会有颜色溢出的情况,导致结果不够理想。于是我们提出了第二个方法。
首先先对影子做边缘提取,只保留位置和法线都连续的地方,这样可以避免UV接缝影响结果。
以找到的边缘作为中心,采集一定区域大小的像素的平均色,这个大小是可配置的,比如64x64,分成两暗两个部分的平均色,其中亮面部分在计算光源亮度时考虑法线方向的影响。
然后以位置为坐标采集到一张 LUT 中,这样 LUT 就保存着区域的光照信息,再对漫反射贴图的每一个对应的点采样就可以拿到对应的亮度差,应用到暗面像素上即可去光照。
这是去光照以后的结果,左边为使用原始贴图的模型。
作为对比,左边是 Agisoft 工具去直射光的结果,右边是我们的结果。
我们还实现了去环境光遮蔽的功能,算法主要参考自 Unity,主要原理是收集平均色,然后通过多次 LUT 采集和采样让整体颜色和亮度都更接近平均值。
我们将整套去光照流程,包括直射光的指定和贴图的生成也都集成在 Houdini 中,与之前介绍的整个自动处理管线也很好的结合在一起。
来源:腾讯游戏学院
原文:https://mp.weixin.qq.com/s/34_a59v08KXTiyImYE9P9Q
|
|