以下文章来源于NExT Studios ,作者李奇
编者按:
2017年,故宫推出“VR博物馆”,借助3D扫描、VR、全景等先进技术,让游客突破了时空限制,摇身变成古人,在鲜活的历史场景中行走、触摸和体验。这项技术并不是只能重建放在博物馆的藏品这样的小型物体,对单座古建筑或整体建筑群,大型雕塑,或难以搬动的室外文物等的建模重建同样意义重大。这无疑展示出了三维数字技术(照相建模)在文博考古行业的巨大发展潜力。
上一期我们分享了Photogrammetry(照相建模法)的生产管线流程,提到在外拍时受天气影响,照片多少会有一些阴影,为了在引擎中重新着色需要去除这些环境关照信息才可以。所以我们同时开发了Delight(去光照)工具,本文将重点分享去光照的一些方法。
作者:李奇,NExT程序员。资深单机游戏玩家一枚,早到已经不记得几岁开始玩游戏的。偶尔会借NExT Game Jam过过游戏开发的瘾。
在NExT Game Jam现场演示Demo《目隐》
进入正题前,我想分享下MEGA Photogrammetry的Demo视频,让大家对照相建模法有更直观的感知。
当今引擎都是遵循基于物理渲染(Physically Based Rendering)理念的渲染管线,在游戏引擎实际渲染时所使用的漫反射贴图(Base Color Map)应该是不带任何光照信息的材质反射率信息。
比较理想的拍摄环境应该是没有阳光但又能保持一定亮度的阴天,但实际拍摄情况和场所总是有诸多限制,并不能保证我们每次拍摄都是如此理想的环境,采集到的环境光照一般都比较复杂。
下图是截取自Unity Delight工具介绍视频的演示,明显左侧模型还带着拍摄时的光照,右侧模型经过去光照以后可以正常融入不同光照的场景中。
就像下方左图模型一样,很明显是带光照的,那么它由建模软件生成的漫反射贴图也是带光照、阴影的,会和虚拟场景里的灯光以及这些灯光计算的实时阴影产生冲突,我们需要使用去光照的手段来处理,才可以让游戏引擎按照当前的场景风格、时间、天气等布置光源,经由实时计算或离线烘焙重新进行光照计算,正常融入场景中。
有时采集条件受限,我们得在有太阳光影响的条件下进行拍摄任务。
由于现存重建技术的问题,我们基本只能采集粗糙表面的物体,所以我们假定物体一定是粗糙并不带任何高光的。由于现存技术的限制,高光将会被自动平均化移除。我们将在以上假定的前提下进行去光照的还原计算。我们参考了现有的方案实现了环境光去光照。现存的闭源或开源的环境光或直射光去光照方案对直射光所产生的影子的去除结果都不理想,常常存在去不干净或者颜色溢出的情况,所以我们提出了一个更好的去光照方法。
首先需要准备一些贴图数据,因为在去光照工具中不会直接使用模型数据,我们需要生成下方左侧的位置贴图(Position Map)跟右侧的法线贴图(Normal Map),才可以在工具里面完成剩下的Delight工作。这两张贴图如果使用模型数据转写,可以在 Vertex Shader 中让模型顶点直接使用 UV 坐标,然后正常光栅化即可简单将顶点间插值的数据写入贴图。也可以结合到自动化管线中,由 Houdini(三维计算机图形软件) 直接烘焙所需贴图。
然后需要在模型上面,指定两个点,就像下图一样,指定影子投影的原点,还有影子投出去以后的位置点,指定完以后,我们得到了一个直射光的方向信息。
有了直射光方向,我们便可以渲染模型自身的Shadow Map,把它直接转写成UV空间的Mask,用来标记哪部分是在影子里,哪部分不在影子里。
后续去光照需要实现一个通用的LUT(Lookup Table 颜色查找表)工具类,可以由模板参数指定任意维度和通道。需要实现以下功能:
1)支持任意维度和通道格式;
2)带权重的采集功能;
3)任意维度采样插值;
4)带权重累加值的Mips;
为LUT生成Mips,将相邻的像素和颜色权重加起来获得平均的颜色信息,这样就可以保证每一个坐标都有采样值可用,而且其也拿到了更平均化的信息。
我们实际上还为LUT采样,实现了线性插值,以改善结果。下方左图是没有插值的结果,右图是插值后的结果,可以看到去光照有明显的改善。
我们主要采用了Unity Delighting Tool的算法,实现了环境光去光照,主要原理是采集环境光照LUT,然后通过多次的LUT采集和采样,让整体颜色和亮度都更接近平均值。
主要流程如下:
1)生成所需世界法线、环境光遮蔽、可见性法线贴图;
2)计算贴图的平均色;
3)将表面颜色与平均色的亮度差采集到的法线经纬度坐标的环境光照LUT;
4)应用查询LUT得到的环境光照信息去光照。
我们实现了去环境光遮蔽的结果可参见下图右侧。
上述环境光去光照算法在处理有太阳光(直射光)照射的模型时效果不佳,无法很好地移除直射光产生的阴影。在去除的投影是自投影,或者投影的图元也同样是生成模型的一部分的前提下,我们可以通过指定投影特征原点、影子特征点来判断是否处于阴影之中。有了这些信息,我们就可以通过计算平均亮度差或者平均光照强度,并去除直射光光照。主要流程如下:
1)生成所需位置、法线贴图;
2)在模型上指定原点和投影点得到直射光方向并生成 Shadow Mask;
3)采集非阴影区域平均颜色信息到LUT;
4)采集阴影区域平均颜色信息到 LUT;
5)查询两张 LUT 对应位置得到亮度差进行去光照;
6)对边缘进行亮度平均化后期处理;
我们实际上用了两张五维的LUT,以贴图读取的位置和法线经纬度为坐标,对漫反射贴图的每一个像素进行采集,然后将亮面和暗面的颜色累计到两张LUT上,得到亮面和暗面的平均色信息。
对漫反射贴图的每一个像素,我们使用它的位置还有法线方向信息,对两个LUT分别进行查询并计算亮度差,然后再用亮度差对阴影的部分进行Delight,就能得到去光照后的结果。
以下是模型渲染结果。
这个方法处理大多数模型没什么问题,但有些颜色比较复杂的模型,用这个方法可能会有颜色溢出的情况,导致结果不够理想,所以我们还提出了第二个方法——影子边缘提取。
首先对影子的Mask做边缘提取,只保留位置和法线都连续的地方,这样可以避免UV接缝的地方影响结果,以找到边缘为中心,采集一定区域的像素的平均色,这个大小是可以配置的,比如64×64,分成亮暗两个部分的平均色,其中亮部在采集的时候就要考虑法线方向的影响。
然后以位置为坐标,将刚才计算出来的光源亮度采集到一张LUT里面,这样LUT就保存着区域的光照信息,再对阴影中的像素,进行LUT的查询,既可拿到亮度信息,然后就可以去光照。
这是去光照以后的结果,下方左图为原始模型,右图为去光照以后的模型。
作为对比,左边是Agisoft去光照工具生成的结果,右边是我们的Delight工具生成的结果,这样看来,会更加自然一点。
这是最终去光照的结果。
我们现在将整套去光照流程,包括直射光的指定和贴图的生成也都集成在Houdini(三维计算机图形软件)中,与之前介绍的整个自动处理管线流程也很好地结合在了一起。
以上就是我们在去光照上做的工作。
后记
Photogrammetry(照相建模)技术尤其适合于忠实还原经过时间和自然冲刷,有大量自然形成的不规则细节的物体。例如古建筑,残破雕塑,或者是存在大面积精美细节的物体。这些原来如果要靠人工完成建模的话,即使有经验丰富技术高超的建模师也往往需要投入1-2个月的时间处理一个模型,而且还不能保证百分百忠实还原。因此,此技术极大地减小了在建模方面的人力投入,并且保证还原的真实度,具有非常大的研究价值。
文/李奇
来源:NExT Studios
|