사실 재미없음.
글을 재미있게 쓸수 있는 능력도 없고
이거 읽을려면 어느 정도의 지식이 필요할 것 같아서 아마 게임 쪽 전공 아닌 사람은 보다가 나갈듯.
AO (Ambient occlusion) 란?
알 사람은 알겠지만 Ambient는 게임 엔진에서 자연광이라고 표현이 되어진다.
자연광은 외부의 빛에 대한 간섭이 전혀 없이, 오로지 태양이나 주변의 산란된 빛 만을 받아 '은은한 빛'을 나타내는 현상을 말하며,
외부의 간섭이 없는 Default 밝기 라고 생각하는 것도 나름 좋을것 같다고 생각한다.
그리고 AO의 occlusion은 폐쇄라는 뜻에 걸맞게 '사물의 주름', '외부 벽으로 인해 좁아진 공간', '방 안쪽의 구석이나 모서리'와 같은 공간을 말하고자 한다.
즉 AO는 위에서 예로 든 폐쇄된 공간을 더욱 실감나게 표현해 주기 위해 후처리를 하는 알고리즘을 말한다.
후 처리가 되는 과정에서 Ambient 즉 자연광은 폐쇄가 된 공간에서는 더욱 어둡게 표현이 되어지고 개방된 공간에서는 더욱 밝게 표현되어지거나 원본 그대로 패스하여 더욱 더 생생한 사물의 깊이감을 제공한다.
다음은 여러 AO 알고리즘의 간략한 설명과 장단점을 서술한다.
CryEngine2AO
다음 검은색 선은 오브젝트의 단면이며, 해당 사진에서는 P라는 지점은 폐쇄도가 얼마나 되는지를 계산하고자 하는 알고리즘을 그린 것이다.
먼저 P의 폐쇄도를 구하기 전, S 즉 구 모형의 커널을 만들어야 하며 해당 커널 내에는 랜덤의 위치에 여러개의 점을 찍어낸다.
그리고 위에서 만들어진 구 모형의 중심점을 P 지점으로 하고, P 지점이 얼마만큼 폐쇄 되었는가를 대략적으로 유추하기 위해서 오브젝트의 단면 밑에 있는 점들의 개수를 세어본다.
결국 오브젝트 단면 밑에 있는 점들의 개수는 폐쇄도와 비례하기 때문에 이러한 점을 이용하여 대략적인 폐쇄도를 구할 수 있는 것이다.
장점 - 간접적인 계산 만으로 해당 면이 폐쇄 되었는지를 알 수 있다.
단점 -
1) 계산하는데 비용이 크다,
2) 매번 다른 지점의 폐쇄도를 구할 때 마다 계속해서 커널 (구 모형의 커널과 랜덤 위치의 점들)을 계속 뽑아내야 하기 때문에 시간과 비용이 클수 밖에 없음
3) 실제 사용자는 오브젝트의 앞 면만 보기 때문에 뒷면은 계산할 필요가 없다 하지만 여기서는 뒷 면 까지 계산하므로 무의미한 손실이 생긴다.
4) 만약 P가 평면에 있었다고 하여도 P의 폐쇄도는 대략 0.5 (0.0 ~ 1.0) 정도가 된다. 즉 전체적으로 그림을 어둡게 만드는 흠점이 있다.
다른 지점의 폐쇄도를 구할 때 커널 (구 모형의 커널과 랜덤 위치의 점들)의 랜덤 위치의 점들을 계속해서 바꾸어줘야 하는 이유는,
빛의 음영의 경계를 부드럽게 만들기 주기 위해서 노이즈를 넣어야 하기 때문이다.
커널을 계속해서 최신화 시키지 않고 계산을 시도하면 맨 왼쪽 사진과 같이 음영의 경계가 날카로워진다.
현재는 이를 보완하기 위해 새로운 커널을 계속해서 최신화 하는 것을 대신하여 이미 만들어진 커널을 회전시켜서
노이즈를 넣어주는 알고리즘으로 보완이 되었다. (가운데 사진), (+ 블러 처리까지 한 오른쪽 사진)
StartCraft II Ao
위의 CryEngine2Ao와 비슷한 알고리즘 이지만 반 구(hemi sphere)인 점이 다르다. 해당 반 구는 P지점과 수직이 되는 방향을 쳐다본다.
장점>
1) 위 알고리즘보다 비용이 절반이나 감소한다.
2) 굳이 계산할 필요 없는 뒷면의 계산을 제외하여 효율적으로 계산한다.
3) CryEngine2AO의 문제점이였던 그림을 어둡게 만드는 흠점을 보완한다.
단점>
1> 여전히 계속 커널을 새로 찍어내야 하기 때문에 부담스럽긴 마찬가지.
2> 낮은 정확도의 폐쇄율 계산.
Horizon_based AO (with RayMarching)
P 지점에서 폐쇄율을 계산하기 위해 여러 방향으로 Ray (광선)을 쏴, (충돌 되어진 광선의 개수 ), (P에서 충돌된 지점까지의 거리를 통한 빛 감쇄) 해당 요소를 조합하여 Occlude 계산.
장점>
1) 위 알고리즘보다 정확한 계산율
2) 커널(구 모형)을 만들 필요가 없어짐
단점>
1> 레이 캐스팅 계산하는 것은 굉장히 큰 비용이 듦. 더구나 그러한 레이 캐스팅을 한 두번 하는 것도 아니고 수 백, 수 천번을 반복함.
2> 오히려 StartCraft II Ao, CryEngine2AO가 더 효율적일 수도 있음.
Volumetric Obscurance
사진의 왼쪽 식과 같이 원 커널의 빗금 그어진 부분의 부피, 넓이는 구하여 이를 Occlude로 치부하는 알고리즘.
장점>
1) 위의 3가지 알고리즘에 비해서 굉장히 비용이 저렴해짐.
2) 연속적인 면적, 부피를 통해서 Occlude를 계산하므로 더욱 실존의 Occlude율과 비슷해짐.
단점>
1> 음영 사이의 경계선이 샤프해짐.
2> 로우 폴리곤 캐릭터들이 다 깨진것처럼 보임. (음영 사이의 경계선이 분명하므로 Fragment들이 조각난 것처럼 보임 Ex> rasterization art)
요즘에는 그래서 다음 알고리즘을 사용할 경우, 후 처리로 Blur 계산을 통해 샤프한 경계선을 완화 시켜서 보여줌.
Alchemy AO
가장 보편적으로 알려지고 알고리즘 (SSAO)
반 구 내에 있는 오브젝트의 단면에 V0, V1, V2 ... 식으로 규칙적으로 나누어 포인트들을 지정한다(V0, V1, V2 ...).
이 후 왼쪽과 같은 계산을 통하여 P의 폐쇄율을 계산할 수 있다.
빛의 감쇄율은 오브젝트가 멀 수록 빛을 폐쇄하는데 관여를 적게하므로 생긴 요소이며,
Vm 과 P의 점 곱(Dot Product)을 통하여 Vm이 P를 얼마나 가리는지를 대략적으로 계산 가능하기에 다음 식이 지정된다.
마지막으로 언리얼 엔진은 다음과 같이 V0과 V1을 찾아내어 V0과 V1의 각도 h (h는 폐쇄율과 반비례)를 이용하여 굉장히 빠르고 현실과도 가장 근접한 알고리즘을 사용 중이라고 한다. 사진의 왼쪽에 h 가 아니라 1 / h인데 잘못쓴것 같다.
세 줄 요약>
1. 해당 6 개의 알고리즘은 구석진 곳, 주름, 구멍 등을 더욱 짙게 칠해주어 그림에 대한 깊이감을 한 층 더해준다.
2. 유니티, 언리얼, 고도와 같은 고급 API 내에서는 이미 내부에서 제공해 주는 서비스 이기에 굳이 읽어볼 필요 없다고 생각함.
3. 수학 공부 안하면 나중에 후회함.
정보글 감사합니다
Learnopengl 공부하던 때가 생각나
자연스럽고 은은한 효과들을 좋아해서 그런가 참 맘에 든다
역시 언리얼... - dc App