NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

基于图像的照明基本上将图像中的所有像素视为光源。 通常,从全景高动态范围 (HDR) 图像创建的环境贴图(通常是立方体贴图)将用作纹理获取的源。 假设阴影物体是不透明的,我们只需要考虑镜面反射和漫反射。 然而,由于光源是无数连续的像素,我们需要整合BRDF来得到表面点的着色结果。 在计算机图形学中,积分通过采样来近似。 为了获得更高的精度,样本数量与像素数量成正比,而像素数量在实时渲染中是一个很大的数字。 因此,一种方法是将必要的步骤烘焙到纹理中并在实时渲染中获取像素。 在此之前,我们需要解决一个问题——如何从环境图中获取像素?

1、从环境贴图中获取像素

在任何类型的表面上,像素的辐射值都可以看作是从表面法线的另一侧反射的(这实际上是完全光滑表面上的镜面反射的情况,但对于漫反射等其他情况,环境贴图 可以存储一个假想的源点作为辐射率的合成结果),与视线方向的法线具有相同的角度。 换句话说,我们需要获取的像素可以看作是相机光线经过反射后击中的目标。

图 3 - 立方体贴图像素获取示意图

立方体贴图是一种流行的环境贴图方法,因为它具有简单的数学形式。 该方法将环境视为一个包围盒,将环境全景包裹并映射到 6 个面。 在GLSL中,有一个函数 textureCube()可以在给定的反射方向上进行提取。 然而,假设反射光线位于立方体的正中心。 对于代表遥远环境的天空盒来说,这不是一个严重的问题。 然而,当我们需要表示小房间内的反射时,如果我们想要获取靠近墙壁的球的反射颜色,则反射会严重扭曲。

为了解决这个问题,我找到了一种称为盒投影立方体贴图环境映射(BPCEM)的方法(behc,2010):

图 4 - 盒投影立方体贴图环境映射

该方法具有简单的数学形式。 如图 4 所示,它需要房间的大小和阴影对象的相对位置。 然后可以轻松计算边界和反射相机光线之间的交点位置。 修正后的提取方向就是假设的采样中心(默认为房间中心)与交点之间的向量。 该方法非常直观,具有很好的逼近效果。 因此,我采用了 GLSL 中的方法来将封闭的房间内渲染为场景。

2、辐照度图和球谐函数

解决了纹理获取问题后,我们回来计算 IBL 中的光照。 IBL 的弥散部分尤其重要。 我们想要根据 BRDF 预先计算的纹理称为辐照度图。 与根据 Cook-Torrance 模型仅具有小范围采样并随着表面粗糙度而增加的镜面反射不同,IBL 漫反射需要考虑所有可见方向上像素的贡献,这与镜面反射相比是一个巨大的量。 实时采样几乎是不可能的,甚至预处理也变得困难。 感谢 SIGGRAPH,可以有效地近似计算辐照度图(Ravi & Pat,2001)。 事实证明,通过计算并使用光照的9个球谐系数,渲染结果的平均误差仅为1%。

我编写了一个 C++ 程序来几乎立即计算 2048x2048 尺寸以下任何立方体贴图的 9 个球谐系数。 利用 9 个球谐系数,实际上可以实时计算给定像素的辐照度值。 但是,为了避免着色器中的长表达式,我通过遍历所有反射方向将结果预先计算为辐照度图。

3、镜面反射的高效近似

Cook-Torrance 微面镜面着色模型 (Cook&Torrance, 1981) 用于计算 IBL 镜面反射:

图 5 - Cook-Torrance 镜面着色模型

D、F、G分别代表贝克曼分布因子、菲涅尔项、几何衰减项。 然而,这3个公式也很复杂,需要找到有效的近似。 再次感谢 SIGGRAPH,SIGGRAPH 2013 课程(Karis,2013)中介绍了虚幻引擎 4 中的真实着色模型,其中选择了计算高效的算法来近似公式和积分。 积分是通过重要性采样完成的,这是一种近似特定分布属性的通用技术。

为了进一步减少计算规模,本文提出了一种称为分割和近似的方法。 积分被分成两个和的乘积,这两个和都可以预先计算。 第一个和是根据 Cook-Torrance 微面模型给定粗糙度对环境图进行卷积的结果。 因为我们想要为同一环境中的不同对象选择不同的粗糙度级别,所以需要在立方体贴图的 mip-map 级别中存储不同粗糙度值的结果。 有一种名为 DirectDraw Surface (.dds) 的 DirectX 图像格式,支持存储自行创建的 mip-map 级别。 不幸的是,Blender 不支持读取这种格式的 mip-map。 因此,我想出了一种方法,将所有立方体贴图 mip-map 级别排列在普通位图纹理中(如图 5 所示),并在相应区域中获取所需的像素。

图 6 - 在单个纹理中存储立方体贴图 Mip 贴图级别

第二个总和相当于将镜面反射 BRDF 与纯白色环境积分,更容易计算。 它可以进一步近似于另外两个积分的总和,并将粗糙度和入射角作为两个输入,给出比例和偏差作为两个输出。 此外,所有参数都落在0和1之间的范围内; 因此,可以预先计算函数的结果并将其存储在纹理中。

值得注意的是,第二个和包含菲涅耳项。 菲涅耳项是描述反射率随不同入射角变化的因子,当被遮挡物体的金属度较低时(非金属的基础反射率较低,所有材料的反射率接近 100%),中心和边缘之间的对比度更强。 反射角接近90度)。 由于这种效果在经验上很容易注意到,因此它对于真实渲染是必不可少的。

图 7 - 介电球上的菲涅尔效应

4、IBL 工具

进行基于物理的渲染并不是一个容易的过程。 物理实体具有连续的几何形状,而计算机科学中的计算是离散的。 物理学中使用的微积分如积分必须转换为离散采样的形式。 即便如此,当前的计算能力仍然需要许多近似技术和程序策略,例如查找纹理(LUT)。 IBL 是展示 PBR 复杂性的一个很好的例子。 使用最少的输入命令完成所有预计算的工具将方便艺术家和程序员使用。

因此,我开发了IBL Tool,一个Windows控制台程序,让事情变得简单(抱歉,这个IBL Tool现在是我实习公司的专有软件,所以我不能发布它:)。 用户只需将环境贴图纹理放入其中,即可生成 IBL 的所有 LUT 纹理。 该程序还表现出可定制性。 用户可以根据游戏引擎的要求从 3 种不同的输出模式中进行选择 - 分离的面、标准 Blender 格式和展开框格式。

此外,程序还提供了一对示例 GLSL 着色器(顶点和片段),并指示了自定义字段。 还包括调整曝光和伽玛值的色调映射,以便用户可以根据需要获得更高的阴影动态范围。

5、参考文献

Behc (2010, April 20) Box Projected Cubemap Environment Mapping [Online forum post]. Retrieved from http://www.gamedev.net/topic/568829-box-projected-cubemap-environment-mapping/.

Cook, R. L., & Torrance, K. E. (1981, August). A reflectance model for computer graphics. In ACM Siggraph Computer Graphics (Vol. 15, No. 3, pp. 307-316). ACM.

Karis, B., & Games, E. (2013). Real Shading in Unreal Engine 4. part of “Physically Based Shading in Theory and Practice,” SIGGRAPH.

Ramamoorthi, R., & Hanrahan, P. (2001, August). An efficient representation for irradiance environment maps. In Proceedings of the 28th annual conference on Computer graphics and interactive techniques (pp. 497-500). ACM.


原文链接:[PBR Series - 2] Image Based Lighting

BimAnt翻译整理,转载请标明出处