基于图像的照明(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使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker