목차
오클루젼 컬링 (Occlusion Culling)
오클루젼 컬링 (Occlusion Culling)은 오브젝트가 다른 오브젝트에 의해 가려져서 카메라에 보이지 않을 때 해당 오브젝트의 랜더링을 비활성화 하는 기능입니다. 3D 그래픽에서는 카메라에서 가장 먼 오브젝트가 먼저 그려지고 가까운 오브젝트는 그 위에 그려지므로(일면 덮어 그리기("overdraw")), 이 기능이 자동으로 수행 되지는 않습니다. 오클루젼 컬링은 프러스텀 컬링(Frustum Culling)과는 다릅니다. 프러스텀 컬링은 커메라의 시야 영역 밖에 있는 오브젝트에 대한 랜더기를 비활성화 하지만 덮어 그리기(overdraw)에 의해 뷰(view)에서 숨겨진 것은 끄지 않습니다. 사용자가 오클루젼 컬링을 사용할 동안에도 프러스텀 컬링이 여전히 작동 중이며 그 혜택을 본다는 사실을 주목하십시오.
오클루젼 컬링(Occlusion Culling) 없이 랜더링 되는 씬(scene)
오클루젼 컬링(Occlusion Culling)이 지원되어 랜더링 되는 씬(scene)
오클루젼 컬링 과정은 씬(scene)을 지나가며 가상 카메라를 사용하여 장차 보여질 가능성이 있는 오브젝트의 집합으로 계층 구조를 구축합니다. 이 데이터는 실행 시에 각 카메라가 어떤 것이 볼 수 있고 어떤 것이 아닌지를 구분하는 데 사용됩니다. 이 정보를 가지고, Unity는 보여지는 오브젝트만 랜더링에 전송되게 합니다. 이는 그리기 호출(draw calls) 횟수를 줄이고 게임의 성능을 향상 시킵니다.
오클루젼 컬링의 데이터는 셀(cells)로 이루어져 있습니다. 각 셀은 씬(scene)의 전체 바운딩 볼륨(bounding volume)의 하위 분할입니다. 더 구체적으로 셀은 바이너리 트리(binary tree)을 형성합니다. 오클루젼 컬링은 두개의 트리를 사용하는데, 하나는 View Cells (정적인 오브젝트)이고 다른 하나는 Target Cells(움직이는 오브젝트)입니다. 뷰 셀(View Cells)은 가시적인 정적 오브젝트를 정의한 인텍스 목록(list of indices)으로 매핑 되며, 이는 정적인 오브젝트에 대해서 좀 더 정확한 컬링 결과를 제공합니다.
사용자가 오브젝트를 생성할 때는 이 사실을 기억할 필요가 있습니다. 그 이유는 사용자가 오브젝트의 크기와 셀의 크기 사이에 적당한 균형을 맞출 필요가 있기 때문입니다. 이상적으로는, 사용자의 오브젝트와 비교하여 너무 작은 셀은 있어서는 안 되지만 마찬가지로 너무 많은 셀을 걸치는 오브젝트가 있어서도 안됩니다. 때로는 큰 오브젝트를 작은 조각으로 나누면 컬링을 개선할 수 있습니다. 하지만, 그림 셀(draw cell)을 줄이기 위해 작은 오브젝트를 합칠 수도 있고, 그것들이 같은 셀에 속하는 한 오클루젼 컬링에는 영향을 미치지 않을 것 입니다. 셀의 집합과 어느 셀이 다른 셀로부터 보여지는 가를 정하는 가시성 정보(visibility information)는 PVS (_P_otentially _V_isible _S_et)이라고 합니다.
오클루젼 컬링(Occlusion Culling)의 설치
오클루젼 컬링을 사용하기 위해서는, 수동적인 설정이 일부 필요합니다. 우선, 사용자의 계층 기하구조(level geometry)를 합리적인 크기의 조각으로 나누어져야 합니다. 사용자의 계층을 벽과 빌딩과 같은 대형 오브젝트에 의해 서로 가려지는 작고 잘 정의된 구역으로 펼치는 것도 도움이 됩니다. 여기서의 주된 아이디어는 각 개별 메쉬가 오클루젼 데이터에 의해 켜지고 꺼진다는 것입니다. 그러므로 사용자가 사용자의 방에 있는 모든 가구를 포함하는 하나의 오브젝트를 가졌다면 그 가구 집합은 전부 컬링 되거나 아무것도 컬링이 되지 않은 것입니다. 이것은 각각의 가구를 독립적인 메쉬로 만들어 각각이 카메라의 관점에 따라 개별적으로 컬링 되는 것만큼이나 터무니 없을 것 입니다.
오클루젼의 일부가 되기를 원하는 모든 씬(scene) 오브젝트는 Inspector
내에서 Occlusion Static으로 태그를 달아야 합니다. 이를 수행하는 가장 빠른 방법은 오클루젼 계산에 포함 될 모든 오브젝트를 다중 선택(multi-select)하여 Occlusion Static 와 Occludee Static으로 마크하는 것 입니다.
Marking an object for Occlusion 오클루젼을 위한 오브젝트 생성
언제 Occludee Static을 사용할까요? 가리지 않는 투명한 오브젝트와 다른 것을 가릴 염려가 없는 작은 오브젝트는 Occludees로 마크 되어야 하고, Occluders로 마크되어서는 안됩니다. 이들은 다른 오브젝트에 의해 오클루젼의 고려대상이 되지만, 그들 자신이 오클루더(가리는 주체)로는 여겨지지 않을 것입니다.
오클루젼 컬링(Occlusion Culling) 창
오클루젼 컬링을 다루는 대부분의 작업에 대하여, 사용자가 오클루젼 컬링 창을(Window→Occlusion Culling) 사용할 것을 권장합니다.
오클루젼 컬링 창에서, 사용자는 오클루더(occluder) 메쉬와 Occlusion Areas 작업을 수행할 수 있습니다.
사용자가 Occlusion Culling Window의 Object에 있다면 씬(scene) 내에서 Mesh Renderer을 선택하여 관련 Static 플래그를 변경할 수 있습니다:
Occlusion Culling Window for a Mesh Renderer
만일 사용자가 Occlusion Culling Window의 Object에 있고 Occlusion Area을 선택하였다면, OcclusionArea 속성과 관련된 작업을 수행할 수 있습니다 (더 자세한 정보를 보려면 Occlusion Area section 참조).
for the Occlusion Area에 대한 오클루젼 컬링 창
_주의:_ 기본적으로 사용자가 오클루젼 영역(occlusion areas)을 만들지 않으면, 오클루젼 컬링은 씬 전체에 적용되지 않을 것 입니다.
_주의:_ 카메라가 오클루젼 영역을 벗어날 때 마다, 오클루젼 컬링은 적용되지 않습니다. 그러므로 오클루젼 영역을 카메라가 있을 가능성이 있는 지역을 포함하는 것이 중요하며, 하지만 그 영역이 너무 커지면 굽기(baking) 수행에 있어 비용이 발생합니다.
오클루젼 컬링(Occlusion Culling) – 굽기(Bake)
Properties
Technique | 오클루젼 컬링 굽기 타입 중 선택 |
»>PVS only | 오클루젼 컬링은 정적 오브젝트를 대상으로만 동작합니다. 동적 오브젝트(Dynamic objects)는 뷰 프러스텀(view frustrum)을 기반으로 컬링 될 것입니다. 이 기술은 CPU에 경미한 부담을 추가하지만, 동적 오브젝트가 컬링 되지 않으므로, 움직이는 오브젝트나 인물이 적은 게임에 추천할 만 합니다. 모든 가시성은 미리 계산되므로, 사용자는 실행 시 포털(portal)을 열거나 닫을 수 없습니다. |
»>PVS and dynamic objects | 정적인 오브젝트는 미리 계산된 가시성을 사용하여 컬링 됩니다. 동적인 오브젝튼 포털 컬링(portal culling)을 사용하여 컬링 됩니다. 이 기술은 실행 시의 오버헤드와 컬링의 효율성 사이에 적당한 균형을 가져옵니다. 모든 가시성이 미리 계산 되었으므로, 사용자는 실행 시 포털(portal)을 열거나 닫을 수 없습니다. |
»>Automatic Portal Generation | |
View Cell Size | 시야 영역 셀의 각 크기. 작은 값은 더욱 정확한 오클루젼 컬링을 제공합니다. 이 값은 오클루젼의 정확성과 저장 공간의 크기 사이의 교환입니다. |
Near Clip Plane | 근거리 클립 면(Near clip plane)은 게임의 모든 카메라에 의해 사용되어질 가장 작은 근거리 클립 면으로 설정되어 야 합니다. |
Far Clip Plane | 원거리 클립 면(Far Clip Plane)은 오브젝트를 컬링 하는데 사용됩니다 (게임의 모든 카메라에 의해 사용되어질 가장 큰 원거리 클립 면으로 설정되어 야 합니다). |
Memory limit |
오클루젼 컬링(Occlusion Culling) – 시각화(Visualization)
Occlusion culling inspector visualization 탭.
근거리와 원거리 면(near and far planes)은 오클루젼 데이터를 계산하는 데 사용되는 가상 카메라를 정의합니다. 사용자가 근거리 혹은 원거리 면의 여러 카메라를 가지고 있다면, 오브젝트의 올바른 포함을 위하여 모든 카메라의 가장 작은 근거리 면과 가장 큰 원거리 면의 거리를 사용해야 합니다.
씬(scene)의 모든 오브젝트는 바운딩 볼륨(bounding volume)의 크기에 영향을 주므로, 이들 모두를 씬의 가시적인 경계 내에 두려고 노력해야 합니다.
사용자가 오클루젼 데이터를 생성할 준비가 되면, Bake 버튼을 클릭합니다. Bake 탭에서 Memory Limit 을 선택하는 것을 잊지 마십시오. 낮은 값은 더 빠르지만 덜 정확한 결과를 생성하고, 높은 값은 출시와 비슷한 결과물에 사용됩니다.
오클루젼 데이터를 구축하는 데 걸리는 시간은 셀의 레벨, 데이터 사이즈 및 사용자가 선택한 품질에 달려있음을 유념하십시오. Unity는 주된 창 하단에 PVS 생성 상태를 표시할 것입니다.
이 작업이 완료하면, 사용자는 뷰 영역(View Area)에 여러 색상의 큐브(cubes)을 볼 수 있을 것 입니다. 이 색상 지역은 같은 오클루젼 데이터를 공유하는 지역입니다.
미리 계산된 모든 오클루젼 컬링을 삭제하고 싶으면, Clear 을 클릭합니다.
오클루젼 컬링(occlusion culling)을 움직이는 오브젝트에 적용하려면, 사용자는 오클루젼 영역 (Occlusion Area
)을 만들고 그 크기를 움직이는 오브젝트가 위치할 곳에 있는 공간에 맞추어 변경하여야 합니다 (물론 움직이는 오브젝트는 static 로 마크 될 수 없습니다). 사용자는 Occlusion Area 컴포넌트를 빈 게임 오브젝트에 추가함으로써 오클루젼 영역(Occlusion Areas)을 생성할 수 있습니다 (메뉴 상의 Component→Rendering→Occlusion Area).
오클루젼 영역(Occlusion Area
)을 생성한 후, 움직이는 오브젝트를 가리려면(occlude) Is Target Volume 체크 상자를 체크합니다.
Occlusion Area properties for moving objects.
Size | 오클루젼 영역(Occlusion Area)의 크기를 정의합니다. |
Center | 오클루젼 영역(Occlusion Area)의 중앙을 설정한다. 기본값으로 이는 0,0,0 이고 박스의 중앙에 위치하고 있습니다. |
Is View Volume | 카메라가 있는 위치를 정합니다. 이 오클루젼 영역(Occlusion Area)의 내부에 있는 static 오브젝트를 가리려면 이것을 체크합니다. |
Is Target Volume | _움직이는 오브젝트를 가리고 싶다면 이것을 체크합니다._ |
Target Resolution | 이 영역 내에서 오클루젼 컬링이 얼마나 정확할지 결정합니다. 이은 오클루젼 영역(Occlusion Area)의 셀 크기에 영향을 미칩니다. _NOTE: 이것은 목표영역Target Areas에만 영향을 미칩니다._ |
»>Low | 연산에는 시간이 덜 소요되지만, 정확도는 떨어집니다 |
»>Medium | 오클루젼 컬링 데이터를 처리하는 데 걸리는 시간과 정확도 사이에 균형을 맞춥니다. |
»>High | 연산에 시간은 더 소요되나 정확도는 향상됩니다. |
»>Very High | 높은 해상도(high resolutions) 보다 정확도를 더 향상시키고 싶을 경우 이 값을 사용하나, 더 많은 시간이 소요됨을 유념하시기 바랍니다. |
»>Extremely High | 사용자의 움직이는 오브젝트에 대하여 거의 정확한 오클루젼 컬링을 원할 경우 이 값을 사용합니다. 주의: 이는 연산에 많은 시간을 소요합니다. |
사용자가 오클루젼 영역(Occlusion Area)을 추가한 후, 이것이 박스를 셀로 어떻게 나누는지를 보아야 합니다. 오클루젼 영역을 어떻게 계산하는 지 보려면, Occlusion Culling Preview Panel
내에서 Edit 버튼을 선택하고 View 버튼을 toggle(토글) 합니다.
실행 중에 열고 닫을 수 있는 오클루젼의 기본형(occlusion primitive)을 생성하려고, Unity는 Occlusion Portals을 사용합니다.
Open | |
Center | 오클루젼 영역(Occlusion Area)의 중앙을 설정. 기본값은 0,0,0 이며 박스의 중앙에 위치함. |
Size | 오클루젼 영역의 크기를 정의. |
- 출처: 유니티코리아위키 (CC BY-NC-SA 2.0)
- 출처: 유니티코리아위키 (CC BY-NC-SA 2.0)