三种Envorinment Map的Spherical Harmonic Coefficients的计算方法

去年10月自学了edx上的公开课Foundation of Computer Graphics,从此就入了图形学的坑。这个课的老师Ravi Ramamoorthi在第一节课上介绍自己的博士论文是关于Spherical Harmonic Lighting的,没想到正好半年后就要学这方面的知识。

这篇文章介绍如何计算三种Environment Mapping(EN)的Spherical HarmonicCoefficients(SHC)。其中Sphere Map的计算方法是来自Ramamoorthi[1],Cubic MapParabolicMap的计算方法是自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

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”

时间: 2024-10-31 07:39:31

三种Envorinment Map的Spherical Harmonic Coefficients的计算方法的相关文章

JAVA四种遍历Map的方法

import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set; /** Created by song on 2019/1/17.*/public class MapT {public static void main(String[] args) {Map<Integer,String> map=new HashMap<>();map.put(1,"

Java中Map的三种遍历方法

Map的三种遍历方法: 1. 使用keySet遍历,while循环: 2. 使用entrySet遍历,while循环: 3. 使用for循环遍历. 告诉您们一个小秘密: (下↓面是测试代码,最爱看代码了,啰嗦再多也没用) 一般人我不告诉他哦. import java.util.*; //0 我的Main界面 public class MapTraverse { public static void main(String[] args) { String[] str = {"I love you

Map三种遍历方式

package decorator; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.junit.Before; import org.junit.Test; /** * 对于Map的三种方式遍历 1.keySet() 2.values() 3.entrySet() *

map的三种遍历方法!

map的三种遍历方法! 集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ /* * To change this template, choose Tools | Templates * and open the template in the editor. */package cn.tsp2c.liubao; import java.util.Collection;import java.util.HashMap;import java.util.Iterator

Map的三种遍历方式

对于Map的三种方式遍历 1.keySet() 2.values() 3.entrySet()三种方式得到Set之后,都可以使用 foreach或者iterator, 不能使用for,因为数据结构决定的 package com.fync.jsj.mapTemplate; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import ja

遍历Map的三种方法

Map<String,Object> map = new HashMap<>();map.put("1",1);map.put("2",2);map.put("3",3);// 第一种遍历,根据keySet()方法System.out.println("第一种遍历方法:");for(String key : map.keySet()) { Object obj = map.get(key); Syste

Mybatis之foreach用法----List、Array、Map三种类型遍历

在mybatis的xml文件中构建动态sql语句时,经常会用到标签遍历查询条件.特此记录下不同情况下书写方式!-------仅供大家参考------ 1. foreach元素的属性 collection: 需做foreach(遍历)的对象,作为入参时,list.array对象时,collection属性值分别默认用"list"."array"代替,Map对象没有默认的属性值.但是,在作为入参时可以使用@Param("keyName")注解来设置自

编写Unity3D着色器的三种方式

不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed function shader vertex and fragment shader surface shader 为什么Unity3D要提供三种shader的编写方式呢?那是因为三种方式的编写的难易度有区别,对应着不同的使用人群.其实我觉得这是Uniy3D想得有点多了,着色器不单止是为了实现效果,

【Struts2】Struts2获取session的三种方式

1.Map<String,Object> map =  ActionContext.getContext().getSession(); 2.HttpSession session = ServletActionContext.getRequest().getSession(); 3.让Action实现SessionAware接口,并实现public void setSession(Map<String, Object> session) {} 方法,Struts2会在实例化Act