球谐函数在环境光照中的使用原理

news2024/11/29 22:42:54

在三维空间中如何对场景光照进行球谐函数展开

图形学论文解析与复现【Spherical Harmonic Lighting:The Gritty Details】
首先,对场景中某像素点的漫反射光照进行计算。
L ( p , w o ) = ∫ Ω L ( w i ) n ⋅ w i d w i L(p,w_o) = \int_{\Omega}L(w_i)n\cdot w_idw_i L(p,wo)=ΩL(wi)nwidwi

设:
L i = ∑ i = 0 L i Y i ( ω ) n ⋅ ω = t ( ω ) = ∑ i = 0 t i Y i ( ω ) L_i = \sum_{i=0}L_iY_i(\omega)\\ \quad\\ n\cdot \omega = t(\omega) = \sum_{i=0}t_iY_i(\omega) Li=i=0LiYi(ω)nω=t(ω)=i=0tiYi(ω)

L ( p , w o ) L(p,w_o) L(p,wo)球谐展开后得到
L ( p , w o ) = ∑ i = 0 n 2 L ( w i ) n ⋅ w i L(p,w_o) = \sum_{i=0}^{n^2}L(w_i)n\cdot w_i L(p,wo)=i=0n2L(wi)nwi

漫反射环境光

计算 L i L_i Li

L i = ∑ i = 0 n 2 L ( w i ) Y i ( w ) L_i = \sum_{i=0}^{n^2} L(w_i)Y_i(w) Li=i=0n2L(wi)Yi(w)

for(pixel &p : Cubemap)
    Li += p.color * Yi(normalise(p.position)) * dw;

计算 t i t_i ti

t i = ∑ i = 0 n 2 n ⋅ w Y i ( w ) d w t_i = \sum_{i=0}^{n^2} n\cdot w Y_i(w)dw ti=i=0n2nwYi(w)dw
可惜求 t i t_i ti是与具体着色点有关(需要知道法线信息n)。这也就意味着,我们如果需要预计算 t i t_i ti,也就需要对每一个方向的法线n 都要算一组 t i t_i ti。每个像素点需要生成 i i i个(球谐基函数个)系数。

for(normal &n: sphere)//对于每个法线方向
{
    for(pixel &p : Cubemap)//对Cubemap进行采样积分
        Ti[n] += dot(n,normalise(p.position)) * Yi(normalise(p.position)) * dw;
}

但这样不就没有解决IBL需要对像素采样,导致移动端速度下降的问题了吗!!!!

我们引入不需要预计算 t i t_i ti的方式

辐照度环境贴图的有效表示

【论文复现】An Efficient Representation for Irradiance Environment Maps
采用球谐函数旋转特性解决每一个法线都需要预计算球谐函数的问题

如果我们已知 Y l m ( u ) Y_l^m(\mathbf{u}) Ylm(u) u \mathbf u u 方向下的球谐函数项的计算结果。
那么如果我们想要知道 v \mathbf v v 方向下的球谐函数项的计算结果,就需要再计算一次。

但如果我们可以得到 u \mathbf u u v \mathbf v v下的矩阵 R α , β , γ ( u ) R^{\alpha,\beta,\gamma}(\mathbf{u}) Rα,β,γ(u)
则可以得到
Y l m ( R α , β , γ ( u ) ) = ∑ m ′ = − l l D m ′ , m l ( R α , β , γ ) Y l m ′ ( u ) D m ′ , m l ( R α , β , γ ) = e − i m ′ α d m ′ , m l ( β ) e − i m γ \begin{array}{c} Y_{l}^{m}\left(R^{\alpha, \beta, \gamma}(\mathbf{u})\right)=\sum_{m^{\prime}=-l}^{l} D_{m^{\prime}, m}^{l}\left(R^{\alpha, \beta, \gamma}\right) Y_{l}^{m^{\prime}}(\mathbf{u}) \\ D_{m^{\prime}, m}^{l}\left(R^{\alpha, \beta, \gamma}\right)=e^{-i m^{\prime} \alpha} d_{m^{\prime}, m}^{l}(\beta) e^{-i m \gamma} \end{array} Ylm(Rα,β,γ(u))=m=llDm,ml(Rα,β,γ)Ylm(u)Dm,ml(Rα,β,γ)=eimαdm,ml(β)eimγ

其中 d m ′ , m l d^l_{m',m} dm,ml 为维格纳D矩阵。

将上式代入球谐函数
f ( u ) = ∑ l ∞ c l m Y l m ( u ) f(u) = \sum_l^\infin{c_l^mY_l^m(u)} f(u)=lclmYlm(u)
得到
f ( R α , β , γ ( u ) ) = ∑ l ∞ ∑ m = − l l c l m Y l m ( R α , β , γ ( u ) ) = ∑ l ∞ ∑ m ′ = − l l g l m ′ Y l m ′ ( u ) g l m ′ = ∑ m = − l l c l m D m ′ , m l ( R α , β , γ ) \begin{array}{c} f\left(R^{\alpha, \beta, \gamma}(\mathbf{u})\right)=\sum_{l}^{\infty} \sum_{m=-l}^{l} c_{l}^{m} Y_{l}^{m}\left(R^{\alpha, \beta, \gamma}(\mathbf{u})\right) =\sum_{l}^{\infty} \sum_{m^{\prime}=-l}^{l} g_{l}^{m^{\prime}} Y_{l}^{m^{\prime}}(\mathbf{u}) \\ \quad\\ g_{l}^{m^{\prime}}=\sum_{m=-l}^{l} c_{l}^{m} D_{m^{\prime}, m}^{l}\left(R^{\alpha, \beta, \gamma}\right) \end{array} f(Rα,β,γ(u))=lm=llclmYlm(Rα,β,γ(u))=lm=llglmYlm(u)glm=m=llclmDm,ml(Rα,β,γ)

根据上式,我们可以得出,如果要计算一个旋转之后的球谐函数,只需要对原来球谐函数的球谐系数处理就好。
处理方程即是:
g l m ′ = ∑ m = − l l c l m D m ′ , m l ( R α , β , γ ) g_{l}^{m^{\prime}}=\sum_{m=-l}^{l} c_{l}^{m} D_{m^{\prime}, m}^{l}\left(R^{\alpha, \beta, \gamma}\right) glm=m=llclmDm,ml(Rα,β,γ)

漫反射环境光 L ( w i ′ ) L(w'_i) L(wi)

  • 只关心光线和法线的夹角,不考虑其他角度
  • 只考虑m’=0的情况

得到
在这里插入图片描述
结合下式
在这里插入图片描述
得到
在这里插入图片描述

漫反射环境光 t ( θ ′ ) t(\theta') t(θ)

最终结果

在这里插入图片描述

  • 对于 L l m L_l^m Llm而言,仍需要预计算(与上一节相同)
  • 对于 t l t_l tl,与上一篇不同的是:已经变成了如下几个常数(只与l有关)与 Y l m ( n ) Y_l^m(n) Ylm(n)的乘积
    在这里插入图片描述
  • 对于 Y l m ( n ) Y_l^m(n) Ylm(n)项,他的参数是具体着色点的法线n。
    该Y通过如下转换,得到法线n下的基坐标函数。再与外部预计算好的 L l m L_l^m Llm t l t_l tl进行简单乘积得到最终的漫反射环境光!
    在这里插入图片描述

光泽(镜面)反射环境光

首先将光照方程列出
在这里插入图片描述
对光照方程进行分解
在这里插入图片描述
注意这里与IBL 文章中的分解方式不一样, n ⋅ w i n\cdot w_i nwi被分到前面一部分了(IBL是分到后面一部分的)

但是球谐函数处理低频信息更好(意思是更适合处理漫反射或者是粗糙度比较大的光泽反射),因为对于纯镜面反射而言,我们需要非常高阶的球谐函数才能进行逼近,那计算量实在是太大了。

因此一般使用IBL处理高光环境光反射。

球谐函数也不是仅仅只能用于求环境光,这种将函数展开的思想还普遍用于解决顺序无关的透明度等问题。

参考

在这里插入图片描述

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

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

相关文章

cad打印样式丢失怎么处理?

一提到CAD软件,我相信很多朋友都特别熟悉,因为在工作中很多的图纸设计都有它的功劳,经常从事cad设计的朋友对于cad打印样式都非常地精通了,在打印样式里包括了图纸的颜色、线条等,由于各种原因cad打印样式丢失了&#…

自行实现字符串转浮点数函数atof()

【重复造轮子的原因】 尽管atof是标准C中自带的函数,用于将字符串转为浮点数,但是在某些环境下有可能没法使用的(例如CUDA环境中,没有atof函数,但是math.h可以使用),因此自行实现。 【通过的测试用例】 【实现的代码】 #include <stdio.h> #include <math.h…

linux(rhel7)内核参数优化

内核参数 Linux sysctl.d 配置内核参数 rhel7中sysctl.d和sysctl.conf的执行顺序 执行顺序&#xff1a; sysctl.d > /etc/sysctl.conf sysctl.d的执行顺序&#xff1a; /etc/sysctl.d/run/sysctl.d/usr/local/lib/sysctl.d/usr/lib/sysctl.d/lib/sysctl.d/ 对于不同目录下…

交换排序——冒泡排序、快速排序

交换排序就是通过比较交换实现排序。分冒泡排序和快速排序两种。 一、冒泡排序&#xff1a; 1、简述 顾名思义就是大的就冒头&#xff0c;换位置。 通过多次重复比较、交换相邻记录而实现排序&#xff1b;每一趟的效果都是将当前键值最大的记录换到最后。 冒泡排序算法的原…

如何关闭一个tcp连接 阻塞和等待的区别 b树查找的过程

如何关闭一个 TCP 连接 可能大家第一反应是「杀掉进程」不就行了吗&#xff1f; 是的&#xff0c;这个是最粗暴的方式&#xff0c;杀掉客户端进程和服务端进程影响的范围会有所不同&#xff1a; • 在客户端杀掉进程的话&#xff0c;就会发送 FIN 报文&#xff0c;来断开这个客…

企业网络小实验-MUX-Vlan(NAT)

路漫漫其修远兮&#xff0c;吾将上下而求索 直接上实验 实验说明 模拟公司的部门实验&#xff0c; &#xff08;1&#xff09;公司主机如图所示&#xff0c;配置DNS服务器&#xff0c;配置NAT地址转换&#xff08;使用easy-ip的形式&#xff09;访问外网。 &#xff08;2&…

基于SSM的家政服务网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ARM架构之寄存器

CPU进行数据运算和逻辑运算 寄存器 概念 寄存器是处理器内部的存储器&#xff0c;没有地址 作用 一般用于暂时存放参与运算的数据和运算结果 分类 包括通用寄存器、专用寄存器、控制寄存器 C语言中四种存储类型的详解 一、auto存储类型 用auto存储类型说明的变量都是局部于…

单片机有哪些分类?

单片机有哪些分类? 1.AVR单片机-----速度快&#xff0c;一个时钟周期执行一条指令&#xff0c;而普通的51单片机需要12个时钟周期执行一条指令。当然&#xff0c;Atmel公司出品的AT89LP系列单片机也是一个时钟执行一条指令&#xff0c;但目前还未普及。AVR单片机比51单片机多…

2023年全国大学生数学建模B题

多波束测线问题 1.问题提出 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c;在不同界面上产生反射&#xff0c;利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信号&#xff0c;并记录从声波发射到信号接…

显示器配置信息删除

显示器配置信息删除 1 介绍2 操作参考 1 介绍 笔记本屏幕坏了&#xff0c;手头的拓展显示器都是配置成拓展显示&#xff0c;需要先找一台没配置过的显示器将系统中显示器配置信息删除&#xff0c;这样就能复制屏幕显示到拓展屏幕上了。 2 操作 Windows 的显示器配置位于注册…

go语言基本操作---六

并发编程 并行&#xff1a;指在同一时刻&#xff0c;有多条指令在多个处理器上同时执行。 并发&#xff1a;指在同一时刻只能有一条指令执行&#xff0c;但是多个进程指令被快速的轮换执行&#xff0c;使得在宏观上具有多个进程同时执行的效果&#xff0c;但在微观上并不是同时…

机器学习——逻辑回归(LR)

机器学习——逻辑回归&#xff08;LR&#xff09; 文章目录 前言一、原理介绍二、代码实现2.2. 混淆矩阵2.3. 分类报告2.4. 可视化分类结果 三、额外&#xff08;先划分数据集再降维与先降维再划分数据集&#xff09;3.1. 先划分数据集再降维3.2. 先降维再划分数据集3.3. 比较 …

2023数学建模国赛选题建议及BC题思路

大家好呀&#xff0c;全国大学生数学建模竞赛今天下午开赛啦&#xff0c;在这里先带来初步的选题建议及思路。 目前团队正在写B题和C题完整论文&#xff0c;后续还会持续更新哈&#xff0c;以下只是比较简略的图文版讲解&#xff0c;团队目前正在写B、C题完整论文&#xff0c;…

【C语言】进阶——深度剖析数据的存储

目录 1.数据类型 &#x1f43b;整型分类 2.整型在内存中的存储 &#x1f43b;2.1原码&#xff0c;反码&#xff0c;补码 &#x1f43b;2.2大小端介绍 3.浮点数在内存中的存储 1.数据类型 使用不同类型开辟内存空间的大小不同&#xff08;大小决定了使用范围&#xff09…

jmeter系列-测试计划详细介绍(3)

测试计划的作用 测试计划描述了 Jmeter 在执行时&#xff0c;一系列的步骤一个完整的测试计划包含了一个或多个【线程组、逻辑控制器、采样器、监听器、定时器、断言和配置元素】 Jmeter原件和组件的介绍 基本元件的介绍 多个类似功能组件的 容器&#xff08;类似于类&…

第四节唯物辩证法(两大总特征)

新旧事物与时间无关&#xff0c;与是否合乎历史方向有关&#xff0c;如有些00后思想可能落后与80后

【C++】内联函数讲解和关键字inline纯干货简介

今日翻看《C Primer Plus》&#xff0c;看到一个陌生的东西--内联函数&#xff0c;立马前来记录一下。 内联函数和常规函数区别 为了明白内联函数和常规函数的区别&#xff0c;首先需要知道程序运行时&#xff0c;遇到常规函数时如何处理的&#xff1a; 编译过程的最终产品时…

python+django青少年心理健康测评分析与预警的设计与实现vue

本青少年心理健康测评分析与预警主要包括二大功能模块&#xff0c;即用户功能模块和管理员功能模块。 &#xff08;1&#xff09;管理员模块&#xff1a;系统中的核心用户是管理员&#xff0c;管理员登录后&#xff0c;通过管理员功能来管理后台系统。主要功能有&#xff1a;首…

记LGSVL本地编译记录

主要的编译参考来着官方文件 Unity安装 安装unity hub 安装2020.3.3f1在unity hub上 但是我发现没有2020.3.3f1&#xff0c;只有2020.3.3f1c1&#xff0c;其实c1就是中国版&#xff0c;没有什么影响 GIT安装 安装GIT安装Git LFS验证git-lfs(输出Git LFS initialized就&am…