Real-Time Photometric Registration from Arbitrary Geometry
个人总结
- 作者用CIE LAB颜色空间的亮度值作为最终渲染结果的光照部分,通过最小二乘解超定的线性方程组来得到近似的光源SH系数。
- 鲁棒那部分剔除了遮蔽严重的点(没什么入射光),还搞了采样点的归一化。
- 光照估计所得的光照解在所有点上都可以用,所以一帧内计算一次光照解,只是辐射传输中的可见性部分每一点都不一样,所以一帧内每个像素都要算一次辐射传输,文中只是每n个点计算一次,没计算的点用插值求其辐射传输。而且文中用了差分渲染,辐射传输就因此算了纯真实世界和混合世界两次辐射传输,比较耗时。
- 申明光源为远光,所以镜头里面的光源是没办法测的。
- 这篇文章并没有实现全局光照,用的是漫反射阴影模型,倒是能实现真实场景和虚拟物体之间的阴影交互。
- 槽点,公式表示有点非主流甚至有问题,这个ISMAR只是ccf-c类会议,球谐函数感觉还是看Robin Green那篇(下面有传送门)比较舒服,网上也有他的翻译博客。
摘要
本文提出一套新颖的非侵入式的系统,用任意的场景几何体作为光照估计(Registration)的光探针,还提出了一个支持实时全局光照技术的通用AR渲染管线。基于当时最好的实时几何重构,论文展示了如何鲁棒地区出光照估计所需的数据,去模拟出真实世界的漫反射光照。论文基于球谐函数,通过观察被重构模型(reconstructed model)来估计光。
1.问题描述
要将虚拟物体渲染到AR中,需要解决两个问题:光照估计和模拟逼真的光照。前者关注测量环境,通过重构估计几何结构就可以达到正确的遮蔽效果。
论文解决了实时光照环境的估计问题。对于AR这种实时应用,要在相机一帧的时间内解决一个光照逆向计算问题。
真实世界的光照条件是第二个问题的必须输入。
2.文章贡献
不需要侵入式的光探针就可以恢复环境的光照条件。它们用在AR渲染管线里的解决方案是基于球谐函数(SH,spherical harmonic)和体数据光线投射技术的。论文还提出一种方法,用来提高光照估计的鲁棒性和系统地评估合成的/真实世界的数据。
论文利用方向光和场景物体表面的辐射传输的SH表示,达到了准确的光照效果。物体遮挡的处理使用了KinectFusion[13]提出的实时密度重构算法。差分渲染[2]被用来建模真实世界和虚拟物体之间的相互影响。
输入:RGB图像和深度图。限制光照的颜色为白色,物体表面被假设是具有任意表面颜色和纹理的朗博体。
论文的方法能达到交互级别的帧率【其实就5Hz】,也不需要提供任何运行时的人工输入。
3.光照估计
本文主要研究范围是远光场,它代表半球上所有的入射光线。远光场的假设意味着我们可以分开处理光源和场景。
3.1用SH进行光照估计
入射光、观察者和场景几何结构的基本关系见以下反射方程(公式1)。
表面点记为,出射方向【个人理解是到观察者的方向】记为,表面法线记为。整个公式由三项组成,表面纹理,表面的双线性反射分布函数(BRDF),x点上关于的入射光。
这里的没有考虑镜面材质,也没有解决光源颜色和纹理颜色的歧义,这里假设光的颜色为白色,颜色仅仅来源于纹理本身。光源是动态变化的,并且假设为是远光,这意味着整个表面受光均匀。
引入LearnOpenGL-CN上的反射公式做BRDF项的对照
传送门:https://learnopengl-cn.github.io/07%20PBR/01%20Theory/
公式1*是对一个以点为球心法线方向上的半球领域内所有方向上的入射光进行积分。是BRDF项。
和Lambertian BRDF模型公式(可以看做是的特化版本),只涉及漫反射。表示表面颜色。
对照小结:公式1的对应了中的,而对应了,因此才相当于完整的BRDF。
ps: 公式1中的的下标应该是多余的,它并不与某一束入射光有关,而跟表面点有关。
论文关注于从单帧图像中的所有可见表面点中计算公式1中的光源项,进而估算。文中用SH来表示入射光场。
公式2中,是的重构信号,由加权(权重)的球谐基函数组成。文中采用基函数的一维索引,,则是通常的二维索引。k是用到的频段(band),频段越多重建效果越好,计算越复杂。
论文还实现了一个用于漫反射阴影的 辐射传输函数(公式3)。中,是表面颜色(albedo),是点的可见性。【可见性决定了阴影的形成。】
【虽说公式3是对球面积分,但其中的法线项由公式1的改为了,运算会截断法线反方向上的半球,所以本质上和对法线方向上的半球积分一样的。另外,辐射传输函数不应该包含光照项,而只应该包含几何相关信息。所以的计算通过表面法线、出射方向的几何信息就可以算出来。】
参考Robin Green的Spherical Harmonic Lighgting第29页的带阴影漫反射模型
传送门:http://www.research.scea.com/gdc2003/spherical-harmonic-lighting.html
ps:的下标应该是input的意思,顺便用来和区分开。然后的输入参数只有而没有是因为这是漫反射,哪看的光照结果都一样。
回头瞄一眼???完全和一样好吗,作者水的有点过分了。说好的辐射传输函数,居然用光照结果的公式,这就有问题了,辐射传输函数应该是光照结果公式的一部分。小编参考引文29页中的辐射传输函数来对本文辐射函数做个更正。
入射光在到达点前被挡住返回0,否则就是1。
表面点的最终渲染结果可以表示为(其实是公式3*的L(x))和球谐基底的点乘。
参考Spherical Harmonic Lighgting第19页的公式
最终渲染结果通过以下简化的公式计算,是光照项,对应着,是辐射传输函数,对应。
把光照项和辐射传输项都投影成SH系数,基函数的正交性保证了函数乘积的积分等价于它们系数的点乘。
上式的解释:要 求得渲染结果,需要对球面上的光源(通常是面光源,如果只是点光源,其实在渲染时遍历点光源就行了)进行采样求和。
ps:把积分变成求和,看下引文中的蒙特卡洛积分法,是个积分的近似计算,简化运算。
更正公式(4),[L(x)对应公式3*]:
论文的目标是用个反射观察值【个人理解为CIE LAB空间下的个像素的亮度值,也就是说公式4中的是已知的】来估计未知的。为了估计,文章将观察结果组合成矩阵形式,并得到一个线性方程组,形如(的尺寸为),A是非平方的(non-square,小编表示不懂非平方),必须去解出。因为这个矩阵是个超定方程组(解释:对于方程组,为矩阵,如果列满秩,且。则方程组没有精确解),所以需要最小化的误差(最小二乘法可以近似解超定方程组,文章写的是有问题的)。
个人认为应该是这样的,A应该是Z个采样点对应的球谐系数矩阵,每个点都有个球谐系数:
3.2让光照估计更加鲁棒
文章关注于对相机图像采样点适当地选择和解释。采样点是三维空间中点,它的法向量,在相机帧中对应的亮度值,用SH系数表示的辐射传输函数。
通过可见性选择采样点
文章剔除了位于遮蔽严重的区域采样点,因为这些区域不太可能得到有价值的光照数据。计算时,还确定了可见性。通过从每个采样点向各个可能的方向投射光线,并确定在这个方向上有没有遮挡。如果遮挡多,那么在光照估计中就会剔除这个点。(见图2)
将表面法向量分布作为权重
测量光照的理想表面是个球面,因为它包含所有方向的观察结果。但是事实上场景中更多的是平面,平面所有点共有一个法向量。同样,选取场景中一个小物体作为采样目标,也不能产生可比较的采样点。论文的方法是,根据关于表面法向量的均匀分布去对采样点加权(见图3)。文中根据表面法向量对采样点分组放入规则的球网格中。对于网格中的每个小格子,计算一个权重。公式7中,是小格子的数目,是采样点的总数。权重为某一个小格子里的采样点数目除以均匀分布。从中可以看出,小格子中的采样点越多,权重越高。
接下来,把光照值【亮度】和辐射传输都乘以权重。得到的结果插入到线性等式中(公式5、6)。这个加权会有以下三个影响。第一,组内采样点少的区域【大的小格子】会被均匀分布归一化【归一化对所有采样点的影响应该是一样的】。第二,均匀分布在球面的采样点不会有所变化。第三,组内采样点数量少的区域【小】的影响将会被削弱。
【可以这样理解,如果采样点的法线分布均匀(比如球面),那么采样点的贡献的一样的,除非说采样点在某些区域分布集中(比如平面,其他采样点就是平面外),那么其他的采样点的贡献就低】
4.实现部分
论文展示的系统包含两个模块,光照估计和AR渲染。
4.1光照估计
图4展示光照估计的管线。
颜色和深度图处理
论文用了Kinect来采集彩色图和16位的深度图。因为论文只研究估计白色光源,所以将彩图从RGB转换到CIR L*a*b颜色空间(L亮度通道,ab颜色通道),从而得到场景的反射辐射亮度(reflected radiance)。为了移除相机噪点和高频纹理信息,系统在亮度通道采用了TV-L1去燥算法[20]。颜色空间转换和去燥算法都是用CUDA实现的。为了提高相机图像和深度图的注册(成功率?),系统采用了一个三次多项式透镜整流模型来补偿两种图像源的径向畸变。
几何重构和相机姿态估计
这部分基于KinectFusion算法。不断地用当前深度图来更新一个由三维体素组成的体数据。其结果是一个表面重构,它表示为一个在体数据中的带符号距离场函数和相机的6DOF姿态估计结果。为了从当前视图获得表面点和表面法向量,就必须每一帧在重构的体数据上进行光线投射。因此真实世界的几何体就表示为一个隐式表面,并且不需要每时每刻都计算多边形模型。
辐射传输计算和SH投影
论文实现了漫反射阴影的辐射传输函数(公式3)。这个公式考虑到了可见性,为了计算可见性,要在每个表面点为中心的球面上,从向所有方向投射光线。预处理的辐射传输方法不适用于动态变化的几何场景,因此论文每一帧都计算辐射传输。这项任务是实现在CUDA上的。为了达到实时性能,它也可能每n个像素才计算一次辐射传输,并且进行双线性插值(图6a-c)。真实世界的辐射传输的解会被投影到球谐基函数。计算的另一个原因是差分渲染,它包含了真实世界和虚拟世界的光照影响。(在差分渲染上的还有真实场景+虚拟物体混合的辐射传输)
光照估计
用第3章的方法估计环境光照。对于每个采样点,有SH系数和从相机观察到的辐射度(irradiance observations from the camera)。应用第3.2节的鲁棒估计,解出公式5的方程组,就可以得到代表环境光照的SH系数。这是些轻量级的计算,所以就跑在CPU上。光照每一帧都会估计,并支持动态变化的光源。
4.2渲染管线
本文的渲染管线全是基于球谐光照。图5是渲染管线的总览。
资源准备
用离线3D网格体数据化软件(比如binvox)把虚拟物体转换到体数据的表示形式。对于真实物体和虚拟物体,选择统一的数据结构,使得多体积光线投射对辐射传输函数的可见性项的估计更加方便直接。
差分渲染
为了展示真实世界和虚拟物体之间的影响,论文实现了Debevec等人[2]提出的差分渲染算法。文中用辐射传输函数来对局部光照(local illumination)进行建模。
差分渲染有两个pass(pass:渲染通道/阶段,一个shader里面多个pass,不同时刻根据用户设置选择不同pass会有不同的渲染效果)。第一个pass中,用OpenGL创建了虚拟场景的G-Buffer渲染,相机姿态由KinectFusion来跟踪确定。这个渲染通道产生一个没光照的虚拟场景的颜色缓冲、几何缓冲(比如相机坐标系下每个片段的xyz坐标)、法线缓冲。颜色缓冲在后面的合成步骤中用来计算最终的着色表面颜色,而几何缓冲和法线缓冲用来初始化第二个渲染pass中的光线投射。
在第二个渲染pass中,用在差分渲染中的两个全局光照的解就会被计算出来。第一个是(real),这个在光照估计前已经算出来了(求,就需要提前算好或者叫)。第二是(real and virtual),这个是真实和虚拟物体混合在一起的辐射传输解。跟类似,也是用光线投射计算出来的。因为体素化表示的虚拟物体有明显的采样失真,论文就对第一个渲染pass产生的几何缓冲进行光线投射。还可以用上第一个pass的法线缓冲,因为它相比从体数据那估计得来的法线有更高精确度。图6c-d就是不同数据形式的不同效果。
把和投影成SH系数。最后光照的估计值为环境光照的SH系数与辐射传输的SH投影系数的点乘,然后把结果插入到差分渲染等式中,在这里产生了一个光照贴图(lightmap)。
图10就是用差分渲染实现的效果。光线投射计算量大,影响系统性能。为了优化性能,辐射传输的计算被限制到了每n个像素才计算一次。
论文中的方法利用和可以在一个渲染pass中渲染出最终结果,最终避免重复的几何处理。
合成
主要是为了处理遮蔽关系和产生最终的颜色。为了处理遮蔽,就会对真实世界表面的和虚拟物体表面的几何缓冲中的深度值进行比较。通过深度测试的颜色就会与光照贴图相乘。
注意重构的真实世界表面可能包含了间断和空腔,因为KinectFusion无法保证提供一个完全的重构。一个变通方案是假设虚拟物体表面比任何真实物体都更加靠近(观察者),结果就用上虚拟物体的着色信息。要在线性空间下运算,论文从管线开始处的视频颜色帧那里移除了gamma校正,而作为一个后处理步骤,在最后用了gamma校正输出颜色。
自遮蔽失真(artifact)
光线投射步骤中会产生不想要的自遮蔽失真,就像个脏了的表面。这些失真也会被误解为光照的影响(比如阴影),因为整体看起来比较暗。自遮蔽的成因是,当体素网格的和虚拟几何体的分辨率不匹配,或者重构的表面是含噪声的。(这个现象类似于阴影映射算法里面的采样失真,可以通过施加偏移量来解决)文章通过对点施加法线方向的偏移来解决,偏移量为一个体素单元。效果见图7。
实验结果
对于SH计算,文章采用了4个频段,也就意味着所有用SH表示的结果都有16个系数。
虚拟光照估计评估
搞了个HDR环境贴图形式的已知光源(应该是指虚拟光源),用它来照亮没有虚拟物体的重构场景。其输出拿来估计虚拟光源。估计的结果就可以和已知输入光源做比较了。论文把两者的SH系数在立方体贴图上的映射作对比,贴图上每个像素表示单位圆的某一方向。上述对比见图8。在这个评估中,论文用了Paul Debevec的HDR环境贴图。这个实验的主要结论是,利用几何重构得来的真实世界书局,光照估计能得到正确的结果。
真实世界的结果
图12是三个不同场景(A,B,C)和四种不同光照条件下的系统测试组(复数series)。这三个场景都曝光在四个不同的光照条件下,光照由一个很亮的方向光源产生,并且光源的方向在不同的测试(单数series)中是不同的。注意光源不是理想的漫反射,会产生真实物体的硬阴影。文章目前并不对硬阴影进行建模,而仅估计低频光照(频段少)。因此虚拟物体的阴影会显得比较柔软模糊。图11中,论文展示了,在复杂场景A下使用第3.2节的鲁棒方法的效果。图12的展示了,鲁棒方法得到了良好的光照估计,所以才有较准确的渲染效果。图12的实验说明这个系统还是可以处理彩色物体的,即使没处理估计材质属性。场景B、C中有一样的几何结构,只是表面颜色不一样。场景B的颜色是单一的灰色【小编色盲了吗?看到的是灰蓝】。每个结果【应该指的是图12两个不同场景下的】都旁边都有光照估计的可视化【展开的立方体贴图】。作为对比,每个测试(单数series)都用原始的和鲁棒的方法处理。
光照估计中遮蔽的影响
可以从公式3的可见测试算出遮蔽,实际上遮蔽取决于光线投射步骤中的光线长度。
更长的光线会增加可见性估计中包含距离较远的物体的遮挡概率。对于光照估计,论文只考虑真实物体的遮蔽。论文通过从0到0.2m递增光线长度来评估【应该是光线长度对光照估计的解】影响。如图9所示,光线长度越长,光照估计的解越准。这个解准不准,还可以通过AR渲染的结果观察到。最优的光线光度取决于场景的总体积。光线长度单位是米,整个场景的体积是。注意,对比传统SSAO,SSAO只考虑了一个view【指的应该是屏幕空间,Screen-Space Ambient Occlusion】的信息,而连续的体数据重构产生了更真实的遮蔽。
差分渲染
图10,那是用差分渲染实现的真实物体和虚拟物体之间的相互影响。在这个情景下,论文时直接渲染了体数据形式的虚拟物体。
限制
几何重构
快速变化的场景并不会立即对产生(对其他物体)影响。重构的场景可能不太完整,除非你去特意地扫描一遍。它们的方法用了个静止不动的相机……(算是个折中方案吧)。这个论文用的Kinect不能很好地处理镜面的深度。
视觉效果
辐射传输计算中光线的采样数是个重要因素,并且还会影响光照估计和系统性能。采样数在64到300间能得到合理的结果。另外,每n个像素才计算一次辐射度传输,就会插值,就会产生失真,比如锯齿。注意不连续的重构或导致错误或者部分错误的遮蔽。
光源
只支持漫反射阴影和漫反射光照,没有硬阴影,也没有估计材质属性,因此光源只有白色。
帧的连续问题
论文时每一帧独立估计光照,没有用到前面算过的帧的结果。所以结果会不太稳定。没有用到运动均值,所以系统的结果会闪烁。暗光条件下会有很多噪声。
性能
系统瓶颈在于包含可见测试的辐射传输计算。这项因为差分渲染而计算了两次。不过,系统还是达到了5Hz的帧率,每4个像素执行一次计算、光线长度为10cm,总体为积、16个球谐系数(4个频段)和覆盖球面的169束光线,在NVIDIA GTX 580上面跑可见性测试。
Demo
图13,左图中的真实桥会投影子到虚拟船上,船也会投阴影到真实背景上。右图中船右上方那只虚拟小狮子会投影到真实场景上。中间那个AR帽子有点尬。