基于图像的照明(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM(一)

字节码文件的组成: 基础信息:魔数,字节码文件对应的java版本号,访问表示public final以及父类和接口 常量池:保存了字符串常量,类或者是接口名,字段名,主要在接口中使用 字段:当前类或者是接口声明的字段信息 方法:当…

Spring之IoC

Spring的设计理念和整体架构 一句话概括就是:Spring是一个轻量级的、非侵入式的控制反转(IOC)和面向切面(AOP)的框架。 设计理念: 松散耦合: Spring鼓励开发者编写松散耦合的代码,通过依赖注入和接口抽象等方式来减少组件之间的…

DV SSL证书

随着网站越来越多,数据安全显得尤为重要。保护网站安全的数字证书应运而生,各大品牌的SSL证书可以实现网站http到https的转变,加密传输过程,提升品牌形象,优化SEO等优点。SSL证书按照验证等级分为DV,OV&…

意大利航天飞行器公司【Sidereus】完成510万欧元融资

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,位于意大利萨莱诺的航天飞行器公司Sidereus Space Dynamics今日宣布已完成510万欧元融资。 本轮融资由Primo Space和CDP Venture Capital Sgr领投,通过Italia Venture II - Fondo Impr…

win10 wsl安装步骤

参考&#xff1a; 安装 WSL | Microsoft Learn 一、安装wsl 1.若要查看可通过在线商店下载的可用 Linux 发行版列表&#xff0c;请输入&#xff1a; wsl --list --online 或 wsl -l -o> wsl -l -o 以下是可安装的有效分发的列表。 使用 wsl.exe --install <Distro>…

python结合excel数据轻松实现接口自动化测试

在刚刚进入测试行业的时候&#xff0c;最开始也是做功能测试&#xff0c;我想很多伙伴和我一样&#xff0c;觉得自动化测试都很高端&#xff0c;很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化&#xff0c;后面发现excel个人觉得更加适合&#x…

Vue开发中Jwt的使用

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

缓存的力量:提升API性能和可扩展性

缓存是将频繁访问的数据或资源存储在临时存储位置(例如内存或磁盘)的过程&#xff0c;以提高检索速度并减少重复处理的需要。 缓存的好处 提高性能&#xff1a;缓存消除了每次从原始源检索数据的需要&#xff0c;从而提高了响应时间并减少了延迟。减少服务器负载&#xff1a;通…

OrcaTerm AI

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

MySQL(存储过程,store procedure)——存储过程的前世今生 MySQL存储过程体验 MybatisPlus中使用存储过程

前言 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的标准化语言&#xff0c;它用于定义、操作和管理数据库中的数据。SQL是一种通用的语言&#xff0c;可以用于多种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;如MySQ…

spark集群环境下,实现人口平均年龄计算

文章目录 任务目标0. 版本信息1. 计算生成renkou.txt2. 文件上传至spark3. 上传文件时&#xff0c;可能出现的常见错误4. 编写spark文件5. 上传集群6. 集群环境下提交任务 任务目标 在虚拟机上部署spark集群&#xff0c;给定renkou.txt文件&#xff0c;输出平均年龄 renkou.t…

linux C++ vscode连接mysql

1.linux使用Ubuntu 2.Ubuntu安装vscode 2.1 安装的是snap版本,直接打开命令行执行 sudo snap install --classic code 3.vscode配置C 3.1 直接在扩展中搜索C安装即可 我安装了C, Chinese, code runner, 安装都是同理 4.安装mysql sudo apt update sudo apt install mysql-…

软件工程与计算总结(七)需求文档化与验证

目录 一.文档化的原因 二.需求文档基础 1.需求文档的交流对象 2.用例文档 3.软件需求规格说明文档 三.需求文档化要点 1.技术文档协作要点 2.需求书写要点 3.软件需求规格说明文档属性要点 四.评审软件需求规格说明文档 1.需求验证与确认 2.评审需求的注意事项 五…

在SIP 语音呼叫中出现单通时要怎么解决?

在VoIP的环境中&#xff0c;特别是基于SIP通信的环境中&#xff0c;我们经常会遇到一些非常常见的问题&#xff0c;例如&#xff0c;单通&#xff0c;注册问题&#xff0c;回声&#xff0c;单通等。这些问题事实上都有非常直接的排查方式和解决办法&#xff0c;用户可以按照一定…

股票价格预测 | Python基于RNN及股票预测实战

循环神经网络(RNN)是基于序列数据(如语言、语音、时间序列)的递归性质而设计的,是一种反馈类型的神经网络,其结构包含环和自重复,因此被称为“循环”。它专门用于处理序列数据,如逐字生成文本或预测时间序列数据(例如股票价格)。 (1)one to one:其实和全连接神经网络…

微信小程序--下拉选择框组件封装,可CV直接使用

一、起因 接到的项目需求,查看ui设计图后,由于微信小程序官方设计的下拉选择框不符合需求,而且常用的第三方库也没有封装类似的,所以选择自己自定义组件。在此记录一下,方便日后复用。 ui设计图如下: 微信官方提供的选择框 对比发现并不能实现我们想要的功能。 二、自定义组件…

video_topic

使用qt5,ffmpeg6.0,opencv&#xff0c;os2来实现。qt并非必要&#xff0c;只是用惯了。 步骤是&#xff1a; 1.读取rtsp码流&#xff0c;转换成mat图像 2.发送ros::mat图像 项目结构如下&#xff1a; videoplayer.h #ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H#include …

企业数字化营销策略如何制定?企业开展数字化营销有的关键步骤?

​制定数字化营销策略是建立数字化营销体系的关键步骤&#xff0c;想要建立好的数字化营销策划&#xff0c;需要企业明确目标客户群体&#xff0c;通过了解他们的需求和行为&#xff0c;来制定相应的营销策略。例如&#xff0c;通过数据分析手段&#xff0c;企业可以确定目标客…

一个tomcat下如何部署多个项目?

1、不修改端口&#xff0c;部署多个项目 清楚tomcat目录结构的应该都知道&#xff0c;项目包是放在webapps目录下的&#xff0c;那能否在同一个tomcat的webapps目录下运行多个不同项目呢&#xff1f; 答案是可以的。 1、将多个项目包放入webapps文件夹下 2、修改conf下的serv…

【师兄啊师兄2】公布,李长寿成功渡劫,敖乙叛变,又一美女登场

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 由玄机制作的师兄啊师兄第一季这才完结没有多久&#xff0c;没想到现在第二季就公布了&#xff0c;连海报和预告都出来了&#xff0c;看样子已经做得差不多了。预告看下来&#xff0c;能够明显感觉到官方又进步…