球谐光照与PRT学习笔记(一):引入

https://zhuanlan.zhihu.com/p/49436452

球谐光照与PRT学习笔记(一):引入

鸡哥

计算机图形学话题下的优秀回答者

球谐光照(Spherical Harmonic Lighting)和PRT(Precomputed Radiance Transfer)这一套东西也是我在鹅厂实习疯狂摸鱼看论文学的。因为没有给在研项目的代码权限,我们实习生就先被晾在一边看论文和写代码了=,=现在先暂时溜回学校搞毕设去了,但是在那搞了一轮学到的SH lighting这套东西还是挺让我眼前一亮的,学完感觉值得总结一下。

向我一样新手入门最好是从[Green 2003]《Spherical harmonic lighting: The gritty details》 这篇文献入手,这篇文献长达40+页,对于老司机来说是啰嗦得不行的,但是作为萌新入门教材就很棒了。但在亲自实现的时候会发现[Green 2003]这篇文献在某些地方还是不算非常细致,所以笔者会以《gritty details》为主体,加一些自己的补充讲一下球谐光照和PRT。内容不少,应该会不止一篇文章,敬请关注。

第一篇几乎都是引入和铺垫性质的内容。


什么是球谐光照?什么是PRT?

那其实顾名思义,球谐光照(Spherical Harmonic Lighting)就是基于球面调和(SH, Spherical Harmonics)这个数学工具的一种光照/着色算法。球谐光照也是一种用让我们捕捉(capture)光照、随后进行重新光照(relight)、实时展现全局光照(Global Illumination)风格的区域光源(area light sources)与软阴影的一种技术。这种技术最初是在Siggraph 2002的论文[2]里面由Sloan, Kautz, Snyder提出的。

如果你可以理解一维函数的傅立叶变换(Fourier Transform),那么其实你也很容易理解在图形学领域里面SH的意义,因为在限定在图形学的语境下,SH就是一种定义在球面上的广义二维傅立叶变换,这可以把离散的球面函数参数化。(顺手分享一个挺好的傅立叶展开可视化网站:

Understanding Fourier Approximations & Oscillators​

bgrawi.com

一般来说,球谐光照可以用有限制带宽的Spherical Harmonics来模拟低频的环境光照明,反射光和高光比较高频,用低阶球谐函数来编码的话精度是不够用的。Unity里面的Light Probe据说也是有使用到三阶SH来捕捉光照,所以我觉得Light Probe就有点像是使用Spherical Harmonics来编码的光场(light field)捕捉器

图:前三阶球谐基可视化

[3]Stupid Spherical Harmonic Tricks也介绍了非常多关于Spherical Harmonics的来源与应用:作为拉普拉斯方程的解,SH被用来解决了很多物理上的关于势能(potential)的问题,例如热传递方程、重力场、电磁场等,甚至量子化学和量子力学里面也用SH来对原子中的电子及量子角动量进行建模。不过后来把SH这套数学工具引入CG后,也产生了不少应用:用于模拟体积散射效应(volumetric scattering effects)[4],没有全局阴影的环境反射(environmental reflection)[5],非漫反射的离线光照传输(light transport)模拟[6],BRDF的表示[7],image re-lighting[8],有一定限制的灯光的Image Based Rendering[9],对出射光源的建模[10]等。

图:我这种菜鸡其实并不懂量子力学= =但是量子力学在描述量子轨道角动量和出现概率似乎是用到了球谐函数2333

.

PRT也顺便提提吧,毕竟PRT是SH在图形学里面一个比较重要的应用。PRT全称是Precomputed Radiance Transfer,大致意思是“把场景物体间复杂的光线交互进行预计算和综合”,如果拿Diffuse SH Lighting来举例的话,光线多次bounces/inter-reflection、AO等复杂的“传输”都可以概括成一组球谐系数向量,然后后面跟光照的球谐系数向量进行交互就可以进行着色。至于具体怎么做,这个就用到了Spherical Harmonics的神奇性质了,这里先不展开。


渲染方程

第一篇因为是引入就先不讲那么多了,最后稍微回顾一下渲染方程(The Rendering Equation)吧。最简单的光照模型之一就是漫反射模型(diffuse surface reflection model)了,它也被称作是“点积光照”(dot product lighting),因为光照的强度是要乘个系数的,这系数就是表面法线 和入射光向量 的点积,也就是:

这是渲染方程(The Rendering Equation)[41]的简化,而渲染方程是基于物理建模推算出来的一种“黄金准则”,可以看看[Kajiya 1986]。但问题是,渲染方程并不是那么好解的,最起码在“实时”这个限定条件下是一个很硬核的问题。想想对于表面上的每一个点,四面八方入射的光线都会对他有光照亮度的贡献,单个点的最终出射光强要计算出来就需要很多的光线采样,这么一来几乎难以又精确又实时。求解渲染方程是一个半球面(hemi-sphere)上的积分:

其中:

是从当前着色位置 ,方向 出射的光线强度

是在位置 ,方向 出射的自发光(下标e就是emission的意思吧- -)

是在位置 处的BRDF(BRDF可以看作是出射光radiance和入射光irradiance的比值)

是 沿着 入射的、从不同于 的另一个位置 发射的光线

是几何项(geometry term),一般就是 ,也就是cosine-term

是可见性测试函数,如果 可以“看见” 则返回1,否则返回0(也就是光线不被遮挡才能有贡献啊)

图:众多入射光都会对出射光产生共贡献

上面的渲染方程只是一个比较简化的版本,但是这里要提一下的就是所谓的“传输函数”(transfer function),按我理解这个传输函数指的就是Precomputed Radiance Transfer的那个Transfer,也就是渲染方程右侧的积分号里面除了入射光以外的项。在Diffuse光照模型里面,transfer function可以直接当作是cosine-weighted visibility[12]。于是我们把“传输部分”和“光照部分”分开操作,分开预计算,最后利用Spherical Harmonics的一个牛逼特性进行快速积分。细节这一篇先不讲了。因为《gritty details》在提到transfer function的时候还没有解释,看得我挺难受的,所以这里先提一下。

下一篇也是铺垫,讲蒙特卡洛积分=v=


引用

[1]Green R. Spherical harmonic lighting: The gritty details[C]// Game Developers Conference. 2003.

[2]Sloan P P, Kautz J, Snyder J. Precomputed radiance transfer for real-time rendering in dynamic, low-frequency lighting environments[C]// Conference on Computer Graphics & Interactive Techniques. ACM, 2002:527-536.

[3]Sloan P P. Stupid Spherical Harmonics (SH) Tricks[C]// 2010.

[4]KAJIYA, J, von HERZEN, B. Ray Tracing Volume Densities, SIGGRAPH 1984.

[5]CABRAL, B, MAX, N, SPRINGMEYER, R. Bidirectional Reflection Functions from Surface Bump Maps, SIGGRAPH 1987.

[6]SILLION, F, ARVO, J, WESTIN, S, GREENBERG, D. A Global Illumination Solution for General Reflectance Distributions, SIGGRAPH 1991.

[7]WESTIN, S, ARVO, J, TORRANCE, K. Predicting Reflectance Functions from Complex Surfaces”, SIGGRAPH 1992.

[8]NIMEROFF,J, SIMONCELLI, E, DORSEY, J. Efficient Re-rendering of Natural Environments, EUGROGRAPHICS Workshop on Rendering, 1994.

[9]WONG, T, HENG, P, OR, S, NG, W. Image-Based Rendering with Controllable Illumination, Eurographics Workshop on Rendering, 1997.

[10]DOBASHI, Y, KANEDA, K, NAKATANI, H, YAMASHITA, H. A Quick Rendering Method Using Basis Functions for Interactive Lighting Design, EUROGRAPHICS 1995.

[11] Kajiya J T. The rendering equation[J]. Acm Computer Graphics, 1986, 20(4):143-150.

[12] http://jankautz.com/courses/ShadowCourse/09-RadianceTransfer.pdf

球谐光照与PRT学习笔记(一):引入相关推荐

  1. PRT(Precomputed Radiance Transfer)球谐光照(Spherical Harmonic Lighting)

    最近因为开始做PRT(Precomputed Radiance Transfer),看了一些资料.wikipedia上的解释:       Precomputed Radiance Transfer ...

  2. 图形学基础|球谐光照(Spherical Harmonics Lighting)

    球谐光照(Spherical Harmonics Lighting) 文章目录 球谐光照(Spherical Harmonics Lighting) 一.前言 二.球谐函数 2.1 基函数 2.2 投 ...

  3. [高级光照]球谐光照

    Spherical Harmonic Lighting(球谐光照) Robin Green 这篇文章只是Spherical Harmonic Lighting这个论文的解释,看的时候请参照原文,原文需 ...

  4. Spherical Harmonic Lighting(球谐光照)

    1.简介 球谐光照是实时渲染技术中的一种,属于Precompute Radiance Transfer(PRT)的范畴.经过预处理并存储相应的信息之后,它可以产生高质量的渲染及阴影效果.球谐光照需要使 ...

  5. Global Illumination_Spherical Harmonic Lighting(球谐光照)

    首先我们需要知道的是,如何计算环境光shading,一般我们会想到IBL,其实我们也可以使用球谐函数来进行表示,本部分我们就先来了解下如何使用SH来计算环境光照(后续我们也会继续来看一下环境光阴影的计 ...

  6. Unity间接光 ibl(基于图像的渲染)和SH(球谐光照)

    转自:https://zhuanlan.zhihu.com/p/68025039 间接光 间接光的实现与ibl(基于图像的渲染)和SH(球谐光照)这两个名词分不开.基于图像的渲染已经是很大的一个体系了 ...

  7. (八)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:下篇(unity3D中的球谐光照和SH球谐函数、unity实时阴影抗锯齿解决方案)

    一.探针基于球谐函数的全局光照 球谐光照是基于预计算辐射度传输理论实现的一种实时渲染技术.预计算辐射度传输技术能够重现在区域面光源照射下的全局照明效果.这种技术通过在运行前对场景中光线的相互作用进行预 ...

  8. Vue学习笔记 —— 路径引入

    前言 在html文件中,通过script标签来引入js,而在vue文件中通过import方式导入文件.并且import不止是可以导入js文件. 例:import HelloWorld from './ ...

  9. games202:三,实时环境光照IBL + PRT

    games202:三,实时环境光照IBL + PRT 一,IBL(image-based lighing) 1.0 漫反射部分:球谐光照 1.1 镜面反射部分:Split-Sum近似 1.1.1 第一 ...

最新文章

  1. [Issue Fixed]-不能为虚拟电脑xxx打开一个新任务
  2. CSDN专家分和博客系统积分获得规则!
  3. centos配置oracle自启,centos 下配置oracle11gR2开机自启
  4. SAP UI5 Library Resource Bundle 的设计原理
  5. Android与Js进行交互
  6. Ch5501-环路运输【环形处理dp】
  7. [P1580] yyy loves Easter_Egg I
  8. SQL-十步完全理解 SQL
  9. ZRender实现粒子网格动画实战
  10. 作者:刘诗凯(1983-),男,华为大数据分析产品部主任工程师。
  11. 【BZOJ1084】【codevs2454】最大子矩阵,DP
  12. 计算机在英语课中的应用 博客,信息技术在小学英语教学中的应用
  13. LINUX下载编译libxml2
  14. Linux中把程序添加到系统服务中
  15. matlab机器人模型仿真,一知半解|MATLAB机器人建模与仿真控制(1)
  16. 5G牌照发放了,但需要购买5G手机的用户应等明年再购买
  17. Java使用Lambda表达式多字段求和
  18. QT实现TCP断点传输文件
  19. 【FXCG】什么是风险?
  20. 第一章:Google简介

热门文章

  1. php 2003生成word,使用PHPWord生成word文档的方法详解
  2. 大数据应用场景全景图
  3. 2.3 数值分析: 矩阵三角分解法
  4. MySQL 5.7.17 免安装版本的安装,配置及MySQL的密码修改
  5. 运维利器之mysql进行表的分区
  6. 2021年11月软考网络规划设计师上午真题及答案解析
  7. 学习笔记-公有云安全
  8. 2022课堂云 艺术的启示 章节习题
  9. Flutter Dio二次封装
  10. ffmpeg添加字幕(包含srt文件)