室内映射:高效室内渲染方法简述
腾讯互动娱乐 技术美术
| 导语
Interior Mapping 是一种用于实现建筑室内结构在游戏、虚拟现实、建筑可视化等领域内的高效渲染技术。相比于传统的建模渲染或者贴贴图,Interior Mapping 可以在保持高效率和高质量的同时,将室内的细节和灯光效果呈现得更为逼真。因此,它极大地拓展了虚拟建筑场景的可能性。
前言
Interior Mapping(室内映射)技术在游戏中有着广泛运用,其通过在建筑物表面上贴上模拟室内结构的纹理方式,产生具有逼真室内的视觉效果。由于Interior Mapping使用贴图和材质计算来实现室内立体空间视效,避免了使用实际模型带来的三角面数的增加,适合城市建筑群等中大规模场景的渲染。大家熟知的《黎明觉醒》《蜘蛛侠》《城市天际线》《美末2》《黑客帝国觉醒》等,都采用了此技术。
[ 《蜘蛛侠》效果展示 ]
Interior Mapping常见的采样的纹理有两种,分别是立方贴图(CubeMap)和2D贴图。本文将分别展示这两种方法的实现,并简要分析其对应的材质计算原理。尽管 Interior Mapping 提供了一种简便的室内效果模拟方法,但其表现仍无法完全取代完整的三维室内建模。为此,本文还将介绍一些技巧,以尽可能提高该效果的真实性。
1
Interior map纹理准备
Interior map可以选择两种形式的贴图进行展示:CubeMap贴图和2D贴图。选择这两种贴图形式各有优劣。
CubeMap的优点在于它的立体表现最好,也可以更灵活地调节深度;而且由于它存储了6个面的信息,可以通过对CubeMap随机旋转获得四种表现。缺点是同时它也会有比较大的存储量,并且不好编辑。用于室内模拟的CubeMap可以通过UE引擎中的Scene Capture Cube组件对室内拍摄轴对称立方体贴图获取,参考:(2) Basic Interior Mapping Shader | Unreal Engine - YouTube。如果使用普通的、常用于提供光照环境的CubeMap有可能出现六面墙无法对齐的情况。
CubeMap使用的贴图示例:
CubeMap Interior Map 深度调整:
CubeMap Interior Map 角度随机:
也可以用预先投影的2D图代替CubeMap,好处是2D贴图方便做图集,缺点是这样的2D图如果调整深度会有边缘上的拉伸。在ArtStation - Forza Horizon 4 - Buildings能找到《极限竞速:地平线4》制作时使用的内部贴图图集。
预投影的2D贴图示例:
2D Interior Map 深度调整:
综上,CubeMap的视觉表现更好,而预投影的2D贴图有更好的性能。
2
Interior map材质实现
如果是基于CubeMap的interior mapping,需先现在切线空间计算射线与立方体内表面的交点P,以P的坐标作为UVW采样CubeMap。使用切线空间的原因是这样即便在曲面上,虚拟立方体的表面依旧是能和曲面对齐的。
在UE引擎中内置的InteriorCubemap函数实现的就是这一功能。
其中,完成UVW计算的部分为:
这一材质函数剩下的部分完成了一个对CubeMap随机旋转的计算。
在这里笔者简单讲解一下这一UVW的计算思路。要想计算视线射线与虚拟房间立方体相交的点,这里用到的是AABB(Axis-Aligned Bounding Box,轴对齐包围盒)算法。算法整体如下:
1.将相机向量转换到切线空间计算射线向量。这里取倒数是为了更方便计算下一步AABB算法计算交点。
2.使用UV计算入射位置。此处观察的像素点即为射线开始发射的起点。在这一计算空间中我们把坐标点放在中心点,并且将单轴范围限制在了(-1,1),因此我们的立方体表示为(Bmin,Bmax),Bmin=(-1,-1,-1),Bmax=(1,1,1)。
3.AABB求交计算。首先我们需要计算射线穿过AABB立方体每个平面的参数t,对于每个平面我们可以使用以下公式:
tX1 = (minX - x0) / dx;
tX2 = (maxX - x0) / dx;
接下来找到t在各个方向上的最小和最大值,即交点范围:
tmin= max(min(tX1, tX2), min(tY1, tY2), min(tZ1, tZ2));
tmax= min(max(tX1, tX2), max(tY1, tY2), max(tZ1, tZ2));
最后如果tmin <= tmax且tmax > 0,则说明射线与AABB立方体相交。
值得一提的是,由于这里我们只在乎射线与立方体相交中的更远的那个交点,即tmax,因此我们这里也只计算了这个值。但由于AABB的特性,根据射线方向计算出的tmin值可能大于tmax值,因此当 t2 小于 t1 时,我们需要交换它们的值。即,当射线方向的x分量大于等于0时,用最大边界值减去射线原点x坐标除以射线方向的x分量来计算tmax;当射线方向的x分量小于0时,用最小边界值减去射线原点x坐标除以射线方向的x分量来计算tmax。其他方向同理。
if(dx>=0)
{
tmin = (minX - x0)/dx;
tmax = (maxX - x0)/dx;
}
else
{
tmin = (maxX - x0)/dx;
tmax = (minX - x0)/dx;
}
节点算法这里做了进一步的优化,通过增加绝对值的方式替代了上面的分支计算。从而保证了我们计算得到的tmax一定是大于tmin的。
最后交换交点坐标顺序得到正确的UVW。
至此得到的UVW就可以用于采样CubeMap了。如果需要控制深度,可以调节FarFrac参数缩放切线空间的z轴的值。同理也可以这样调节室内CubeMap的长宽比例。
基于2D图和基于CubeMap的interior mapping算法的前半部分相同,在求出p点坐标后,再用P.z缩放P.xy获得2D uv,然后采样2D图即可。
2D贴图整体节点实现图如下:
3
Interior map 材质优化
Interior map虽然提供了很好的室内立体视觉效果,但只有Interior map制作的假窗户视觉效果是单调的。这一技术通常与以下手段配合使用,以获得更好的材质表现。
1.更多层次感:增加玻璃细节和窗帘
除了立体的室内环境,一个逼真的玻璃窗还应该有玻璃、窗框、窗帘等修饰。对于玻璃,可以增加反射、折射、破损和脏渍效果,使其视觉效果更加丰富。对于使用2D纹理进行采样的假室内效果,在观察视线与平面法线夹角较小的情况下容易出现边缘上的拉伸,而增强玻璃的菲涅尔反射可以有效地掩饰这点瑕疵。窗帘具有漫反射和半透明纹理,可以不让室内的自发光透过厚实的窗帘,半透明的百叶窗,和复杂的花边。窗帘贴图和室内贴图排列组合使用,可以得到更多窗户变体。
[ 图源:《interior mapping进阶》(https://zhuanlan.zhihu.com/p/509190380) ]
2.增加家具:视差贴图和“3D打印”
无论是CubeMap还是2D纹理,只能对“靠墙”的元素有好的表现。因此纹理中的元素通常是书架、木地板、带图案的墙纸、挂画,以及部分靠墙家具。如果是室内正中心的沙发、桌子这样的元素则无法表现其立体度。对于这种家具,有两种解决办法:
• 视差贴图:使用Bump offset增加一层或者多层家具图层,使其居于不同的深度,从而产生更丰富的视觉效果。这个方法的优势在于简单高效,缺点在于它本身还是一个2D的平面,构成的立体感有限。
[ 图源:[技术演讲]黑客帝国觉醒:创造世界(https://www.bilibili.com/video/BV1TP4y1T7Pj/?vd_source=7dea786fd58db72c7f661df3d81ed44f) ]
• 3D打印家具:这一方法是由《黑客帝国觉醒》提出的,本质是一个从后向前逐步推进的一个bump offset计算。为了完成这个效果需要提供前后的深度图以及HDR图。这一方法得到的结果并不是如同raymarch一张体积贴图那样准确,但是相应的需要提供的贴图更简单,并且在假室内这个场景下效果适用。
[ 视频:Looking at the interior mapping used in The Matrix Awakens: An Unreal Engine 5 Experience - YouTube ]
3.光影调节
在《黑客帝国觉醒》中,可以为每扇窗户添加随机色温和曝光的变化,从而增加材质变体。同时可以通过调整室内自发光强度,调整是否亮灯,从而实现昼夜的改变。
在Andrew Gotow的工作中还提到了一种为室内环境增加天光的投影的方法。这一方法更适合模拟白天的室内环境,太阳直射光会透过玻璃投射阴影,并且这一阴影会随着阳光角度移动。这一阴影的计算相对简单,我们可以将窗框的Alpha通道作为阴影蒙版,认为不透明的区域会投射阴影,根据之前计算interior map得到的交点的位置,根据太阳光方向向后投射光线,得到射线与外墙的交点,并且采样外墙窗框的Alpha通道即可。更进一步地,还可以使用SDF贴图实现软阴影效果,并且进行阴影软硬的调节。
[ 视频:Interior Mapping – Part 3 | Andrew Gotow ]
4
总结
Interior Mapping作为一种高效的室内模拟方法,在2008 CGI会议上由Joost van Dongen提出。在现在的游戏、VR等领域仍具备显著的性能优化及视觉体验提升价值。在未来,Interior Mapping有望不断发展和改进,为我们带来更出色的效果。
参考资料:
【1】案例学习——Interior Mapping 室内映射(假室内效果), https://zhuanlan.zhihu.com/p/376762518
【2】interior mapping进阶, https://zhuanlan.zhihu.com/p/509190380
【3】剖析UE5《黑客帝国:觉醒》窗户系统—1.窗户材质, https://zhuanlan.zhihu.com/p/561140341
互动有奖!
我们将在2023年9月8日抽出3名幸运粉丝,分别送出100Q币。参与方式如下:①点击文末右下角的“在看”②评论留言③发送关键词“打卡”至公众号后台完成验证