Upload
-
View
1.541
Download
0
Embed Size (px)
DESCRIPTION
環境光, 環境マッピング, 放射照度マップ, 放射照度マップの球面調和関数近似
Citation preview
ĪőŅĩŋĿĤijĨĮ�Ç�ª108ê�@ĎĚĝ�t�
59ď�ĎĚĝß]��@��
2
�f��ďpN�H�
• l s4ďaO©�Àêdωi ďpNÎUŒl¨Üêt, b, nœ�
• ��ºâ�ďûď��ĎĚĝpN�U�
• þă÷ĆĉŔ��ºâ�ďE���öěďpN�UĐ�
n l
θi dωi
3
Li(l) =dE
d!icos✓i
dE = Li(l)d!icos✓i
Ω�
E =
Z
⌦Li(l) cos ✓id!i
pNÎU�
• BRDFďêHµ
• v s4ĒďpNÎUêLo(v) Đ�
• �V�Ċºāđ�
ĚĜ�
v l n
t φi φo
φ
θo θi
4
Lo
(✓o
,�o
) =
Z 2⇡
�i=0
Z⇡/2
✓i=0f(✓
i
,�i
, ✓o
,�o
)⌦ Li
(✓i
,�i
) cos ✓i
sin ✓i
d✓i
d�i
(d!i = sin ✓id✓id�i)
f(l,v) =dL
o
(v)
dE(l)
dE = Li(l)d!icos✓i
Lo
(v) =
Z
⌦f(l,v)⌦ L
i
(l) cos ✓i
d!i
��
• E�ď�ÖĠ"Ĝ0ĆăĘď�
n
v θiL
EL lL
ωL n
v LL
���ŖS¹�³�â���
Lo
(v) =
Z
!L
f(l,v)⌦ LL
cos ✓i
d!i
⇡ f(lL
,v)⌦ EL
cos ✓iL
5
G�kq/Nâ�
• G�kq/NâďpNÎUĐpN�UĎ��Āĝ�
• þă÷ĆĉŔûďpN�UĐ�
6
cdiff Đâďkq/N¸�Lo
(v) =cdiff
⇡E
E =
Z
!L
LLcos✓id!i
⇡ ELcos✓iL
e(p)
p
n
Θ
pl
Li(p, l)
ŁĨĶōpN�U�
�êp Đ�îč\ęDøýępNÎU!Qď��Ď9ĔĞĉòĝ�
ûĞĠêe ďs4öě&|Āĝ�Ďá¯ĀĝŒŁĨĶōpN�Uœ�
Θ Đêp Ġ9Ė����
: p öěêl s4ďpNÎU�
7
Li(p, l) e(p) =
Z
⇥Li(p, l)ld!i
e(p) pn
p
ŁĨĶōpN�UĎĚĝpN�U�
�6ďpN�U�ºâ (n ďs4) ďpN�Uöě¼âďpN�UĠXòăĘď�
¼âĎ�÷[ăěčúĞđ
8
E(p,n)� E(p,�n) = n · e(p)
E(p,n) = n · e(p)E(p,�n) = 0
ŁĨĶōpN�Uċ�Ú�
• ŁĨĶōpN�UĐ.�ď�Ú÷MÈ�• �čĝ¸ď��÷�ôěĞăċø�
• á¯þăŁĨĶōĐ�ÚüċĎ�čĝs4Ġ4ù�
• �ĉď��÷3ÿĮłĨĶō!Qďċø�• ŁĨĶōĐ�ĉ3ÿs4Ġ4ù�
• þă÷Ćĉ
• �bêpL -^êrL ď��ď�� (ºâďpNÎUêLL)�
pL�
p�l�
rL�
9
l =e(p)
|e(p)| , EL = cL|e(p)|
l =pL � p
|pL � p| , EL =⇡r2Lr2
LL
r�
�@��
• Ül�ďpNÎU÷&|s4ĎMþĉ�AĊñĝċĕčĀ�• pNÎUĐHrĊºýĞĝ→ LA
• Ül�÷čòĬőŐĐ��ŌģōĊĐčò�• ��ď�÷[ăěčòÖ!ĐG�Ďé�
LA�
10
�@��
�@�čþ� �@�ñĜ�
11
�@�ĎĚĝpNÎU�
• pNÎUĐâď�³ên ę¿³êv Ď�Ý��
• ĬĦőĵĤŐĩďàĐûĞĠ¤l�ďg!Ď)ôĝ�
12
Lo
(v) =
cdiff
⇡⌦ ⇡L
A
+
nX
k=1
ELkcos✓ik
!
Lo
(v) =
Z
⌦f(l,v)⌦ L
i
(l) cos ✓i
d!i
=
cdiff
⇡⌦ L
A
Z
⌦cos ✓
i
d!i
= cdiff
⌦ LA
�@�ĎĚĝpNÎU�
• �fďêBRDF ĎMþĉ�
• �@�/N�êRA(v)
13
Lo
(v) = LA
Z
⌦f(l,v) cos ✓
i
d!i
+
nX
k=1
f(lk
,v)ELkcos✓ik
RA(v) =
Z
⌦f(l,v) cos ✓id!i
�@�ď/N�Đ¿�Ď�FĀĝ�
�@�ĎĚĝpNÎU�
• �@�ď/N�rêcamb
14
Lo
(v) = camb
⌦ LA
+
nX
k=1
f(lk
,v)ELkcos✓ik
kq/N¸êcdiff ċ«þò�
kq/N¸êcdiff Ùâ/N¸êcspec�
Øĕ�ú7�
�@ńijľŐĩ�59ď��ďĴĨĮIJňĎĚĝº��
15
�@ńijľŐĩê(Environment Mapping) • �@Œ59ďewœĠĴĨĮIJňċþĉńijľŐĩĀĝ�
• xâĒďuĜÐĕĠo ¢Ďº�Āĝ�• /NńijľŐĩê(Reflection Mapping)
• iåď���• ¿�öě¡NýĞă¿³÷��ºâ�Ċ/Nþăs4Ġ�ėĝ�• /Ns4Ď´öĞăĴĨĮIJňĠ�{+þĉŔ��ºâ�ď/N�ďß]ÂĎ�ó
• i� • Blinn ċ Newell ďs� • Sphere Mapping • Cube Mapping • Dual Paraboloid Mapping�
16
Environment Mapping �
�����
v rn
r = 2 n ⋅v( )n− v
17
Blinn ċêNewell ďs��• /NŁĨĶōĠ�V�ĎAmĀĝ�
• �V�ďĻŋņőİĠ�ĆĉĴĨĮIJňĠ�{+�
• ĴĨĮIJň��Đï�Ë�¬:�ð�
x
yn
l
q
q
l
0</ /2 0 / /2 /
/ /2
/ r = (rx, ry, rz)v
</
18
r = (rx
, ry
, rz
) = 2(n · v)n� v⇢ = acos(�r
z
)� = atan2(r
y
, rx
)
ĺőĴijĨĮĬĦőı�#version 150 core !in vec4 pv; // ã��´!in vec3 nv; // ã�ď�³ŁĨĶō !uniform mat4 mw; // ŇĵōĽʼnőAm¹# !uniform mat3 mg; // �³Am¹#!out vec2 t; // ĴĨĮIJňV�!const float PI = 3.141593; !void main(void) !{ ! vec3 v = -normalize(mw * pv).xyz; // ¿³ŁĨĶō ! vec3 r = reflect(v, normalize(mg * nv)); // ¿³ď�/Ns4! float s = -acos(r.z) / PI; ! float t = atan(r.y, r.x) * 0.5 / PI + 0.5; ! t = vec2(s, t); ! …�
19
Sphere Mapping • ��ĒďuĜÐĕĠ�@ńijŀĎ�ó�
• ĴĨĮIJňĐ��ďÙĠn]þĉ`ěĞĝ�• ħņŋ÷uĜûġĊþĔó
• ¿³s4öě¾ăuĜÐĕďĴĨĮIJňĠ��Āĝ • ¿³s4ĠAyĊøčò�
20
ĴĨĮIJň��� �Ď�@ńijľŐĩ� ŃijĶĎ�@ńijľŐĩ�
Sphere Mapping ď>T¹#�u = (ux,ux,ux)
h = (hx,hx,hx)
v = (vx,vx,vx)
zx
y
O
n
n'r
z'
y'
v'
21
Ms
=
0
BB@
hx
hy
hz
0ux
uy
uz
0vx
vy
vz
00 0 0 1
1
CCA
Sphere Mapping ď>T¹#�
v0 = (0, 0, 1)n0 = Msnr = 2(n0 · v0)n0 � v0
/Ns4ċĴĨĮIJňV��
/NŁĨĶō�
¿³ŁĨĶō�
þă÷Ćĉ�ÜŁĨĶōĐ�O
v' = (0, 0, 1)
z'
y'n' = (n'x, n'y, n'z)
r
v
h
(n'x, n'y)
22
v0 = (0, 0, 1)
r = (rx
, ry
, rz
)
h0 =(r
x
, ry
, rz
+ 1)qr2x
+ r2y
+ (rz
+ 1)2= n0
m =qr2x
+ r2y
+ (rz
+ 1)2 n0 =
✓rx
m,ry
m,rz
+ 1
m
◆
�³ŁĨĶōċĴĨĮIJňV�ďMc�
n'n'x
n'y
y'
x'O
-1
-1
1
1
O 1
1
u
v
u
v
23
m =qr2x
+ r2y
+ (rz
+ 1)2
u =n0x
2+
1
2=
rx
2m+
1
2
u =n0y
2+
1
2=
ry
2m+
1
2
ĺőĴijĨĮĬĦőı�#version 150 core !in vec4 pv; // ã��´!in vec3 nv; // ã�ď�³ŁĨĶō !uniform mat4 mw; // ŇĵōĽʼnőAm¹# !uniform mat3 mg; // �³Am¹#!uniform mat3 ms; // Sphere Mapping ď>T¹#!out vec2 t; // ĴĨĮIJňV�!void main(void) !{ ! t = normalize(ms * n).xy * 0.5 + 0.5; ! … !
24
Cubic Environment Mapping�• ©s�Ď�@ńijŀĠÉĜ�úĝ�
• ĴĨĮIJň��Đř~�ó�• /Ns4ĎČďĴĨĮIJň÷ñĝö$%Āĝ�
25
ĴĨĮIJňďÕj�
26
ņĥŐŀŏĩŋŅ� glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, internal, ! WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, textureNX); ! glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, internal, ! WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texturePX);� glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, internal, ! WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, textureNY);� glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, internal, ! WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texturePY);� glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, internal, ! WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, textureNZ);� glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, internal, ! WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texturePZ);��
27
ĿŋĩņŐĶĬĦőı�#version 150 core !… !!uniform samplerCube cubemap; // Cube Map ď sampler !… !!in vec3 r; // /Ns4ŁĨĶōĐĺőĴijĨĮĬĦőıĊÂþĉõù !… !!void main(void) !{ ! vec4 rcolor = texture(cubemap, r); // /Ns4ď¸! … !�
28
Dual Paraboloid Mapping
• p�âĒďuĜÐĕĠ�@ńijŀĎ�ó�• Ř~ďĴĨĮIJňĠ�ó�
• Ñ ¢Ďè¥ŎŐįĊn]þă��÷��Ċøĝ�• è¥ŎŐįĠ�ôđħņŋ÷uĜÐĖûċĐčò�
1
-1
10
y = x2������
0.25
����� ��������
-0.4 -0.2 0.2 0.4
-1.5
-1
-0.5
0.5
1
1.5
d
θ$
29
d =pu2 + v2
✓ = arctan
✓d
0.25� d2
◆
rz
� 0
8><
>:
u =rx
2(1 + rz
)+ 0.5
v =ry
2(1 + rz
)+ 0.5
)
0
BB@
1 0 1 10 1 1 10 0 0 00 0 2 2
1
CCA
0
BB@
rx
ry
rz
1
1
CCA
rz
< 0
8><
>:
u =rx
2(1� rz
)+ 0.5
v =ry
2(1� rz
)+ 0.5
)
0
BB@
1 0 1 �10 1 1 �10 0 0 00 0 2 �2
1
CCA
0
BB@
rx
ry
rz
1
1
CCA
Paraboloid Mapping ďĴĨĮIJňV��• /NŁĨĶō�
30
Ċº�ďĴĨĮIJňĠ�{+Āĝ�
Ċ¼�ďĴĨĮIJňĠ�{+Āĝ�
ďċø�
ďċø�
r = (rx
, ry
, rz
)
Ř~ďĴĨĮIJňď2g�
31
OpenGL ď;H�¶Ġ�ĆăI»�• ã�ďĴĨĮIJňV�ċþĉê(rx, ry, rz, 1)T ĠÄHĀĝ�• ĴĨĮIJňAm¹#Ď(Ãď¹#ĠÄHĀĝ�
• ºċ¼ď�sďĴĨĮIJňĎMþĉ�{�Ġ�ėĝ�• ńōIJĴĨĮIJňĠ�ĆĉŔûĞěď�{�ď2ÂĠńijľŐĩĀĝ�• �sďĴĨĮIJňď�{�÷®9�ĎñĞđŔĘó�sďĴĨĮIJňĐ®9B÷�{+ýĞĝ�
• ®9Bď�{�ĠŗŒéœĎþĉõúđŔRĎČąěö�sĄúďĴĨĮIJňď�{�÷`ěĞĝ • IĐûĞĐóĔùòöčò ì ģōĿĢ�ĎĚĝĵħőōčČĠ�òĝ�
• ûĞĎĚĜCÀ\ďĴĨĮIJňV�÷ºċ¼ď�sďĴĨĮIJňĎĔă÷ĆĉòĉĘ�þùńijľŐĩýĞĝ�
32
GLSL ĎĚĝI» (ĿŋĩņŐĶĬĦőı)�#version 150 core !… !!uniform sampler2D front; // Øp�âńijŀďºďĴĨĮIJň!uniform sampler2D back; // Øp�âńijŀď¼ďĴĨĮIJň!… !!in vec3 r; // /Ns4ŁĨĶōĐĺőĴijĨĮĬĦőıĊÂþĉõù !… !!main() !{ ! vec2 uv = r.xy * 0.5 / (1.0 + abs(r.z)) + 0.5; ! vec4 rcolor = texture(r.z >= 0.0 ? front : back, uv); ! … !�
33
�@ńijľŐĩĎĚĝß]Â���æ=ďĴĨĮIJňĎĚĝº��
34
ĹĥŋĥĶńijľŐĩ�
• �@ńijľŐĩĠ�ĆĉĹĥŋĥĶĠº�Āĝ • ¿³ĠZÍê(0,0,1) ċ�·ýāăvď�³ŁĨĶōĠ�ėĝ • ë1 ≤ x, y ≤ 1ďæ=�Ċêz2 = 1 ë x2 ë y2 Ġ�ėĝ • z2 > 0 čěê(x, y, z) Ġ�³ŁĨĶōċþĉÙâ/N�ZUĠ�ėĝ • ĂĞĠĴĨĮIJňďê(0.5x + 0.5, 0.5y + 0.5) ď�´Ď�°Āĝ • Sphere Mapping ĎĚĜûďĴĨĮIJňĠkq/N�ZUĎ)
35
ĹĥŋĥĶďĴĨĮIJňĎĚĝÓò�
36
Åç�
• :ďĚóčÙâ/N�ĐČďĚóĎþĉ`ĝûċ÷Ċøĝö • �Đ¿³s4ŒĀčğą�âœöě&|ĀĝĘďċĀĝ • ļŐĶŚ�ď5ÏÖĎÑĈùĎ_Ćĉ�³ŁĨĶōê(x, y, z) ďêxy g!ď�7êx2 + y2 Đê1 ĎÑĈù�
37
�@ńijŀĿĤōİŌŐĩ�
• �@ńijŀĐuĜÐĕďº�÷1¶�• ćęęöčâękqâďß]Ďc�Āĝ�
• /N�ĐE¨�ď!QċBRDFď ĕÐĕ�
G�čÙâ/N ŒuĜÐĕœ�
Ùâ/N�ď!Q� kq/N�ď!Q�
38
ĿĤōİŌŐĩďs��
• �@ńijŀĠ<�ĎēöĀ�• {[Đ?hĎĚĆĉēús÷�čĝ�• £ĐLJčďĊ��¢č*�ďs÷ؽ�
39
�@ńijŀĿĤōİŌŐĩď±��
�ď�@ńijŀ� �@ńijŀĠēöþă?2�
40
G�kq/NâďE¨�ĎĚĝß]
41
���ŖS¹�³� E¨��
Ω
n
v
Li(l)
l v
θiL
EL lL
41 n
E =
Z
⌦Li(l) cos ✓id!iE = ELcos✓iL
pN�Uńijŀď�g�
42
Ω : p ďl¨ÜďE¨ n : p ď�³ŁĨĶō l : n ĎMþĉêθi 8Ìþăs4 Li(l) : E¨ďêl s4ďpNÎU�
n
En
θiLi(l)
Ω
pl
E¨Đêp öě,!ÔòĘďċĀĝ�
En =
Z
⌦Li(l) cos ✓id!i
n ďs4Ġ4òăâď pN�UêEn Ġ�WĊ�ėĝ�
ûďêEn ĠpN�Uńijŀď n ďs4Ď�°Āĝ�
pN�UńijľŐĩ�
43
ģōŁķ×(1 ë Rspec)×pN�Uńijŀ�
+ Rspec×/N�@ńijŀ�
�³ŁĨĶōĊīŐŀŌŐĩ�
/NŁĨĶōĊīŐŀŌŐĩ�
Cube Map ĎĚĝpN�Uńijŀ��@ńijŀ� pN�Uńijŀ�
44
pN�UńijŀďÑ �
pN�U!Q�
47
¤>TÝrďØĕ�ú7ĎĚĝÑ �
Øĕ�úýĞă¤>TÝr
48
¤>TÝr�
• �§
• ¨Ü¢čÝrĊĐ�
• ¤>TÝrďdÊ�
fi x( ), fj x( ) = fi x( ) fj x( )dx∫
fi n( ), fj n( ) = fi n( ) fj n( )dωΘ∫nŚ�böě4öós4�dωŚ.���ďaOâ§�ΘŚ.�����
fi ( ), fj ( ) =0 i ≠ j1 i = j
"#$
Θ#
dω$
n
49
¤Ýr>TÝrĎĚĝÝrďÑ �
• Ñ þĚóċĀĝÝrêftarget() ċ¤>TÝr#êfj() ċď�§
• ĚĜŔftarget() Đ�WĊÑ Ċøĝ�
kj = ftarget ( ), fj ( )
ftarget ( ) ≈ kj fj ( )j=1
n
∑
50
ōĭňŐķōÞÝr�
• ōĭňŐķōCäWŒŏķŌĪĮď�Wœ�
• ōĭňŐķōÞÝr�
• �+W�
Pn x( ) = 12n n!
dn
dxnx2 −1( )
n
Pnm x( ) = −1( )m 1− x2( )
m2 dm
dxmPn x( )
n−m( )Pnm x( ) = x 2n−1( )Pn−1m x( )− n+m−1( )Pn−2m x( )
Pmm x( ) = −1( )m 2m−1( )!! 1− x2( )
m2
Pm+1m x( ) = x 2m+1( )Pmm x( ) P1
0 x( ) = x
P00 x( ) =1
51
m� n = 0� n = 1� n = 2�
0�
1�
2�
ōĭňŐķōÞÝr�
P11 x( ) = − 1− x2
P00 x( ) =1
P10 x( ) = x
P20 x( ) = 1
23x2 −1( ) P2
1 x( ) = −3x 1− x2 P22 x( ) = 3 1− x2( )
52
Plm(x)�
-5 -4 -3 -2 -1 0 1 2 3 4 5
-3
-2
-1
1
2
3
l = 0, m = 0l = 1, m = 0l = 1, m = 1l = 2, m = 0l = 2, m = 1l = 2, m = 2
53
ōĭňŐķōÞÝrďdÊ�
Pim x( )
−1
+1∫ Pj
m x( )dx =0 i ≠ j
22n+1
n+m( )!n−m( )!
i = j = n
$
%&
'&
54
�âÆ7Ýr�
Klm =
2l +14π
l − m( )!l + m( )!
x, y, z( ) = sinθ cosφ, sinθ sinφ, cosθ( )
Yl,m (✓,�) = (�1)
m+|m|2 Km
l eim�P |m|l (cos (✓))
55
|Ylm (θ, φ)|� l = 0
l = 1
l = 2
l = 3
m = 0 m = 1 m = 2 m = 3
56
Ylm (θ, φ) ďIÖ�
l = 0
l = 1
l = 2
l = 3
m = 0 m = 1 m = 2 m = 3m = -1m = -2m = -3
���
���
57
�âÆ7ÝrďdÊ�
Ylm θ,φ( )Y !l
!m θ,φ( )d cosθ( )dφ−1
+1∫−π
+π
∫
= Ylm θ,φ( )Y !l
!m θ,φ( )sinθdθ dφ0
π
∫−π
+π
∫ = 1 l = !l ,m = !m0 ����{
58
�âÆ7ÝrPÛ�
f θ,φ( ) = clmYl
m θ,φ( )m=−l
+l
∑l=0
∞
∑
clm = f θ,φ( )Yl
m θ,φ( )−1
+1∫−π
+π
∫ d cosθ( )dφ
= f θ,φ( )Ylm θ,φ( )sinθdθ dφ
0
π
∫−π
+π
∫light probe ���
φ�
(x, y)�
sinθ = x2 + y2
cosθ = z = 1− x2 − y2
59
pN�Uńijŀď�âÆ7ÝrÑ �
• �@öěďpN�Uď²7êE
• ûûĊê(x, y, z) Đ�³ŁĨĶōên�
• kq/N�ZUêIdiff�
Idiff = Kdiff ⊗ E( ) fscale
n = x, y, z( ) = sinθ cosφ, sinθ sinφ, cosθ( )
E = k1c22 x2 − y2( )+ k3c20z2 + k4c00 − k5c20
+2k1 c2−2xy+ c2
1xz+ c2−1yz( )
+2k2 c11x + c1
−1y+ c10z( )
k1 = 0.429043k2 = 0.511664k3 = 0.743125k4 = 0.886227k5 = 0.247708
62
Kç�
• �ďŀŏĩŋŅĐG�kq/Nâď Lambert ď�Y�'ĎĚĝkq/N�ĎĚĝß]Ġ�úă:\Ġ8ÌĀĝģĸņőĬŊŐĠº¦þĔĀŕ • https://github.com/tokoik/ggsample10
• ûĞĠ�@ďpN�Uńijŀď�âÆ7ÝrĎĚĝÑ Ġ�òăß]�úĎAyþĉùĄýòŕ
• �âÆ7�rĐ uniform Arď×#êsh Ď�°ýĞĉòĔĀŕ • sh[0] = c0
0, sh[1] = c1-1, sh[2] = c1
0, sh[3] = c11, sh[4] =
c2-2, sh[5] = c2
-1, sh[6] = c20, sh[7] = c2
1, sh[8] = c22
• ĮłőĮĠİĥŀĀĝċ�rĠ"ĜzôěĞĔĀŕ • simple.vert ĠņőōĎ��þĉùĄýòŕ
• ÒĜ�ê[email protected]�
�@ďpN�Uď�âÆ7Á}ĎĚĝß]�úĠI»þĉùĄýòŕ�
63
KçŀŏĩŋŅď�g���
Lambertď�Y�'ĎĚĝkq/N�ďĕ� �@ďpN�Uď�âÆ7ÝrÑ �
64