温州鹿城区企业网站搭建,如何搭建自己的微信小程序商城,企业网站租服务器,正规的网站制作电话多少基于图像的照明基本上将图像中的所有像素视为光源。 通常#xff0c;从全景高动态范围 (HDR) 图像创建的环境贴图#xff08;通常是立方体贴图#xff09;将用作纹理获取的源。 推荐#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 假设阴影物体是不透明的#xff0c;我们…基于图像的照明基本上将图像中的所有像素视为光源。 通常从全景高动态范围 (HDR) 图像创建的环境贴图通常是立方体贴图将用作纹理获取的源。 推荐用 NSDT编辑器 快速搭建可编程3D场景 假设阴影物体是不透明的我们只需要考虑镜面反射和漫反射。 然而由于光源是无数连续的像素我们需要整合BRDF来得到表面点的着色结果。 在计算机图形学中积分通过采样来近似。 为了获得更高的精度样本数量与像素数量成正比而像素数量在实时渲染中是一个很大的数字。 因此一种方法是将必要的步骤烘焙到纹理中并在实时渲染中获取像素。 在此之前我们需要解决一个问题——如何从环境图中获取像素
1、从环境贴图中获取像素
在任何类型的表面上像素的辐射值都可以看作是从表面法线的另一侧反射的这实际上是完全光滑表面上的镜面反射的情况但对于漫反射等其他情况环境贴图 可以存储一个假想的源点作为辐射率的合成结果与视线方向的法线具有相同的角度。 换句话说我们需要获取的像素可以看作是相机光线经过反射后击中的目标。 图 3 - 立方体贴图像素获取示意图
立方体贴图是一种流行的环境贴图方法因为它具有简单的数学形式。 该方法将环境视为一个包围盒将环境全景包裹并映射到 6 个面。 在GLSL中有一个函数 textureCube()可以在给定的反射方向上进行提取。 然而假设反射光线位于立方体的正中心。 对于代表遥远环境的天空盒来说这不是一个严重的问题。 然而当我们需要表示小房间内的反射时如果我们想要获取靠近墙壁的球的反射颜色则反射会严重扭曲。
为了解决这个问题我找到了一种称为盒投影立方体贴图环境映射BPCEM的方法behc2010 图 4 - 盒投影立方体贴图环境映射
该方法具有简单的数学形式。 如图 4 所示它需要房间的大小和阴影对象的相对位置。 然后可以轻松计算边界和反射相机光线之间的交点位置。 修正后的提取方向就是假设的采样中心默认为房间中心与交点之间的向量。 该方法非常直观具有很好的逼近效果。 因此我采用了 GLSL 中的方法来将封闭的房间内渲染为场景。
2、辐照度图和球谐函数
解决了纹理获取问题后我们回来计算 IBL 中的光照。 IBL 的弥散部分尤其重要。 我们想要根据 BRDF 预先计算的纹理称为辐照度图。 与根据 Cook-Torrance 模型仅具有小范围采样并随着表面粗糙度而增加的镜面反射不同IBL 漫反射需要考虑所有可见方向上像素的贡献这与镜面反射相比是一个巨大的量。 实时采样几乎是不可能的甚至预处理也变得困难。 感谢 SIGGRAPH可以有效地近似计算辐照度图Ravi Pat2001。 事实证明通过计算并使用光照的9个球谐系数渲染结果的平均误差仅为1%。
我编写了一个 C 程序来几乎立即计算 2048x2048 尺寸以下任何立方体贴图的 9 个球谐系数。 利用 9 个球谐系数实际上可以实时计算给定像素的辐照度值。 但是为了避免着色器中的长表达式我通过遍历所有反射方向将结果预先计算为辐照度图。
3、镜面反射的高效近似
Cook-Torrance 微面镜面着色模型 (CookTorrance, 1981) 用于计算 IBL 镜面反射 图 5 - Cook-Torrance 镜面着色模型
D、F、G分别代表贝克曼分布因子、菲涅尔项、几何衰减项。 然而这3个公式也很复杂需要找到有效的近似。 再次感谢 SIGGRAPHSIGGRAPH 2013 课程Karis2013中介绍了虚幻引擎 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. 原文链接IBL-基于图像的照明 — BimAnt