1. real-time rendering
- global illumination은 사실적인 rendering이 가능하지만 시간이 오래 걸렸다.
- 따라서 게임같은 real time system에서는 사용하기 힘들다.
- 따라서 게임, vr, ar에서 사실적인 렌더링을 위해 고안된 방법들을 알아보자.
2. Shadows
- 그림자는 사실적 묘사의 중요한 요소이다.
- 결국은 그림자도 global illumination 효과중 하나이다. 특정 포인트에서 빛이 다른 물체에 영향을 받는 것이기 때문이다.
- ray tracing에서는 빛을 쏴서 occlusion이 있다면 그림자가 생기고, radiosity에서는 그 패치에 빛이 도달하지 않기때문에 어둡게 그림자가 생긴다. (soft shadow구현)
- 그림자 덕분에 2D로 변환된 3D 물체의 정보를 알 수 있다. (의자는 공중에 떠 있음)
- 그림자의 creator와 receiver가 한 물체에 존재하면 self-shadow라고 한다.
- 광원의 종류에 따라 shadow가 달라진다. 점광원과 달리 광원에 면적이 있다면 soft shadow가 생성된다.
- 완벽히 그림자에 속하는 부분을 umbra, 흐릿한 경계를 penumbra라고 한다.
- 결과 사진에서 그 차이를 볼 수 있다.
- 실제로 구현을 할때는 shadow도 독립된 물체라고 생각한다.
- shadow가 될 물체를 올바른 위치에 그린다고 생각하는 것이다.
- 혹은 그림자가 생기는 공간이 있다고 생각할 수도 있다. (삼각 기둥 공간, volumn)
- 혹은 light source로부터 눈으로 볼 수 없는 부분이 그림자 라고 생각할 수도 있다.
- 만약 static한 장면이라면 미리 그림자의 위치를 texture로 만들어서 texture mapping으로 구현할수도 있을 것이다.
- 이렇게 그림자를 바라보는 관점에 따라 다양한 구현이 가능하다.
3. Shadow mapping
- light source로부터 눈으로 볼 수 없는 부분을 shadow라고 생각하고 구현한 방법이다.
- real time 구현이 가능하다.
- light위치에 눈을 두고 렌더링 한다. 이렇게 shadow map을 구할 수 있다.
- 이 map에는 light source로부터 물체 표면까지의 거리가 저장되어 있다고 볼 수 있다.
- light위치에 눈을 두고 scene을 렌더링하면 depth buffer에 light source로부터 물체 표면까지의 거리가 저장이 된다.
- 이렇게 구해진 depth map을 shadow라고 한다.
- 최종으로 픽셀의 color를 계산할 때 그 픽셀에서 light source까지의 거리를 가지고 색을 결정한다.
- 그 픽셀의 지점에서 light source까지의 거리가 shadow map에 저장된 depth(거리)보다 크면 그 point는 shadow라고 판단할 수 있다. 반대로 짧으면(작거나 같으면) shadow가 없다. 아래 그림을 보면 이해가 될 것이다.
- 만약 shadow map이 undersampling되면 aliasing이 생길 수 있다.
4. Percentage closer filtering (PCF shadow)
- 위에서 배운 방법으로는 hard shadow가 나타난다.
- shadow map으로 soft shadow를 흉내낼 수 있는 방법을 알아보자.
- 해당 픽셀만 보지말고 그 주변 픽셀도 살펴보는 방법이다.
- 주변 픽셀에 그림자가 있고 없고의 비율을 고려한다.
4. shadow volumn
- 그림자를 만드는 물체로부터 그림자까지를 공간으로 정의해서 구현한 방법이다.
- real time 구현이 가능하다..
- shadow creator에서 확장하면 shadow volumn이 생긴다.
- 하나의 triangle이 shadow를 생성한다고 본다.
- 위의 예시의 shadow volumn은 세개의 면이 존재한다.
- 눈에서 나온 직선과 quad가 만나는 점이 짝수라면 그림자가 없고 홀수면 그림자가 생긴다.
- 이 shadow volumn은 stencil buffer로 구현할 수 있다.
- 1. 일단은 scene을 ambient lighting만 가지고 렌더링 한다. 잠시 Z-buffer는 끈다. color buffer에 렌더링 한다.
- 2. front facing shadow volume을 stencil buffer에 저장한다. shadow volumn과 만난 횟수를 증가시킨다.
- 3. back facing shadow를 만나면 횟수를 감소시킨다.
- 4. count를 가지고 짝수면 shadow volumn밖에 있기 때문에 그림자가 아니고 홀수면 아직 shadow volumn안이기 때문에 그림자라고 판단한다.
- 5. 최종으로 stencil buffer가 0인 부분에 diffuse와 specular를 그린다.
- 이렇게 shadow volume이 생성된다고 볼 수 있다.
- 실제 polygon으로 구성된 물체의 edge만 따서 shadow volume을 생성한다 이를 silhouette edge라고 한다.
5. Ambient occlusion
- 구석진 곳이 더 어둡다는 것에 착안한 방법이다.
- shadow가 없더라도 구석진 곳은 더 어둡다는 것이다.
- 움푹 패인 지점에서 반구를 그렸을때 occlusion이 많을 수록 그 점은 더 어둡다고 생각한다.
- p에서 sampling한 여러 지점으로 ray를 쏴서 occlusion이 존재하는지 계산한다.
- fragment shader에서 depth정보가 있기 때문에 p지점에서 ambient operation을 계산할 수 있다.
- 이를 screen-space ambient occlusion이라고 한다.
'ComputerScience > Computer Graphics' 카테고리의 다른 글
CG - 18. Halftoning, Dithering (0) | 2021.12.05 |
---|---|
CG - 17. Color (0) | 2021.12.04 |
CG - 15. Advanced Rendering : Refectance (0) | 2021.11.24 |
CG - 14. Global illuminations(Ray Tracing) (0) | 2021.11.19 |
CG - 13. Global illuminations(Radiosity) (0) | 2021.11.19 |