Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

오클루전 컬링

3D 렌더링 엔진에서 **오클루전 컬링**은 숨겨진 형상 제거를 수행하는 프로세스입니다.

이 가이드에서 다음 내용을 배울 것입니다:

  • 오클루전 컬링의 장점과 단점은 무엇입니까?

  • Godot에서 오클루전 컬링을 설정하는 방법입니다.

  • 오클루전 컬링과 관련된 일반적인 문제를 해결합니다.

더 보기

이 문서 외에 여러가지 Godot 데모 프로젝트들도 살펴보면 좋습니다.

오클루전 컬링을 사용하는 이유

수백 개의 방이 나란히 쌓여 있는 이 예 씬에서는 조명이 켜진 방(문 왼쪽)의 벽 뒤에 동적 개체(빨간색 구)가 숨겨져 있습니다.

오클루전 컬링 친화적 레이아웃이 있는 예시 씬

오클루전 컬링 친화적 레이아웃이 있는 예시 씬

오클루전 컬링이 비활성화되면 조명이 켜진 방 뒤의 모든 방이 렌더링되어야 합니다. 동적 객체도 렌더링되어야 합니다.

오클루전 컬링이 비활성화된 씬의 예(와이어프레임)

폐색 컬링이 **비활성화**된 씬의 예(와이어프레임)

오클루전 컬링을 활성화하면 실제로 보이는 방만 렌더링하면 됩니다. 동적 객체도 벽에 의해 가려져 있으므로 더 이상 렌더링할 필요가 없습니다.

오클루전 컬링이 활성화된 씬 예(와이어프레임)

오클루전 컬링이 **활성화**된 씬의 예(와이어프레임)

엔진에서 수행할 작업이 적기 때문에(렌더링할 정점 수가 적고 그리기 호출 수가 적음) 씬에 오클루전 컬링 기회가 충분하다면 성능이 향상됩니다. 즉, 오클루전 컬링은 실내 장면에서 가장 효과적이며, 적은 수의 큰 방 대신 작은 방이 많은 것이 바람직합니다. 이를 메시 세부 수준(LOD) 및 :ref:`doc_visibility_ranges`와 결합하면 성능이 더욱 향상됩니다.

참고

Forward+ 렌더러를 사용할 때 엔진은 이미 *깊이 프리패스*를 수행합니다. 이는 씬의 실제 재질을 렌더링하기 전에 씬의 깊이 전용 버전을 렌더링하는 것으로 구성됩니다. 이는 각 불투명 픽셀이 한 번만 음영 처리되도록 보장하여 오버드로 비용을 크게 줄이는 데 사용됩니다.

성능상의 이유로 깊이 프리패스 기능이 없는 모바일 렌더러를 사용할 때 가장 큰 성능 이점을 확인할 수 있습니다. 결과적으로 오클루전 컬링은 해당 렌더러의 셰이딩 오버드로를 적극적으로 줄입니다.

그럼에도 불구하고 깊이 프리패스를 사용하는 경우에도 복잡한 3D 장면에서 폐색 컬링에 대한 눈에 띄는 이점이 있습니다. 그러나 오클루전 컬링 기회가 거의 없는 장면에서는 오클루전 컬링이 추가 설정 및 CPU 사용량만큼 가치가 없을 수도 있습니다.

Godot에서 오클루전 컬링이 작동하는 방식

참고

"occluder"는 시야를 차단하는 모양을 의미하고 "occludee"는 개체가 숨겨지는 것을 의미합니다.

Godot에서 폐색 컬링은 씬의 폐색기 형상을 CPU의 저해상도 버퍼로 래스터화하여 작동합니다. 이는 소프트웨어 광선 추적 라이브러리 `Embree <https://github.com/embree/embree>`__을 사용하여 수행됩니다.

그런 다음 엔진은 이 저해상도 버퍼를 사용하여 폐색기 모양에 대해 폐색자의 :abbr:`AABB(축 정렬 경계 상자)`를 테스트합니다. 폐색 대상의 :abbr:`AABB(Axis-Aligned Bounding Box)`는 선별할 폐색기 모양에 의해 *완전히 폐색*되어야 합니다.

결과적으로 작은 개체는 큰 개체보다 효과적으로 컬링될 가능성이 더 높습니다. 벽과 같은 큰 차단 장치는 장식 소품과 같은 작은 차단 장치보다 훨씬 더 효과적인 경향이 있습니다.

오클루전 컬링 설정하기

폐색 컬링을 사용하는 첫 번째 단계는 렌더링 > **폐색 컬링 > 폐색 컬링 사용 프로젝트 설정을 활성화하는 것입니다. (보려면 프로젝트 설정 대화 상자에서 고급 토글이 활성화되어 있는지 확인하세요.)

이 프로젝트 설정은 즉시 적용되므로 편집기를 다시 시작할 필요가 없습니다.

프로젝트 설정을 활성화한 후에도 일부 차단기를 만들어야 합니다. 성능상의 이유로 엔진은 눈에 보이는 모든 형상을 오클루전 컬링의 기초로 자동으로 사용하지 않습니다. 대신 엔진에는 베이킹할 정적 객체만 포함된 씬의 단순화된 표현이 필요합니다.

서버로 프로젝트를 내보낼 수 있는 방법이 두 가지 있습니다:

많은 플레이스 홀더

이 접근 방식은 MultiMeshInstance3D 설정 또는 CSG 노드에 대한 폐색 생성과 같은 특수한 사용 사례에 더 적합합니다(앞서 언급한 제한으로 인해).

위에서 언급한 오클루전 컬링 프로젝트 설정을 활성화한 후 3D 레벨이 포함된 씬에 OccluderInstance3D 노드를 추가합니다. OccluderInstance3D 노드를 선택한 다음 Occluder 속성에 추가할 차단기 유형을 선택합니다.

  • QuadOccluder3D(단일 평면)

  • BoxOccluder3D(직육면체)

  • SphereOccluder3D(구형 폐색기)

  • PolygonOccluder3D(원하는 만큼 많은 점을 포함하는 2D 다각형)

편집기에서 포인트를 수정할 수 없지만 스크립트에서 절차적 생성에 유용할 수 있는 ArrayOccluder3D도 있습니다.

오클루전 컬링 미리보기

디버그 그리기 모드를 활성화하면 오클루전 컬링이 실제로 "보는" 내용을 미리 볼 수 있습니다. 3D 편집기 뷰포트의 왼쪽 상단에서 원근 버튼(또는 현재 카메라 모드에 따라 직교)을 클릭한 다음 **디스플레이 고급… > 폐색 컬링 버퍼**를 선택합니다. 그러면 엔진에서 오클루전 컬링을 위해 사용하는 저해상도 버퍼가 표시됩니다.

동일한 메뉴에서 보기 정보**보기 프레임 시간**을 활성화하여 오른쪽 상단에서 렌더링된 초당 프레임 수와 함께 오른쪽 하단에서 그리기 호출 및 렌더링된 프리미티브(정점 + 인덱스) 수를 볼 수도 있습니다.

이 정보가 표시되는 동안 프로젝트 설정에서 오클루전 컬링을 전환하면 씬에서 오클루전 컬링이 성능을 얼마나 향상시키는지 확인할 수 있습니다. 오클루전 컬링은 카메라 앞에 오클루더가 있는 경우에만 효과적이므로 성능상의 이점은 3D 편집기 카메라의 시야각에 따라 크게 달라집니다.

런타임 시 폐색 선별을 토글하려면 다음과 같이 루트 뷰포트에서 ``use_occlusion_culling``를 설정합니다.

get_tree().root.use_occlusion_culling = true

런타임 시 오클루전 컬링을 토글하는 것은 실행 중인 프로젝트의 성능을 비교하는 데 유용합니다.

성능

오클루전 컬링을 활용하도록 레벨을 디자인하세요.

이것이 가장 중요한 지침입니다. 좋은 레벨 디자인은 단지 게임플레이에서 요구하는 것이 무엇인지에 관한 것이 아닙니다. 또한 폐색을 염두에 두고 제작해야 합니다.

실내 환경의 경우 불투명 벽을 추가하여 일정한 간격으로 시야를 "파괴"하고 한 번에 너무 많은 씬이 보이지 않도록 하세요.

대규모 개방형 장면의 경우 가능하면 지형 고도에 피라미드형 구조를 사용하십시오. 이는 다른 지형 형태에 비해 가장 큰 컬링 기회를 제공합니다.

게임 플레이 중에 OccluderInstance3D 노드를 이동하지 마십시오.

여기에는 OccluderInstance3D 노드의 상위 항목 이동이 포함됩니다. 이로 인해 노드 자체가 전역 공간에서 이동하게 되므로 :abbr:`BVH(Bounding Volume Hierarchy)`를 재구축해야 합니다.

OccluderInstance3D의 가시성(또는 그 부모의 가시성 중 하나)을 전환하는 것은 업데이트가 (연속이 아닌) 한 번만 발생하면 되므로 비용이 많이 들지 않습니다.

예를 들어, 미닫이 또는 회전 문이 있는 경우 OccluderInstance3D 노드가 문 자체의 하위가 아니도록 만들 수 있지만(차폐기가 절대 움직이지 않도록) 문이 열리기 시작하면 OccluderInstance3D 가시성을 숨길 수 있습니다. 그런 다음 문이 완전히 닫히면 OccluderInstance3D를 다시 표시할 수 있습니다.

게임 플레이 중에 OccluderInstance3D 노드를 이동해야 하는 경우 복잡하게 구운 모양 대신 기본 Occluder3D 모양을 사용하세요.

가능한 가장 간단한 폐색기 모양을 사용하십시오.

복잡한 3D 장면에서 성능이 저하되거나 끊김이 발생하는 경우 자세한 차단기를 렌더링한 결과 CPU에 과부하가 걸렸음을 의미할 수 있습니다. OccluderInstance3D 노드를 선택하고 Bake > Simplification 속성을 늘린 다음 차단기를 다시 굽습니다.

단순화 값을 합리적으로 유지하는 것을 잊지 마십시오. 레벨의 형상에 비해 값이 너무 높으면 :ref:`doc_occlusion_culling_troubleshooting_false_negative`에서와 같이 잘못된 폐색 선별이 발생할 수 있습니다.

그래도 CPU 사용량이 충분히 낮아지지 않으면 렌더링 > 폐색 선별 > BVH 빌드 품질 프로젝트 설정을 조정하거나 렌더링 > 폐색 선별 > 스레드당 폐색 광선**을 줄여보세요. 해당 설정을 보려면 프로젝트 설정 대화 상자에서 **고급 토글을 활성화해야 합니다.

문제 해결

내 폐색자가 컬링되어야 할 때 컬링되지 않습니다.

폐쇄측:

먼저 OccluderInstance3D의 Bake > Cull Mask 속성이 원하는 메시를 베이킹할 수 있도록 설정되어 있는지 다시 확인하세요. MeshInstance3D 노드의 가시성 레이어는 메시가 베이크에 포함되려면 컬 마스크 내에 있어야 합니다.

또한 폐색 베이킹은 불투명 재질이 포함된 메시만 고려한다는 점에 유의하세요. 표면은 투명*합니다. 재질은 표면에 적용된 텍스처가 완전히 불투명하더라도 베이크에 포함되지 **않습니다*.

마지막으로 MultiMeshInstance3D, GPUParticles3D, CPUParticles3D 및 CSG 노드는 차단기를 베이킹할 때 고려되지 않습니다. 해결 방법으로 OccluderInstance3D 노드를 수동으로 추가할 수 있습니다.

폐쇄측:

**Extra Cull Margin**이 가능한 한 낮게 설정되어 있는지(보통 ``0.0``여야 함), 개체의 GeometryInstance3D 섹션에서 **Ignore Occlusion Culling**이 비활성화되어 있는지 확인하세요.

또한 AABB의 크기(노드 선택 시 주황색 상자로 표시됨)를 확인하세요. 이 축 정렬 경계 상자는 폐색자가 숨겨지도록 폐색기 모양에 의해 완전히 가려져야 합니다.

내 폐색자가 추려져서는 안되는 상황에 처해 있습니다.

이에 대한 가장 가능성 있는 원인은 차단기 베이킹에 포함된 개체가 차단기를 베이킹한 후에 이동되었기 때문입니다. 예를 들어, 레벨 지오메트리를 이동하거나 레이아웃을 재배치할 때 이런 일이 발생할 수 있습니다. 이 문제를 해결하려면 OccluderInstance3D 노드를 선택하고 차단기를 다시 굽습니다.

이는 베이킹에 포함되어서는 안 되는 동적 개체가 포함되었기 때문에 발생할 수도 있습니다. :ref:`폐쇄 컬링 디버그 그리기 모드 <doc_occlusion_culling_preview>`를 사용하여 존재해서는 안 되는 폐색기 모양을 찾은 다음 :ref:`에 따라 베이크 컬링 마스크를 조정 <doc_occlusion_culling_baking>`합니다.

이에 대한 마지막 가능한 원인은 폐색 베이킹 프로세스 중 지나치게 공격적인 메시 단순화입니다. OccluderInstance3D 노드를 선택하고 Bake > Simplification 속성을 줄인 다음 차단기를 다시 굽습니다.

최후의 수단으로 폐색 대상에서 Ignore Occlusion Culling 속성을 활성화할 수 있습니다. 이는 해당 객체에 대한 오클루전 컬링의 성능 향상을 무효화하지만, 결코 컬링되지 않는 객체(예: 1인칭 뷰 모델)에 대해 이 작업을 수행하는 것이 합리적입니다.