去年10月自学了edx上的公开课Foundation of Computer Graphics,从此就入了图形学的坑。这个课的老师Ravi Ramamoorthi在第一节课上介绍自己的博士论文是关于Spherical Harmonic Lighting的,没想到正好半年后就要学这方面的知识。
这篇文章介绍如何计算三种Environment Mapping(EN)的Spherical HarmonicCoefficients(SHC)。其中Sphere Map的计算方法是来自Ramamoorthi[1],Cubic Map和ParabolicMap的计算方法是自GPU Gem2的第十章[2]。
基本原理
1. Envorinment Map
原理可参照参考[3][4]中的资料,理解EM的原理有助于理解如何计算其每个texel对应的Solid Angle
2. Spherical Harmonic
原理可参照参考[5][6]中的资料,可对照《信号与系统》中的傅里叶变换来理解。还可参考本文最后的 “Spherical Harmonic其他资料”。
计算方法
SHC可由公式1计算得到
对于一个EM来说,公式1可变为
其中:
N是texel总数
L (i)是第i个texel的RGB值
Y_l_m(i)是第i个texel的Spherical Harmonic Basis Function的值
dw(i)是第i个texel对应于单位球上的solid angle,满足
所以,要计算EM的SHC,则需要分别计算出 Y_l_m(i)和 dw(i)。对于不同的EM来说,计算 Y_l_m(i)和 dw(i)的方法是不一样的。
Parabolic Map需要计算两面,计算方法相同,以+z面为例,如图所示
Solid Angle:
SH Basic Function:
由n和v计算出r,由r计算Y_l_m
Cubic Map
Cubic Map需要计算6个面,每个面计算方法是一样的,以+z面为例,如图所示
Solid Angle:
SH Basis Function:
由(x,y,1)计算Y_l_m
Sphere Map
Ramamoorthi的计算方法是先将Sphere Map的texel映射到单位球上。如下图所示 ,紫色的点代表靠近 Sphere Map圆心的texel,绿色的点代表边缘的texel,越靠近边缘绿色越深。
Solid Angle:
SH Basis Function:
通过单位球上的点(x,y,z)可以计算出Y_l_m
我现在暂时还没有弄明白为什么要这样计算Solid Angle。参考[4]中说Sphere Map边缘的texel应该比中心的texel包含更多的环境信息,按照我的理解边缘的texel对应的Solid Angle应该更大才对。
用Ramamoorthi的方法可以得到和他论文一样的结果。为了方便计算,均采用PPM格式。
参考
[1] Ramamoorthi, Ravi, and Pat Hanrahan, "An Efficient Representation for Irradi-ance Environment Maps," Computer Graphics (SIGGRAPH 2001 Proceedings), pp. 497-500, August 2001.
[2] Gary King, “Real-Time Computation of Dynamic irradiance Environment Maps,” GPU Gems 2.
[3] Jason Zink, “Dual Paraboloid Mapping In The Vertex Shader,”gamedev.net.
[4] Paul Zimmons, “Final Project : Spherical, Cubic, and Parabolic Environment Mappings,”
[5] Robin Green, “Spherical Harmonic Lighting : The Gritty Details,”
[6] Peter_Pike Sloan, “Stupid Spherical Harmonics(SH) Tricks,”
附:Spherical Harmonic其他资料
[1] kayru.org/articles/spherical-harmonics-in-games/
[2] http://www.yasrt.org/shlighting/
[3] Kelly Dempski, “Advanced lighting And materials With Shaders”