NEUROMANTIC

自分でC/C++/UE4/Graphics/ゲームなどをやったことをメモするブログ

「Archive」Wrapped Diffuseについた韓国語のメモ

Archieved専用の記事です。韓国語で書かれているため、日本語への翻訳は時間があるときやらせてもらいたいと思います。

Wrapped Diffuse

https://gamedevforever.com/150

이 기사는 Diffuse Lighting 에 대해서 다룸. 이 기사에서 다루는 디퓨즈 라이팅은 3 가지로 나뉘는데, Lambert, Half lambert, 그리고 Wrapped Diffuse 라 하는 것임.

Lambert 와 Half lambert 는 이미 알기 때문에 메모에서는 Wrapped Diffuse 만 하기로 함.

3. Wrapped Diffuse Lighting Model

https://www.slideshare.net/leemwymw/wrapped-diffuse
http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/

Wrapped Diffuse 모델은 의사적인 Subsurface scattering, Area light source 및 부드러운 반사를 표현하기 위해서 입사한 지점 p 에 대한 노멀에 대한 반구 (Hemisphere) 을 감싸는 쉐이딩 모델이다.

f:id:neuliliilli:20190605140037p:plain

Wrapped Diffuse 의 구현 공식 (간략화) 은 다음과 같다고 한다. 
F = \frac{(\textbf{n} \cdot L) + w}{1 + w}
여기서 w 는 임의의 정수이다. Half Lambert 와 비슷하다는 것을 알 수 있다. (딱봐도, w 가 1 이면 바로 Half Lambert 가 된다.)

...but it’s incredibly useful for lighting things like particles where a simple Lambert term doesn’t come close to representing light scattering through smoke...

Wrapped Diffuse 는 Half Lambert 와 비슷하게 유사하게 투과되는 느낌을 표현하는데 사용된다고 한다. 피부, 나뭇잎, 파티클 라이팅이 주로 쓰인다.

하지만 Wrapped Diffuse 는 위의 기존 모델 그대로 쓰기에는 너무 밝은 결과를 나타낸다. (대비가 없어진다) Wrapped Diffuse 의 성질을 보존하면서도 대비를 조절하기 위해서, Wrapped Diffuse 의 모델의 총 에너지를 1 로 만들어주는 에너지 보존 법칙을 사용해서 다음과 같이 개량된 구현 식을 얻을 수 있다고 한다.

이는 PBR 의 에너지 보존 법칙을 이용한 Wrapped Diffuse 이다.


clampTo(x, y, z) = max(min(x, z), y); \
F = clampTo(\frac{\textbf{n} \cdot L + w}{(1 + w)^2})

f:id:neuliliilli:20190605140049p:plain

Why?

우선 일반 디퓨즈 라이팅에서은  \textbf{n} \cdot L 으로 팩터를 표현하는데, 반구에 대해서 옆의 식을 다음과 같이 표현할 수 있을 것이다.

 \int_{0}^{2\pi} \int_{0}^{\frac{\pi}{2}} \cos(\theta) \sin(\theta) d\theta d\phi = \pi

하지만 이대로라면 기존의 Standard 한 Diffuse Lighting 방법은 에너지 보존을 하지 않는다는 것을 알 수 있다. (그래서 최종적으로는  \pi 로 나눠줘야 함) 하지만 Wrapped Diffuse 에서 위의 개선된 Energy-Conservated Wrapped Diffuse 을 도출하기 위해서 그냥 그대로 두기로 하자.

기존의 Wrapped Diffuse 에서

 F = \frac{(\textbf{n} \cdot L) + w}{1 + w}

이를  H^2(\textbf{n}) 반구에 대해 그대로 적분하기에는,  \frac{w}{1 + w} 으로 인해서 일반 반구보다 더 뻗어나갈 수 있음을 알 수 있다. 따라서  (0, 1/2\pi) 범위에 대해  \theta 을 공역으로 삼기보다는,  (0, \arccos(-w)) 범위에 대해 세타의 전개를 할 수 있도록 해보자.


\int_{0}^{2\pi} \int_{0}^{\alpha} \frac{\cos(\theta) + w}{1+w} \sin(\theta) d\theta d\phi \
= \frac{2\pi}{1+w} \int_{0}^{\alpha} \cos(\theta) \sin(\theta) + w\sin(\theta) d\theta \
= \frac{2}{1+w} \int_{0}^{\alpha} \frac{1}{2} \sin(2\theta) + w\sin(\theta) d\theta

결과로 다음과 같은 값을 얻을 수 있다.

 \frac{2}{1+w} \left( \frac{1}{2} w^2 + w + \frac{1}{2} \right) = 1 + w

즉, 노멀라이즈된 전체 에너지 양은  1 + w 이 되므로, 위의 식에서  1 + w 을 나눠준다.

 F = clampTo(\frac{\textbf{n} \cdot L + w}{(1 + w)^2})

결론

Oren-Nayar 와 Lambert 와 Wrapped Diffuse 는 다음의 대략적인 성질을 가진다.

  • 비용 순 : Oren-Nayar >> Wrapped Diffuse with energy conservation > Wrapped Diffuse > Lambert
  • 좀 더 거친 표면 (Microfacet) 을 할 때는 Oren-Nayar 일반적인 표면의 경우 Lambert & Half Lambert 좀 더 부드러운 표면은 Wrapped Diffuse