2023年8月27日 星期日

LTC Area Light 淺嘗


教材


中文參考資料

面光源對dA積分

可轉成對立體角dω積分


Integrals over Area
E = ∫ dE
出處

i = cos(θo) dA / r2
dE⊥ = L dωi
dE = L cos(θi) dωi
E = ∫ dE = ∫ L cos(θi) dωi

也可以看成是對投影立體角積分
E = ∫ L dωi

計算Lo的話要再考慮BRDF p
Lo = ∫ p L cos(θi) dωi
get 式① Lo = L ∫ p cos(θi) dωi

Do(ωo) ➝ D(ω)

Doo) ➝ D(ω) ≃ p * cos(θi)


其實你愛我像誰
扮演什麼角色我都會 🎶

可愛又迷人的反派角色 🤠🙂 π米阿

圖 a) 是Doo)
Doo)可以變成不同的D(ω)

圖 b) 是其中1種D(ω)
D(ω)又和 p cos(θi)長得很像

D(ω) ≃ p cos(θi) 代入式①後
get 式② Lo = L ∫ p cos(θi) dω= L ∫ D(ω) dω

圖改自這裡

D(ω)示意圖

out向量指向eye
黃色向量是out的反射向量
也是下圖D(ω)的中心向量

出處

上方D(ω)
下方Doo)

怎麼變換
先變換到shading point的Local space
(3軸是T1、T2、N)

再變換到Do(ω)空間
D(ω)的中心向量
會變成Doo)的(0,0,1)向量

S是2個空間的bridge

Doo) = (1/π) cos(θo)
ωo是立體角,ωo是立體角的指向
有 S = ∫ Doo) dωo 

ωo和ω是「一一對應」

由上圖可知
Do(ω)分佈範圍大,D(ω)分佈範圍小
所以 dω> dω

當濃度不變時 D(ω) = Doo)
∫ D(ω) dω = ∫ D(ωo) dω < S

濃度提高後 D(ω) = Doo) o / dω
get 式③ ∫ D(ω) dω = ∫ Doo) dωo = S

出處

上方D(ω)濃度高
下方Doo)濃度低

把面光源的幾何形狀P
D(ω)空間逆變換Do(ω)空間後
Po會變大

怎麼找出dωo / dω


Doo)空間打光的好處

式② Lo = L ∫ p cos(θi) dω= L ∫ D(ω) dω
式③ ∫ D(ω) dω = ∫ Doo) dωo = S

由式②和式③可得
Lo = L ∫ p cos(θi) dωi
= L ∫ Doo) dωo = L S

Doo) = (1/π) cos(θo)
∫ Doo) dωo = ∫ (1/π) cos(θo) dωo  
S = (1/π) ∫ dω⊥o 

Lo = L ∫ p cos(θi) dωi
= L ∫ Doo) dωo = L S = L (1/π) ∫ dω⊥o 
在另Doo)空間進行打光
只要積分投影立體角



上方D(ω)
為面光源A上每個dA計算投影立體角
每個投影立體角還要乘上p

下方Doo)
只需要計算面光源A的投影立體角

積分投影立體角

E(Po) = S= ∫ Doo) dωo = (1/π) ∫ dω⊥o 
嚴格說來 ∫ Doo) dω其實不是Irradiance E

使用
結束這1回合

Bravo!


Come be my teacher
네 모든 걸 다 가르쳐줘
Your one, your two 🎶

等等那M怎麼找出來的?

窩不知道

出處

2023年8月22日 星期二

Trace Code:Image Based Lighting

Trace what

LearnOpenGL:鏡面反射 IBL


IntegrateBRDF


程式碼

pdf怎麼來的?

窩不知道

Microfacet BRDF的分母怎麼來的?

窩不知道


有些事情還是不要知道比較好 🙂🤠

遇到老司機

可以繞過英文真是太好了

原圖出自上面的連結
=( i + o )/2
固定i轉動ho就會跟著改變
最後會發現
oh的2倍大


pdf怎麼來的?

把上面那張圖反著畫(固定dωo),可知
1 / 4(HoL)= dωh / dωL
L for light dirction
h for half vector

又因為
pdfh * dωh = pdfL * dωL

代號「雪莉」

最後可得
pdfL = pdfh * dω/ dωL
pdfL = pdf/ 4(HoL)

同時 HoL = HoV
V for view direction

ImportanceSampleGGX有符合上面提到的pdfh嗎?



奇怪的是
把P(Sθ)放到Geogebra裡畫
看起來完全不像cos-1(xxx)的反函數

Geogebra

紅色那條不是應該長成這樣嗎?
對稱x=y軸

A哥的頭髮得再厚一點才行 🙂

prefilter.fs


黃色部分怎麼來的
基于物理的渲染:基于图像照明 💫

可逆的BRDF

當BRDF可逆時

圖改自這裡

從黑色箭頭方向射入1後(in)
會向多個方向散射(out)

1對多能量守恆
∀ ωi ,∫ fcos(θrdωr  1
r 就是 out

圖改自這裡

BRDF的可逆指的是
從黃色箭頭方向射入1後(in)
往黑色箭頭方向散射為0.3

多對1能量守恆
∀ ωr ,∫ fcos(θidωi  1
r 就是 out

出處

1對多能量守恆的証明

2023年8月14日 星期一

Emitted L vs Received L ⭐

➡️ 目錄


用到的符號

Emitted L

射出來理解 L的定義

舉例

已知Φ、光源面積A
Lo = Φ / (A π)

Received L

射入來理解L的定義

Received L的定義


Wiki

寫成偏微分,但可以看成對d2Φ進行2次除法
dA⊥ = dA cos(θi)
dE = d2Φ / dA
L = dE / dΩ

PBR 3 裡那張圖指的是Received L

但單看這張圖
我無法第1時間完全明白微分的幾何意義

physically based rendering 3


dE⊥不隨dA的朝向而變


舉例

令dA = a、 dω = w
假設在dA上量到d2Φ = φ

使用上圖左上的測法
Li = φ / ( a w )

使用上圖左下的測法
Li = φ / ( a cos(θi) w )

2個測法得到的Li 結果1樣

dE不隨距離而變的情況

往物體遠離時
有更多的dA對測量產生貢獻

計算機圖形學原理及實踐, 3/e (進階篇)
Computer Graphics: Principles and Practice, 3/e

Li = Lo

我們從已知Emitted L(或Reflected L)是什麼出發
來看看Received L是什麼
  1. 已知Emitted L(或Reflected L)為Lo
  2. shading point dAs 的Received L為Li
  3. 多個Lo射向dAs的結果為 Lo dω = dE⊥ ①  
  4. 由Received L的定義可知 Li  = dE⊥ / dω ②
  5. ①代入②得到 Li = Lo

任務達成 🤠🙂 推導了

Reflected L

讀完這篇後發現
L的定義也可以用在BRDF的dLo

2023年8月12日 星期六

推敲現實世界怎麼測量Lo

➡️ 目錄

下面的量法
量的是面光源的Emitted L

設定測量實驗

怎麼量測Li

首先由Emitted L 我們知道
Le cos(θe) = dEA⤵ / dωA
Le cos(θe) = dEA⤵ / dωA

Le沿直線前進(R增加),dA和直線垂直
dEA⤵和dωA⤵都隨著Le前進而變小
但最後兩者的比值不變
Le cos(θe) = dEA⤵ / dωA

所以我們如果可以在現實世界測量到dEA⤵和dωA
兩者相除的結果得到Li

但因為有cos(θe)項!

所以面光源法向量還要指向感應器
才不會得到cos(θe)的差異

量測其他量

  • 用整個面光源照射感應器到就能量到dΦ
d(dΦ) = d2Φ
  • 給面光源穿衣服,只漏出dA大小的面積
  • 用dA大小的面光源照射感應器就能量到d2Φ

dA
  • 就是感應器的面積
  • 在這個面積內可以量到d2Φ
  • dω是透過光源dA算出來的
  • dω = dA / R2

當感應器翻轉後dA cos(θi)

原本能測到通過dA的d2Φ
但感應器翻轉後
只能測到通過dAcos(θi) = dA的d2Φ


dA = dA cos(θi)
  • d2Φ通過的面積大小
  • 在這個面積可以量到d2Φ

  • dω是透過光源dA算出來的
  • dω = dA / R2

實驗上測量結果為

d2Φ、dA

透過光源dA算出

  • dω = dA / R2

拿上面量到的值做下面的運算

d2Φ / ( dA dω ) 

結果:先微分dA、後微分dω

d2Φ / ( dA dω ) 

= d(dΦ) / (  dA⊥ dω ) 
= d(dΦ / dA) / dω
dE / dω = Li
dEA⤵ / dωA = Li

結果:或是先微分dω、後微分dA

d2Φ / ( dω dA  ) 

= d(dΦ) / ( dω dA ) 
= d(dΦ / dω) / dA
dI / dA = Li

d2Φ = dΦ cos(θi)
d2Φ / dω = dΦ cos(θi) / dω
dI = cos(θi)

2023年8月11日 星期五

CG世界的Li

 ➡️ 目錄


Emitted L

射出來理解 Le 的定義

Received L

在CG世界,shading point dAs 的Li可能來自
  • 光源 Emitted Le 直接射入 dAs 
    • 面光源光照
    • 點光源光照
  • 光打中物體dA,經過BRDF反射的Lo,射入 dAs
    1. 這就像dA變成了1個小小光源Lo (對dA來說是out )
    2. 在dAs半球方向有無數這種小小光源 Li (對dAs來說是in )
    3. 渲染方程的半球積分,就是在加總這些小小光源Li 的光照

一般在渲染時

都是從光源出發
用的是Emitted Le 

BRDF

Emitted Le 射中物體dA時
再用BRDF(記作F)產生出射Lo
i → input
o → output

F = dLo / dEi
dL= F dEi 

下面會介紹怎麼由Emitted Le
轉變成dEi 

面光源光照


Integrals over Area
出處

dEi = cos(θi) (  cos(θe) Le )
dω = dA / R2

藍色部分就是從Emitted L的定義來的

L= ∫ F dEi = ∫ dLo

點光源光照

F = dLo / dEi
也可以寫成
F = Lo / E
Lo = F Ei

對點光源來說
 E = cos(θi) Io / R2 
Lo = F  E 

半球積分光照

半球積分時 dE= Li dω
 L= ∫ F dEi = ∫ dLo

2023年8月10日 星期四

交換微分順序的面光源Le ⭐

➡️ 目錄

Emitted L

射出來理解 L的定義

Wiki

Wiki上的寫法,其實是Received L

如果是Emitted L,是我會寫成
L = d2Φ / dA dΩ cos(θ) )
➝ 先分身再輻射

或是寫成
L = d2Φ / ( dΩ cos(θ) dA )
➝ 先輻射再分身

dΩ cos(θ) dΩ⊥

先分身再輻射

E = dΦ / dA
L = dE / ( dω cos(θ) ) 

利用半球面積投影到法向量平面 = 圓面積
可知 ∫ cos(θ) dω= π

先輻射再分身

I = dΦ / ( dω cos(θ) ) 
L = dI / dA

示意圖
中間最粗的是I,其他小的是L


先輻射產生太陽 I
I = dΦ / (  cos(θ) ) 

再分身成小太陽 L
L = dI / dA

因為幾何上是平面 
所以不是圓形向外輻射 ○
而是半球向外輻射 ◒

OREA R EA 哈 請給我一份I的能量 🎶

放一起比較


用到的符號

上圖說的
①固定dω 
②固定dA
細節可以參考

我跨越不存在的界限 🎶😋🤠

比較

「先分身再輻射」比較符合真實世界的因果關系
雖然「先輻射再分身」在數學上也說的通

點光源的謎團

➡️ 目錄

I / R2 = E怎麼來的

E = dΦ / dA 式①
I = dΦ / dω,即I dω = dΦ 式②
把式②代入式①
可得
I dω / dA = dΦ / dA = E

再使用 dω = dA / R代入上式後
可得
I dω / dA = I / R2 = E
即 I / R2 = E

差別

dE⊥ = L dω = L dA / R2
dE⊥與dA取多大有關

dE⊥與dA取多大有關

E = I / R2
E與dA取多大無關 備註1

E與dA取多大無關
不管是取dA還是取1m2大小,E同樣是  I / R2

備註1:E與dA無關

E = dΦ / dA
dA取大時,每塊dA就分到更多dΦ
dA取小時,每塊dA就分到更少dΦ
但dΦ / dA 為定值

2023年8月8日 星期二

太陽光

➡️ 目錄

假設

在地球上某處dA 
太陽整個半球都能對它進行光照

dA可以在地球半球上任意移動

等等!不需要考慮遮擋嗎!

半球上最邊緣的端點和dA的連線
已經位在法平面後面
應該無法射中dA吧!

我們是不是需要找出
臨界邊緣在那?

臨界邊緣

Geogebra

當距離夠遠
臨界邊緣就逼近半球邊緣 🧐🤠 太神奇了 珍妮佛

找夾角


dA位在半球中心時

圖1


地球直徑 =  RE =                             12742000 公尺
太陽直徑 = RS =                          1392700000 公尺
太陽中心 ↔ 地球中心 = D =  150000000000 公尺

tan(θ) = 0.5 RS / ( D - 0.5 RE )
θ = arctan( 0.5 RS / ( D - 0.5 RE ) ) = 0.00464249716 rad

0.00464249716 rad = 0.26613041044 度
                                     

看這0.26613041044 有多小

所以我們可以當作所有方向平行

圖1 平行:多對1,中央case

多指的是光源;1指的是地球上的dA

當dA在地球上移動


圖2


tan(φ) = 0.5 RE / ( D - 0.5 RS )
φ = arctan( 0.5 RE / ( D - 0.5 RS ) )
= 4.26714283 × 10-5 rad

4.26714283 × 10-5 rad = 0.00244613283 度

看這0.00244613283 有多小

所以我們可以當作所有方向平行

圖2 平行:1對多,中央case


因為θ >2φ

相差θ以內都算平行了
那相差2φ以內當然也都平行

粉紅點可在半球上任意移動

圖3 平行:1對多 ⭕


再加上必須滿足

「圖1 平行:多對1,中央case」


圖1 平行:多對1,中央case


所以也不可能是斜的平行


粉紅點可在半球上任意移動

圖3 平行:1對多 ❌


「圖3 平行:1對多 ⭕」代表

Sun上任一個dA和Earth上任一個dA的連線方向(1對1)
都會和Sun和Earth的中心連線平行

因為每個1對1都平行
所以下面的「圖1 平行:多對1」會成立

dA可以在地球半球上任意移動

圖1 平行:多對1


太陽半球對dA的光照

模仿面光源的計算

我們可以模仿 Integrals over Area
出處

因為太陽距離dA很遠
每個粉紅點到dA的連線距離可以當成一樣長,都是R

每個粉紅點的大小也是dA大

r = 太陽半徑
dω = dA / r2
∫ cos(θs) dω = π

仔細一看

這 ( π r2 ) / R2 不就是立體角嗎?
ω = ( π r2 ) / R2 

最後的結果為 L ω cos(θe

發現前述的作法

使用∫ cos(θs) dω = π 是在繞遠路

找出和平行光方向垂直的P平面

∫ cos(θs) dA = 把半球面積投影到P平面上
直接就得出 ∫ cos(θs) dA =  π r2

就算太陽表面不平滑

而是表面有高低起伏
結果不變
 ∫ cos(θs) dA =  π r2