基于图像的照明(IBL)简明教程

2023-10-12 21:52
文章标签 图像 教程 简明 ibl 照明

本文主要是介绍基于图像的照明(IBL)简明教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于图像的照明基本上将图像中的所有像素视为光源。 通常,从全景高动态范围 (HDR) 图像创建的环境贴图(通常是立方体贴图)将用作纹理获取的源。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

假设阴影物体是不透明的,我们只需要考虑镜面反射和漫反射。 然而,由于光源是无数连续的像素,我们需要整合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.


原文链接:IBL-基于图像的照明 — BimAnt

这篇关于基于图像的照明(IBL)简明教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/198723

相关文章

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是