반응형

오클루전 컬링은 다른 오브젝트에 가려져 카메라에 비치지 않게 되어 버린 오브젝트의 렌더링을 무효화하는 기능입니다.


오클루전 컬링

오클루전 컬링은 다른 오브젝트에 가려져 카메라에 비치지 않게 되어 버린 오브젝트의 렌더링을 무효화하는 기능입니다. 3D 컴퓨터 그래픽의 세계에서는 대부분의 경우 카메라에서 먼 오브젝트에서 먼저 그려지며, 더 가까이 있는 오브젝트가 차례차례 덮어써지게 됩니다(“오버 드로우”라고 부릅니다). 오클루전 컬링은 그만큼 당연한 기능이 아닙니다. 오클루전 컬링은 절두체 컬링(Frustum Culling)과는 다릅니다. 절두체 컬링은 카메라의 표시 영역에서 벗어난 오브젝트의 렌더링을 비활성화하는 것이고, 오클루전 컬링과 같이 오버 드로우에 의해 안 보이게 되는 오브젝트 렌더링은 무효화하지 않습니다. 또한, 오클루전 컬링을 사용하면서 동시에 절두체 컬링의 혜택을 누릴 수 있습니다.

A maze-like indoor level. This normal scene view shows all visible Game Objects.
A maze-like indoor level. This normal scene view shows all visible Game Objects.
Regular frustum culling only renders objects within the cameras view. This is automatic and always happens.
Regular frustum culling only renders objects within the camera’s view. This is automatic and always happens.
Occlusion culling removes additional objects from within the camera rendering work if they are entirely obscured by nearer objects.
Occlusion culling removes additional objects from within the camera rendering work if they are entirely obscured by nearer objects.

오클루전 컬링 처리에서는 먼저 가상 카메라를 사용하여 가시 상태가 될 수 있는 오브젝트의 계층 구조가 생성됩니다. 게임 실행시에는 각 카메라가 이 데이터를 이용하여 가시 여부를 확인합니다. 그 확인 결과를 이용하여 Unity는 가시 상태의 오브젝트만을 렌더링합니다. 그 결과, 드로우콜 수가 감소하고 게임 성능이 향상됩니다.

오클루전 컬링에 사용되는 데이터는 셀(Cell)로 구성되어 있습니다. 각 셀은 씬 전체의 바운딩 볼륨(Bounding Volume)을 분할한 것입니다. 그리고 보다 상세하게는,이 셀은 이진 트리(Binary tree)를 구성하고 있습니다. 오클루전 컬링은 두개의 트리 구조 데이터를 사용합니다. 하나는 View Cells(정적 오브젝트용)이고 다른 하나는 Target Cells(동적 오브젝트용)입니다. View Cells는 가시의 정적 오브젝트용의 인덱스에 연결되어 있어, 정적 오브젝트에 대한 더 정확한 컬링 결과를 제공하기 위해 사용됩니다.

게임 오브젝트를 만들 때는 이 셀을 명심해두면 좋을 것입니다. 왜냐하면 게임 오브젝트와 셀의 크기의 좋은 밸런스를 위해 필요하기 때문입니다. 가능한한, 오브젝트에 ​​대해 너무 작은 셀이나, 여러 셀을 포함하는 오브젝트를 만들어서는 안 됩니다. 큰 개체를 작은 조각으로 분할하여 컬링의 효과를 향상시킬 수 있습니다. 그러나 다른 한편으로는 드로우콜을 줄이기 위해 작은 오브젝트를 병합할 수 있습니다. 그리고 동일한 셀에 포함된 오브젝트끼리는 오클루전 컬링의 효과는 발동하지 않는다는 점도 주의가 필요합니다. 어떤 셀이 어느 셀에서 보고 표시 상태가 되는지에 대한 판정에 사용되는 셀 표시 정보를, 통틀어서 PVS (PotentiallyVisibleSet)이라고 합니다.

You can use the ‘overdraw’ scene rendering mode to see the amount of overdraw that is occuring, and the stats information pane in the game view to see the amount of triangles, verts, and batches that are being rendered. Below is a comparison of these before and after applying occlusion culling.

Notice in the Overdraw scene view, a high density of overdraw as many rooms beyond the visible walls are rendered. These arent visible in the game view, but nonetheless time is being taken to render them.
Notice in the Overdraw scene view, a high density of overdraw as many rooms beyond the visible walls are rendered. These aren’t visible in the game view, but nonetheless time is being taken to render them.
With occlusion culling applied, the distant rooms are not rendered, the overdraw is much less dense, and the number of triangles and batches being rendered has dropped dramatically, without any change to how the game view looks.
With occlusion culling applied, the distant rooms are not rendered, the overdraw is much less dense, and the number of triangles and batches being rendered has dropped dramatically, without any change to how the game view looks.

오클루전 컬링 설정

오클루전 컬링을 이용함에 있어 몇 가지 수작업이 필요합니다. 먼저 레벨의 지오메트리를 적당한 크기의 조각으로 분할해야 합니다. 한층 더 레벨이 명확하게 정의된, 가능한 한 작은 영역마다 정리되는 대로 배치하는 것도 좋습니다. 또한, 벽, 빌딩 등의 거대한 오브젝트들로부터 가려진 영역을 소규모로 정의된 영역에 레벨을 배치하는게 도움이 됩니다. 이 개념은 개별 메쉬가 오클루전의 데이터를 기반으로 활성화 또는 비활성화된다는 것입니다. 따라서 예를 들면, 당신의 레벨에 단 하나의 오브젝트 밖에 없고, 게다가 그 안에 방과 모든 가구의 메쉬가 포함된 경우에는 모두가 컬링되거나 또는 아무것도 컬링되지 않거나의 두 개의 선택이 되어 버립니다. 이래서는 의미가 없습니다. 또한 가구의 파트마다 메쉬를 나누어 각 부분이 카메라의 관점에 기초하여 컬링되도록 하는 것도 마찬가지로 의미가 없습니다.

씬 안에서 오클루전을 적용하는 모든 오브젝트는 Inspector에서 Occluder Static 태그를 붙일 필요가 있습니다. 이렇게 하는 빠른 방법은, 오클루전의 계산에 포함할 오브젝트를 다중 선택하고 Occluder Static 및 Occludee Static 체크 마크를 붙이는 것입니다.

오브젝트의 오클루전에 대해 마킹
오브젝트의 오클루전에 대해 마킹

Occludee Static 을 어떤 경우에 사용할 수 있는지 설명합니다. 다른 오브젝트를 가로막는 것이 없는 투명한 오브젝트와 작은 오브젝트는 Occluders 대신 Occludees의 확인란을 선택해야 합니다. 체크된 오브젝트는 다른 오브젝트에 의한 가림 판정시에 고려되어, 가려진 측면으로 판정시에는 무시됩니다. 이에 따라 계산 비용이 낮아집니다.

오클루전 컬링 창

대부분의 오클루전 컬링 처리에 대해서는, Occlusion Culling 창 (Window->Occlusion Culling) 을 사용 해야 합니다.

Occulusion Culling 창에서는 가리는 쪽이 될 메쉬의 설정이나, Occlusion Areas 설정이 가능합니다.

Occlusion Culling window의 Object 탭을 표시 중이고 씬에서 [Mesh Renderer](class- MeshRenderer)를 선택하는 경우, 그것에 Static 관련 플래그를 변경할 수 있습니다.

메쉬 렌더러 용 Occlusion Culling 창
메쉬 렌더러 용 Occlusion Culling 창

Occlusion Culling window의 Object 탭을 표시 중이고 Occlusion Area를 선택하는 경우에는 오클루전 영역 관련 프로퍼티를 변경할 수 있습니다 (자세한 내용은 Occlusion Area를 참조하십시오).

오클루전 영역의 Occlusion Culling 창
오클루전 영역의 Occlusion Culling 창

참고: 오클루전 영역을 하나도 만들지 않으면 기본값으로 씬 전체에 오클루전 컬링이 적용됩니다.

참고: 카메라가 오클루전 영역 외에 있는 경우, 오클루전 컬링은 적용되지 않습니다. 따라서 카메라가 이동할 수 있는 위치를 모두 커버하도록 오클루전 영역을 설정하는 것이 중요합니다. 그러나 오클루전 영역이 너무 크면 이번에는 베이크 처리에 시간이 걸리게 되어 버립니다.

오클루전 컬링 - Bake

오클루전 컬링 인스펙터의 Bake 탭
오클루전 컬링 인스펙터의 Bake 탭

The occlusion culling bake window has a “Set Default Parameters” button, which allows you to reset the bake values to Unity’s default values. These are good for many typical scenes, however you’ll often be able to get better results by adjusting the values to suit the particular contents of your scene.

프로퍼티

프로퍼티기능
Smallest OccluderThe size of the smallest object that will be used to hide other objects when doing occlusion culling. Any objects smaller than this size will never cause objects occluded by them to be culled. For example, with a value of 5, all objects that are higher or wider than 5 meters will cause hidden objects behind them to be culled (not rendered, saving render time). Picking a good value for this property is a balance between occlusion accuracy and storage size for the occlusion data.
Smallest HoleThis value represents the smallest gap between geometry through which the camera is supposed to see. The value represents the diameter of an object that could fit through the hole. If your scene has very small cracks through which the camera should be able to see, the Smallest Hole value must be smaller than the narrowest dimension of the gap.
Backface ThresholdUnity’s occlusion uses a data size optimization which reduces unnecessary details by testing backfaces. The default value of 100 is robust and never removes backfaces from the dataset. A value of 5 would aggressively reduce the data based on locations with visible backfaces. The idea is that typically, valid camera positions would not normally see many backfaces - for example, the view of the underside of a terrain, or the view from within a solid object that you should not be able to reach. With a threshold lower than 100, Unity will remove these areas from the dataset entirely, thereby reducing the data size for the occlusion.

bake 탭의 하단에는 Clear와 Bake 버튼이 있습니다. 오클루전 컬링 데이터를 생성하기 위해서 Bake 버튼을 클릭합니다. 한번 데이터가 생성되고나면, Visualization 탭을 이용하여 오클루전 컬링을 테스트할 수 있습니다. 만약 결과가 만족스럽지 않은 경우, Clear 버튼을 클릭하면 이전의 계산 결과를 지우고, 셋팅을 조절하고, 다시 구울(bake) 수 있습니다.

오클루전 컬링 - Visualization

오클루전 컬링 인스펙터의 Visualization 탭
오클루전 컬링 인스펙터의 Visualization 탭

바운딩 볼륨의 크기는 씬 내의 모든 오브젝트에 영향을 받기 때문에 가능한 모든 오브젝트가 씬의 가시 영역에 맞도록 하십시오.

오클루전 데이터를 생성할 준비가 끝나면 Bake 버튼을 클릭하십시오. 그 때, Bake 탭에 있는 Memory Limit 값을 올바르게 선택합시다. 이 값이 작을수록 데이터의 생성 속도가 빨라지며, 내용은 정확하지 않게 됩니다. 반대로 값이 클수록 릴리즈를 위한 제품 레벨의 퀄리티에 다가갑니다.

오클루전 데이터의 생성에 걸리는 시간은 셀의 정보와 데이터 크기, 선택한 퀄리티에 좌우된다는 점에 유의하십시오. Unity는 메인 윈도우 하단에 PVS 생성의 상태를 표시합니다.

생성 처리가 완료되면 뷰 영역에 다채로운 색상의 큐브들이 표시됩니다. 이같은 색으로 표시된 영역은 같은 오클루전 데이터를 공유하고 있습니다.

Clear 버튼을 클릭하면 오클루전 컬링을 위해 미리 계산된 데이터를 지울 수 있습니다.

오클루전 영역

오클루전 컬링을 적용하기 위해서는 Occlusion Area를 만들고 이동하는 오브젝트가 배치될 위치가 되도록 크기를 수정해야 합니다(당연히, 이동하는 오브젝트를 Static으로 할 수는 없습니다). Occlusion Area를 만들려면, 빈 게임 오브젝트에Occlusion Area 컴포넌트를 추가합니다. (메뉴에서 Component -> Rendering -> Occlusion Area)

Occlusion Area를 만든 후, IsTargetVolume 확인란을 선택하여 움직이는 오브젝트를 오클루전(무시)합니다.

프로퍼티:기능:
Size오클루전 영역의 크기를 정의
Center오클루전 영역의 중심을 설정합니다. 기본적으로 (0,0,0)이고, 박스의 중앙에 위치하고 있습니다.
Is View Volume카메라를 배치할 위치를 정의합니다. Occlusion Area 에 있는 Static 오브젝트를 오클루전할 때 활성화 합니다.
움직이는 오브젝트에 대한 오클루전 영역 프로퍼티.
움직이는 오브젝트에 대한 오클루전 영역 프로퍼티.

Occlusion Area를 만든 후 상자를 셀 분할하는 방법을 확인해야 합니다. Occlusion Area가 어떻게 산출되었는지 확인하기 위해서는 Occlusion Culling Preview Panel 에서 Edit를 선택하고 View 를 토글하여 선택하십시오 .

생성된 오클루전 테스트

오클루전을 설치한 후, Occlusion Culling 을 선택하고 (Visualize mode의 Occlusion Culling Preview Panel에서) Main Camera를 씬 뷰 안으로 이동함으로써 테스트할 수 있습니다.

씬 뷰의 오클루전 뷰 모드
씬 뷰의 오클루전 뷰 모드

메인 카메라를 이동하는데 맞추어 (Play 모드가 아닌 경우에도) 오브젝트가 비활성화(disable)가 되는 것을 확인할 수 있습니다. 오클루전 데이터에 오류가 나오지 않는 것을 확인할 필요가 있습니다. 이동함에 따라 오브젝트가 뷰에 끼어 들어 오면 오류로 인식할 수 있습니다. 이 경우 오류를 해결하기 위해 옵션으로는 화면 해상도를 변경(Target Volumes를 변경한 경우)하거나, 오브젝트를 이동하여 오류가 나오지 않게 하는 방법이 있습니다. 오클루전에서 디버깅을 하기 위해서는 메인 카메라를 문제가 있는 위치로 이동하여 집중 검사를 할 수 있습니다.

처리가 완료되면 뷰 영역에서 컬러풀한 큐브를 확인할 수 있습니다. 파란 큐브는 Target Volumes(Target Volume)의 셀 분할을 의미합니다. 흰색 큐브는View Volumes(View Volume)의 셀 분할을 의미합니다. 만약 파라미터가 올바르게 설정되어 있으면 일부 오브젝트는 렌더링되지 않습니다. 그 이유는 카메라의 뷰 프러스텀의 외부에 있거나 다른 오브젝트의 배치에 의해 무시되었을 것입니다.

오클루전이 완료된 후, 씬에서 아무것도 오클루전되지 않은 경우, 오브젝트를 더 작은 부분으로 분해하여 그 오브젝트가 셀 안에 들어가는 크기로 되어 집니다.




오클루전 영역

오클루전 컬링을 적용하기 위해서는 Occlusion Area를 만들고 이동하는 오브젝트가 배치될 위치가 되도록 크기를 수정해야 합니다(당연히, 이동하는 오브젝트를 Static으로 할 수는 없습니다). Occlusion Area를 만들려면, 빈 게임 오브젝트에Occlusion Area 컴포넌트를 추가합니다. (메뉴에서 Component -> Rendering -> Occlusion Area)

Occlusion Area를 만든 후, IsTargetVolume 확인란을 선택하여 움직이는 오브젝트를 오클루전(무시)합니다.

프로퍼티:기능:
Size오클루전 영역의 크기를 정의
Center오클루전 영역의 중심을 설정합니다. 기본적으로 (0,0,0)이고, 박스의 중앙에 위치하고 있습니다.
Is View Volume카메라를 배치할 위치를 정의합니다. Occlusion Area 에 있는 Static 오브젝트를 오클루전할 때 활성화 합니다.
움직이는 오브젝트에 대한 오클루전 영역 프로퍼티.
움직이는 오브젝트에 대한 오클루전 영역 프로퍼티.

Occlusion Area를 만든 후 상자를 셀 분할하는 방법을 확인해야 합니다. Occlusion Area가 어떻게 산출되었는지 확인하기 위해서는 Occlusion Culling Preview Panel 에서 Edit를 선택하고 View 를 토글하여 선택하십시오 .

생성된 오클루전 테스트

오클루전을 설치한 후, Occlusion Culling 을 선택하고 (Visualize mode의 Occlusion Culling Preview Panel에서) Main Camera를 씬 뷰 안으로 이동함으로써 테스트할 수 있습니다.

씬 뷰의 오클루전 뷰 모드
씬 뷰의 오클루전 뷰 모드

메인 카메라를 이동하는데 맞추어 (Play 모드가 아닌 경우에도) 오브젝트가 비활성화(disable)가 되는 것을 확인할 수 있습니다. 오클루전 데이터에 오류가 나오지 않는 것을 확인할 필요가 있습니다. 이동함에 따라 오브젝트가 뷰에 끼어 들어 오면 오류로 인식할 수 있습니다. 이 경우 오류를 해결하기 위해 옵션으로는 화면 해상도를 변경(Target Volumes를 변경한 경우)하거나, 오브젝트를 이동하여 오류가 나오지 않게 하는 방법이 있습니다. 오클루전에서 디버깅을 하기 위해서는 메인 카메라를 문제가 있는 위치로 이동하여 집중 검사를 할 수 있습니다.

처리가 완료되면 뷰 영역에서 컬러풀한 큐브를 확인할 수 있습니다. 파란 큐브는 Target Volumes(Target Volume)의 셀 분할을 의미합니다. 흰색 큐브는View Volumes(View Volume)의 셀 분할을 의미합니다. 만약 파라미터가 올바르게 설정되어 있으면 일부 오브젝트는 렌더링되지 않습니다. 그 이유는 카메라의 뷰 프러스텀의 외부에 있거나 다른 오브젝트의 배치에 의해 무시되었을 것입니다.

오클루전이 완료된 후, 씬에서 아무것도 오클루전되지 않은 경우, 오브젝트를 더 작은 부분으로 분해하여 그 오브젝트가 셀 안에 들어가는 크기로 되어 집니다.




ref : https://docs.unity3d.com/kr/current/Manual/OcclusionCulling.html

ref : https://docs.unity3d.com/kr/current/Manual/class-OcclusionArea.html


반응형

+ Recent posts