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

news2024/10/5 2:03:17

基于图像的照明基本上将图像中的所有像素视为光源。 通常,从全景高动态范围 (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.coloradmin.cn/o/1083843.html

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

相关文章

lazada商品评论数据接口,lazada商品评论API接口,lazadaAPI接口

lazada商品评论数据接口可以按照以下步骤获取: 注册Lazada开发者账号,创建API密钥和访问令牌。调用Lazada Open API中的Product Review API,提供商品的SKU或Seller SKU参数,即可获取该商品的所有评论。 Lazada商品评论数据接口封…

【Spring Boot从入门到实战】RabbitMQ消息队列 —— RabbitMQ入门

💠一名热衷于分享知识的程序员 💠乐于在CSDN上与广大开发者交流学习。 💠希望通过每一次学习,让更多读者了解我 💠也希望能结识更多志同道合的朋友。 💠将继续努力,不断提升自己的专业技能,创造更多价值。🌿欢迎来到@"衍生星球"的CSDN博文🌿 🍁本…

Web安全教程(超详细!从入门到精通!零基础可学!)

Web简介: Web 即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。 万维网常…

2023年中国数控系统市场发展历程及趋势分析:数控系统市场规模将持续扩大[图]

数控系统是根据计算机存储器中存储的控制程序,执行部分或全部数值控制功能,并配有接口电路和伺服驱动装置的专用计算机系统。通过利用数字、文字和符号组成的数字指令来实现一台或多台机械设备动作控制,它所控制的通常是位置、角度、速度等机…

了解5个区别,FPmarkets用烛台和Renko图实现交易翻倍

很多投资者不知道日本烛台图表和Renko图表的区别,在交易中出现好的机会而把握不住,今天FPmarkets就和投资者一起了解烛台图表和Renko图表的区别,在今后的交易中能第一时间抓住机会,从而盈利。 首先,Renko图表是平滑的…

Linux系统卡顿处理记录(Debian)

问题现象描述 现象linux操作系统卡顿(就是很慢),但是系统任然能够使用。 文章一步步的排查并且定位问题。 排查步骤 1. 使用top命令查看CPU是否占用过高。(未发现)排除问题 2. 使用df -h查看硬盘是否被占满。&#…

突破边界与持续技术创新,Doris Summit Asia 2023 主论坛亮点解读

峰会官网已上线,最新议程请关注:doris-summit.org.cn Doris Summit 是 Apache Doris 社区一年一度的技术盛会,由 SelectDB 联合 Apache Doris 社区的众多开发者、企业用户和合作伙伴共同发起,专注于传播推广开源 OLAP 与实时数据…

【如何查看Python安装了哪些包】

如何查看Python安装了哪些包 这篇文章主要给大家介绍了关于如何查看Python安装了哪些包的相关资料, Conda是另一种广泛使用的Python包管理工具,它用于安装、管理和升级软件包和其依赖项,需要的朋友可以参考下 目录 查找是否安装了具体的包怎么安装包?更新包总结 c…

C++ 使用Windows的API CreateDirectory 创建多层级文件夹

简介 使用Windows的API创建多层级文件夹 效果 代码 #include <windows.h> #include <direct.h> #include <iostream> #include <string> #include <sstream> #include <vector> //创建多层级文件夹 bool CreateDir(const std:…

web系统接口设计总结

一、前言 在前后端完全分离的开发模式或者说是架构模式下&#xff0c;后端开发者只需要编写后端接口&#xff0c;特别是restful风格接口更为常见。那么暴露给外面的接口大概有三个常见。1、给后台系统调用的接口&#xff0c;2、对客端应用的接口&#xff08;APP或者H5页面&…

Linux文件-内存映射mmap

mmap定义为&#xff1a;Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来&#xff0c;以初始化这个虚拟内存区域的内容&#xff0c;这个过程称为内存映射(memory mapping)。 在LINUX中我们可以使用mmap用来在进程虚拟内存地址空间中分配地址空间&#xff0c;创…

如何成为CISP信息安全专业人员

随着信息技术和经济社会的交汇融合&#xff0c;网络安全一跃成为国家最为关注的焦点之一。 对于网络安全行业的资质证书来说&#xff0c;CISP成为了目前从业人员最为关注和了解的证书之一&#xff0c;那么&#xff0c;在网络安全行业&#xff0c;CISP证书的价值究竟在哪里&…

MBBF展示的奇迹绿洲:5G的过去、此刻与未来

如果你来迪拜&#xff0c;一定不会错过全世界面积最大的人工岛项目&#xff0c;这是被称为世界第八大奇迹的棕榈岛。多年以来&#xff0c;这座岛从一片砂石、一棵棕榈树开始&#xff0c;逐步建成了整个波斯湾地区的地标&#xff0c;吸引着全世界游人的脚步。 纵观整个移动通信发…

国际前十伦敦金交易app软件最新排行榜(信息汇总)

随着科技的发展&#xff0c;移动交易已成为的趋势。伦敦金交易也不再局限于桌面&#xff0c;而是越来越多地转移到手机上。 为了更好地展现软件的信息&#xff0c;本文将为大家介绍国际前十的伦敦金交易app软件最新排行榜。 1.金荣中国 金荣中国是知名的伦敦金交易平台&…

Maven导入程序包jakarta.servlet,但显示不存在

使用前提&#xff1a;&#xff08;Tomcat10版本&#xff09;已知tomcat10版本之后&#xff0c;使用jakart.servlet。而tomcat9以及之前使用javax.servlet。 问题描述&#xff1a;在maven仓库有导入了Jakarta程序包&#xff0c;但是界面仍然显示是javax。&#xff08;下图&…

基于VCO的OTA稳定性分析的零交叉时差模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux编译FFmpeg

Linux编译FFmpeg 1. 下载FFmpeg源码 FFmpeg源码下载地址&#xff1a;http://ffmpeg.org/download.html 在下面选择版本 2. 解压并创建生成目录 tar xvf ffmpeg-snapshot.tar.bz2 // 解压下载的FFmpeg源码 makedir /root/ffmpeg // 创建生成目录3. 编译FFmpeg 进入FF…

详解Zookeeper(铲屎官)在众多中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心的解决方案

1.概述 1.1 Zookeeper是什么&#xff1f; Zookeeper: 直译过来是动物园管理员的意思&#xff0c;这里的动物表示的就是当下主流的众多框架组件(ps&#xff1a;现在的框架组件都喜欢用动物当图标)&#xff0c;而Zookeeper的图标如下图所示&#xff0c;是一个人拿着一个铲子(铲…

Python学习笔记-使用哈希算法Hash,Hashlib进行数据加密

文章目录 一、概述1.1 哈希算法1.2 常见算法分类1.2.1 SHA算法1.2.2 MD4算法1.2.3 MD5算法 1.3 Hash算法的特性1.4 Hash算法的应用场景1.4.1 数据校验1.4.2 安全加密1.4.3 数字签名 二、Hash算法使用2.1 使用hash函数直接获取hash值2.2 使用hashlib库进行hash计算2.2.1 基本使用…

解决Win10电脑无线网卡的移动热点无法开启问题

一、目的 利用无线网卡连接网络&#xff0c;然后又用无线网卡通过移动热点分享该网络。 移动热点&#xff0c;简单地说&#xff0c;就是将台式机或笔记本的 Internet 连接转化成 WIFI 信号以供移动设备无线上网的功能&#xff0c;硬件前提是电脑须安装有无线网卡。 二、问题 …