1. Global Illumination
- 이제까지 공부한 illumination은 local illumination이였다. 오직 surface point에 도달하는 light source의 direct한 빛만 고려하는 illumination이였다.
- 모든 suface point에서 각각 광원에서 오는 빛을 계산하면 되기 때문에 병렬처리로 아주 빠른 속도로 구현이 가능했다.
- global illumination은 광원의 direct light뿐만 아니라 다른 물체로부터 반사되서 들어오는 indirect한 빛까지 고려하는 illumination 방법이다.
- 더 사실적인 묘사가 가능하다. 단 rendering 시간이 매우 많이 걸린다.
- global illumination의 가장 대표적인 두가지 방법, radiosity, ray tracing을 알아본다.
- Radiosity방법은 빛의 diffuse 전파를 계산하는 것이다.
- diffuse는 입사광이 많은 방향으로 반사되는 것을 말하고 반대로 specular는 입사광과 같은 각도로 정반사하는 것을 말한다.
- radiosity는 모든 표면에 diffuse illumination만 반영된다고 가정한다. (specular illumination없음)
- view direction과는 독립적인 static scene을 이룬다.
- ray tracing은 광원으로부터 출발한 빛이 여러 물체에 반사되어 눈으로 들어올때 색을 계산하는 방법이다.
- specular 반사나 투명도 등을 잘 표현할 수 있다.
2. Radiosity
- 모든 표면이 diffuse surface라고 가정한다.
- view와 독립적인 illumination이 구현된다.
- soft shadow(흐릿한 그림자의 특성), color bleeding(반사된 면의 색을 반영) 등을 잘 표현한다.
- suface들을 patch들로 나누어서 빛의 에너지를 받는, 주는 단위로 사용한다.
- patch들의 단위 면적안에 얼마의 light energy를 가지고 있냐를 계산하게 된다.
- 에너지가 전파될때는 loss없이 에너지가 보존된다고 가정한다.
- 각각의 삼각형들이 suface patch이다.
- form factor : patch A에서 patch B로 얼마만큼의 enery가 이동했는가를 말한다.
- 모든 patch에 대해서 form factor를 계산하게 된다.
- 광원으로부터 빛을 받으면 patch들이 에너지를 받아서 다시 내보낸다. 이 모든 form factor를 계산하는 것이다.
- Bi는 i 패치가 가지고있는 radiosity이다.
- Ei는 i 패치가 빛을 발산하는 emissivity정도이다. (광원이 아니면 처음에는 다 0이다.)
- 로우는 i 패치의 reflectivity를 나타내는 상수이다.
- Hi는 i패치에게 전달되는 모든 에너지의 합을 말한다. (반사되어 i로 들어오는 에너지들)
- Hi를 구해서 최종 Bi를 구하는 것이 목적이다.
- Hi를 구하려면 서로다른 모든 patch로부터 i에게 들어오는 에너지를 계산해야 한다.
- 그 전에 하나의 patch로 들어오는 form factor를 먼저 계산해보자.
- Fji는 j로부터 i에게 도달하는(from j to i) light enery이다.
- Ai는 i의 면적을 말한다. 상호교환적이라 위 등식이 성립한다.
- 거리, normal vector, 각도에 따라 달라질 수 있다. 여기서의 Hij는 visibility이다. 만약 물체가 가리고 있다면 이 값은 작아질 것이다.
- 두 패치의 normal vector간의 각이 클수록 마주보지 않는다는 뜻이고 즉 Form factor가 작아진다.
- 한 i에 대해서 모든 j들로 도달하는 Fij들의 합은 당연히 1이된다.
- 하지만 이 모든 F를 구하는 것이 어렵기 때문에 다른 방법을 사용한다.
- 그중 하나는 Hemi-Sphere Form Factor이다.
- surface i를 중심으로 반구를 만들고 surface j를 반구에 projection한다.
- projection된 면을 그대로 바닥면에 수직으로 내린다.
- 원의 면적분의 수직으로 내려온 면적이 Form factor, Fij 가 된다.
- 위의 방법보다 조금 더 쉽게 만든 방법이 Hemi-Cube Form Factor이다.
- sphere 대신 cube를 사용한다.
- 전체 grid의 개수 분의 projection된 grid수로 F를 구한다.
- grid를 늘릴수록 더 정확한 계산이 가능하다.
- 위 식은 Fji들을 모두 더해서 i로 들어오는 빛들, Hi를 계산하는 식이다.
- Bj는 j가 가지고 있는 light enery이고 Aj는 j의 면적이다. j에서 도달하는 에너지를 i면적만큼만 받기 때문에 위 수식이 된다.
- 따라서 radiosity equation은 위처럼 정리된다.
- 결국 모든 i에 대해서 위 같은 행렬식이 도출된다.
- 초기에는 광원 E1만 1이고 나머지는 0일 것이다.
- Form factor들을 계산하면 최종 B들을 구할 수 있다.
- 하지만 이 linear system을 구하려면 역행렬을 구해야하는데 n개의 패치에 대해서 O(n^3)이 된다.
- 따라서 Gaussian Elimination 말고 Gauss-Seidel method로 B를 approximation하게 된다.
- 처음에는 광원으로부터 모든 패치로 light enery가 도달하겠지만 두번째부터는 새롭게 E들이 갱신되어 모든 patch로부터 빛이 뻗어나갈 것이다(한번 반사된 빛들). 그렇게 두번째 B가 계산된다. 다시 또 E를 업데이트 하고 새로운 B를 구하면 두번째 반사된 빛들을 계산할 수 있다.
- 이렇게 여러번 반사된 빛들을 계산할 수 있다.
- 계산량을 줄이기 위해 gauss-seidel 방법을 사용하지만 좀더 빠르게 하기위해 progressive refinement radiosity를 사용할 수 있다.
- 서로 다른 모든 patch로부터의 E를 고려하는것이 아니라 가장 brightest한 patch만 고려하는 것이다.
- 유의미한 light energy만 고려하자는 것이다.
- 즉 이렇게 radiosity를 구하면 최종 color를 구할 수 있다.
- radiosity는 몇가지 단점이 존재한다.
- Hemicube를 사용하면 grid 크기와 개수에 따라 aliasing이 발생할 수 있다.
- 우리는 patch단위로 radiosity를 구하기 때문에 patch단위로 색이 결정된다. 이는 flat shading처럼 각진 모습이 나타날 수 있기 때문에 patch의 색을 가지고 vertex의 색을 결정하여 interpolation을 수행하게 된다.
- 예를들면 e의 색을 구하고 싶다면 1,2,3,4의 평균을 구하게 된다.
- b의 색을 구해야하면 b와 e의 중심이 1과 2의 중심과 같다는 것을 이용해서 구한다.
- interpolation을 활용하기 때문에 어두운면과 밝은 면의 경계부분이 흐려지는 현상을 light leak이라고 한다. 보면 정육면체의 모서리 부분이 붕 떠있는 것 같이 보인다.
- 따라서 급격한 색의 변화를 표현해야할때 불리하기 때문에 patch를 더 잘게 쪼개는 방법을 더해서 사용한다.
-이를 adaptive meshing이라고 한다. 기존 triangle메쉬를 급격한 색변화가 있는 곳에서는 더 작은 삼각형으로 쪼개는 것이다.
- 그림자가 생기는 바닥면이랑 light source와 가까운 벽면은 더 작은 삼각형들로 patch가 쪼개져있다.
- specular를 고려하지 않는 것도 단점이 될 수 있다.
- Light leak이 발생할 수 있다.
'ComputerScience > Computer Graphics' 카테고리의 다른 글
CG - 15. Advanced Rendering : Refectance (0) | 2021.11.24 |
---|---|
CG - 14. Global illuminations(Ray Tracing) (0) | 2021.11.19 |
CG - 12. Buffer, Blending (0) | 2021.11.15 |
CG - 11. shader programming (0) | 2021.11.03 |
CG - 10. Triangle Mesh (0) | 2021.10.28 |