ARFoundation之路-Environment Probe之一

版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。

  在AR中实现环境光反射是一项非常高级的功能,也是增强AR虚拟物体可信度的一个重要组成部分,因为AR中对环境光的估计信息往往都不完整,需要利用人工智能技术推算补充不完整的环境信息,因此,AR中的环境反射不能做到非常精准。

(一)Cubemap

  Cubemap,中文翻译为立方体贴图,通常用来做环境映射,Unity中的Skybox就是立方体贴图,也通常被用来作为具有反射属性物体的反射源。Cubemap是一个由6个独立的正方形纹理组成的纹理集合,包含了6个2D纹理,每个2D纹理为立方体的一个面,6个纹理共组成一个有贴图的立方体,如下图所示。

在这里插入图片描述

  在左图中,沿着虚线箭头方向可以将这6个面封闭成一个立方体,形成一个纹理面向内的贴图集合,这也是立方体贴图的名字由来。立方体贴图最大的特点是其形成了一个720度全封闭的空间,因此如果组成立方体贴图的6张纹理选择连续无缝贴图就可以实现720度无死角的纹理采样,形成完美的天空效果。

  与2D纹理采样使用UV坐标不同,立方体贴图需要一个3D查找向量来进行采样,我们定义这个查找向量为原点位于立方体中心点的3D向量,如上图右图所示,在3D找查向量与立方体的相交处的纹理就是我们需要采样的纹理。在GLSL、HLSL、CG中都定义了立方体贴图采样函数,可以非常方便的进行Cubemap采样。

  Cubemap因其720度封闭的特性常常用来模拟在某点处的周边环境,实现反射、折射效果,如根据赛车位置实时更新Cubemap可以模拟赛车车身对周边环境的反射效果。在AR中,我们也是利用同样的原理来实现虚拟物体对真实环境的反射。

  立方体贴图需要6个无缝的纹理,使用静态的纹理可以非常好的模拟全向场景,但静态纹理不能反映动态的物体变化,如赛车车身对周围环境的反射,如果使用静态纹理将不能反射路上行走的人群和闪烁的霓虹灯,这时就需要使用实时动态生成的Cubemap,实时生成Cubemap的方法稍后我们会进行讲述,这种方式能非常真实的模拟赛车对环境的反射,但性能开销比较大,通常都需要进行优化。

(二)PBR 渲染

  光照模型(Illumination model),也称为明暗模型,用于计算物体某点处的光强(颜色值),从数学角 度来说,光照模型就是一个公式,使用这个公式来计算在某个点的光照效果。就算法理论基础而言,光照 模型分为两类:一类是基于物理理论的,另一类是基于经验模型的。基于物理理论的光照模型,偏重于使 用物理的度量和统计方法,比较典型的有 ward BRDF 模型,其中的不少参数是需要仪器测量的,使用这种 光照模型的好处是效果非常真实,但是计算复杂,实现起来也较为困难; PBR(Physicallly Based Rendering,基于物理渲染)渲染也是基于物理模型的,PBR 对表面采用微平面进行建模,利用辐射度,加 上光线追踪技术来进行渲染。经验模型更加偏重于使用特定的概率公式,使之与一组表面材质类型相匹配, 所以经验模型大都比较简洁,效果偏向理想化。物理模型与经验模型两者之间的界限并不是清晰到“非黑 即白”的地步,无论何种光照模型本质上还是基于物理的,只不过在求证方法上各有偏重而已。 通常来说,经验模型更简单对计算更友好,而物理模型更复杂且计算量大。

  PBR渲染指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。正因为基于物理的渲染目的是为了使用一种更符合物理学规律的方式来模拟光线,因此这种渲染方式与我们原来的Phong或者Blinn-Phong光照算法相比总体上看起来要更真实一些。除了看起来更真实以外,由于使用物理参数来调整模拟效果,因此可以编写出通用的算法,通过修改物理参数来模拟不同的材质表面,而不必依靠经验修改或调整来让光照效果看上去自然。使用基于物理参数的方法来编写材质还有一个更大的好处,就是不论光照条件如何,这些材质看上去都会是正确的。Unity内置的Standard Shader就是一个万能的通用的基于物理的着色器,可以通过不同的参数设置来模拟各种材质表面属性,从木质到金属都可以仅由一个着色器来模拟。如可以通过调整Metallic 和 Smoothness值模拟从非金属到金属的所有材质,如下图所示。

在这里插入图片描述

  虽然如此,基于物理的渲染仍然只是对基于物理原理的现实世界的一种近似,这也就是为什么它被称为基于物理的着色(Physically based Shading) 而非物理着色(Physical Shading)的原因。判断一种PBR光照模型是否是基于物理的,必须满足以下三个条件:基于微平面(Microfacet)的表面模型;能量守恒;应用基于物理的BRDF。

  在PBR渲染的基础上,我们就可以在AR中实现对环境的反射(不使用PBR也可以实现反射),通过调整 Metallic 和 Smoothness 或者 Specular 和Smoothness可以实现不同程度的反射效果,如下图所示(本图来自参考文献1)。

在这里插入图片描述
  在AR中,在使用PBR渲染虚拟物体时,如果要想虚拟物体具有反射效果,再必须在着色器中开启Reflections ,同时为表现高光效果,也应该开启 Specular Highlights,如下图所示。

在这里插入图片描述

(三)Reflection Probe

  在Unity中,带反射材质的物体默认会对Skybox产生反射,但不能对其周边的环境产生反射,为解决这个问题,Unity提出了Refection Probe(反射探头)的概念,所谓Refection Probe其实就是一个点,在这个点上向6个方向以90度视场角拍摄6张照片(这6个方向分别是+X、-X、+Y、-Y、+Z、-Z),因为视场角是90度,这6张照片捕捉到了它周围各个方向的球面图,然后将捕获的图像存储为一个Cubemap,就可供具有反射材质的对象使用。在给定的场景中可以使用多个反射探头并且可以设置目标使用最近的探头产生的Cubemap。

  Reflection Probe有Probe Origin和Size属性,Probe Origin即为反射探头的原点,Size定义了从其本身原点出发可以抓取的图像的范围,Origin和Size构成了反射探头的反射盒和所在位置,如下图所示,只有在反射盒里的物体才能被利用该反射探头的物体所反射。

在这里插入图片描述

  如果要使用反射探头生成的Cubemap,还需要设置反射物体的Mesh Renderer中的Reflection Probes选项选择Blend Probes或者Blend Probes and Skybox,如下图所示。

在这里插入图片描述
  每一个反射探头的实质是不断拍摄其所在位置的6个方向的纹理制作立方体贴图供反射物体使用,这是一个性能消耗很大的操作,实时的反射探头每帧都会生成一个立方体贴图,在提供对动态物体良好的反射之外会对性能有比较大的影响,为了降低性能消耗,常用的做法有烘焙(Bake)、手动更新(manually),如对一个大厅的反射,可以预先烘焙到纹理中,但这种方式不能反映运行过程中的环境变化,手动更新可以根据需要在合适的时机人工更新,达到比较好的性能与表现均衡。

(四)纹理采样过滤

  纹理采样过滤( Texture Sampling Filter)是指对采样纹理的过滤算法,这里我们只针对ARFoundation中对反射的三种采样过滤方式(Point、Bilinear、Trilinear)。通过在虚拟物体显示过程中,很多时候物体的尺寸与提供的纹理并不能一一对应,如在放大、缩小模型时,纹理就会发生变形,为了达到更好的视觉效果,需要对采样的纹理进行处理。

  为了方便阐述,我们从一维的角度来说明,假如现有一张256x256的纹理,其在X轴上就就有256个像素点,在使用中模型的某一顶点的UV坐标中的U值为0.13852676,那么其对应的像素点为256x0.13852676=35.46,如下图所示。在纹理中,小数是没有定义的,因此,35.46并不能直接对应一个像素点的值。

在这里插入图片描述

  采样过滤就是为了解决这类纹理不能直接映射的问题。Point过滤处理的方式是四舍五入取最近的值,因此其值为C,与35对应的像素值一致。Bilinear过滤的处理方式是在最近的两个值之间作插值,即在35与36所对应的值间根据小数值做插值,其值为D。可以看到,Point过滤比Bilinear过滤简单得多,但是Bilinear过滤比Point过滤结果更平滑,其效果如下图所示,左图为原图,中间为使用Point过滤且放大后的图像,可以看到明显的块状,右图为使用Bilinear过滤且放大后的图像,效果要平滑得多。

在这里插入图片描述

  Trilinear解决的是在不同LOD(Levels of Detail)间过滤纹理的问题,原理如下图所示,其实质是进行了两次插值计算,先进行一次Bilinear过滤计算出Cb与Ca的值,然后再在不同的LOD间进行一次Bilinear过滤,结果是更加的平滑。
在这里插入图片描述
  在ARFoundation中使用环境光反射时,为了达到更好的效果,我们通常都会选择Bilinear或者Trilinear纹理过滤方式,如下图所示。
在这里插入图片描述

参考资料

1、Adding Realistic Reflections to an AR Experience Adding Realistic Reflections to an AR Experience

2、Reflection Probe Reflection Probe

发布了89 篇原创文章 · 获赞 104 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/97304132
今日推荐