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.

가시성 범위 (HLOD)

메시 세부 수준(LOD) 및 :ref:`doc_occlusion_culling`와 함께 가시 범위는 크고 복잡한 3D 장면의 성능을 향상시키는 또 다른 도구입니다.

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

  • 어떤 가시성 범위가 가능하며 어떤 시나리오에 유용합니까?

  • Godot에서 가시성 범위(수동 LOD)를 설정하는 방법입니다.

  • 최고의 성능과 품질을 위해 가시성 범위를 조정하는 방법

더 보기

거리에 따라 메시의 상세도를 낮추기만 하면 되지만 LOD 메시를 수동으로 작성하지 않은 경우 대신 자동 :ref:`doc_mesh_lod`를 사용하는 것이 좋습니다.

자동 메시 LOD 및 가시성 범위는 동일한 메시에서도 동시에 사용할 수 있습니다.

도표는 다음과 같습니다:

가시성 범위는 GeometryInstance3D에서 상속된 모든 노드와 함께 사용할 수 있습니다. 이는 아티스트가 제어하는 :abbr:`HLOD(Hierarchical Level of Detail)`을 위해 MeshInstance3D 및 MultiMeshInstance3D뿐만 아니라 GPUParticles3D, CPUParticles3D, Label3D, Sprite3D, AnimatedSprite3D 및 CSGShape3D와 함께 사용할 수 있음을 의미합니다.

가시성 범위는 노드별로 구성되므로 LOD 시스템의 일부로 다양한 노드 유형을 사용할 수 있습니다. 예를 들어 가까이 있을 때 나무를 나타내는 MeshInstance3D를 표시하고 멀리 있는 Sprite3D 임포스터로 대체하여 성능을 향상할 수 있습니다.

기존 LOD 시스템에 비해 :abbr:`HLOD(계층적 세부 수준)`의 이점은 계층적 특성입니다. 하나의 큰 메시가 여러 개의 작은 메시를 대체할 수 있으므로 먼 거리에서는 그리기 호출 수를 줄일 수 있지만 가까이 있을 때는 컬링 기회를 보존할 수 있습니다. 예를 들어 가까이 있을 때는 개별 MeshInstance3D 노드(집당 하나)를 사용하지만 덜 상세한 주택 그룹을 나타내는 단일 MeshInstance3D로 전환되는 주택 그룹이 있을 수 있습니다(또는 MultiMeshInstance3D 사용).

마지막으로, 가시 범위는 카메라가 너무 가까워지거나 너무 멀어지면 특정 물체를 완전히 희미하게 만드는 데 사용될 수도 있습니다. 이는 게임 플레이 목적으로 사용될 수 있지만 시각적 혼란을 줄이는 데에도 사용할 수 있습니다. 예를 들어 Label3D 노드는 플레이어가 읽을 수 없거나 플레이어와 관련되기에는 너무 멀리 떨어져 있는 경우 가시 범위를 사용하여 페이드 처리할 수 있습니다.

가시성 범위 설정하기

기본 LOD 시스템 구성을 위한 빠른 시작 가이드입니다. 이 가이드를 따르면 이 LOD 시스템은 가까이 있을 때 SphereMesh를 표시하고 카메라가 충분히 멀리 있을 때 BoxMesh를 표시합니다. 작은 히스테리시스 마진은 Begin MarginEnd Margin 속성을 통해 구성됩니다. 이렇게 하면 카메라가 LOD 전환의 "가장자리"에서 움직일 때 LOD가 너무 빨리 앞뒤로 튀어나오는 것을 방지할 수 있습니다.

가시성 범위 속성은 MeshInstance3D 노드를 선택한 후 GeometryInstance3D 검사기의 가시성 범위 섹션에서 찾을 수 있습니다.

  • 두 개의 MeshInstance3D 노드를 함께 그룹화하는 데 사용할 Node3D 노드를 추가합니다.

  • Node3D의 하위 항목으로 첫 번째 MeshInstance3D 노드를 추가합니다. Mesh 속성에 새 SphereMesh를 할당합니다.

  • 첫 번째 MeshInstance3D의 가시성 범위 **End**를 ``10.0``로 설정하고 **End Margin**을 ``1.0``로 설정합니다.

  • 두 번째 MeshInstance3D 노드를 Node3D의 하위 항목으로 추가합니다. Mesh 속성에 새 BoxMesh를 할당합니다.

  • 두 번째 MeshInstance3D의 가시성 범위 **Begin**을 ``10.0``로 설정하고 **Begin Margin**을 ``1.0``로 설정합니다.

  • 카메라를 개체 쪽으로 멀리 이동했다가 다시 이동합니다. 카메라가 멀어짐에 따라 객체가 구형에서 상자로 어떻게 전환되는지 확인하세요.

가시성 범위 속성

GeometryInstance3D에서 상속된 노드의 검사기에서는 GeometryInstance3D의 가시성 범위 섹션에서 다음 속성을 조정할 수 있습니다.

  • 시작: 카메라가 이 값(3D 단위)보다 *인스턴스의 AABB*(축 정렬 경계 상자) 중심에 더 가까워지면 인스턴스가 숨겨집니다.

  • 시작 여백: 클로즈업 전환에 사용할 히스테리시스 또는 알파 페이드 전환 거리입니다(3D 단위). 이 속성의 동작은 **페이드 모드**에 따라 달라집니다.

  • 종료: 카메라가 인스턴스의 AABB 중심에서 이 값(3D 단위)보다 더 멀리 떨어져 있으면 인스턴스가 숨겨집니다.

  • 끝 여백: 원거리 전환에 사용할 히스테리시스 또는 알파 페이드 전환 거리입니다(3D 단위). 이 속성의 동작은 **페이드 모드**에 따라 달라집니다.

  • 페이드 모드: LOD 레벨 간 전환이 수행되는 방식을 제어합니다. 자세한 내용은 아래를 참조하세요.

페이드 모드

참고

선택한 페이드 모드는 가시성 범위 > 시작 여백 또는 **가시성 범위 > 끝 여백**이 ``0.0``보다 큰 경우에만 눈에 보이는 영향을 미칩니다.

검사관의 가시성 범위 섹션에는 선택할 수 있는 3가지 페이드 모드가 있습니다.

  • 비활성화됨: 히스테리시스를 사용하여 LOD 레벨 간을 즉시 전환합니다. 이는 플레이어가 LOD 전환 지점에서 앞으로 이동했다가 뒤로 이동할 때 LOD 레벨이 앞뒤로 빠르게 전환되는 상황을 방지합니다. 히스테리시스 거리는 가시성 범위 > 시작 여백**가시성 범위 > 끝 여백**에 의해 결정됩니다. 이 모드는 페이드 전환 중에 렌더링이 투명해지도록 강제하지 않으므로 최상의 성능을 제공합니다.

  • 자체: 알파 블렌딩을 사용하여 LOD 레벨 사이를 부드럽게 페이드합니다. 노드는 자체 가시성 범위의 한계에 도달하면 자동으로 페이드 아웃됩니다. 페이드 전환 거리는 가시성 범위 > 시작 여백**가시성 범위 > 끝 여백**에 의해 결정됩니다. 이 모드는 페이드 전환 중에 개체에 투명 렌더링을 강제하므로 성능에 영향을 줍니다.

  • 종속성: 알파 블렌딩을 사용하여 LOD 레벨 간을 부드럽게 페이드합니다. 노드는 자체 가시성 범위의 한계에 도달하면 종속성을 페이드인합니다. 페이드 전환 거리는 가시성 범위 > 시작 여백**가시성 범위 > 끝 여백**에 의해 결정됩니다. 이 모드는 페이드 전환 중에 개체에 투명 렌더링을 강제하므로 성능에 영향을 미칩니다. 이 모드는 :ref:`Visibility parent <doc_visibility_ranges_visibility_parent>`를 사용하는 계층적 LOD 시스템을 위한 것입니다. 비계층적 LOD를 수행하는 데 가시성 범위가 사용되는 경우 **Self**와 동일하게 작동합니다.

가시성 부모

가시성 상위 속성을 사용하면 :abbr:`HLOD(계층적 세부 수준)`을 더 쉽게 설정할 수 있습니다. 현재 가시성 범위 속성을 고려할 때 상위 요소가 표시되면 자식 노드를 자동으로 숨길 수 있습니다.

참고

가시성 상위 대상은 :ref:`class_GeometryInstance3D`에서 상속받아야 합니다.

이름에도 불구하고 가시성 상위 속성은 씬 트리에 있는 노드의 상위가 아닌 노드를 가리킬 수 있습니다. 그러나 **가시성 상위**를 자식 노드로 지정하는 것은 불가능합니다. 이렇게 하면 지원되지 않는 종속성 주기가 생성되기 때문입니다. 종속성 순환이 발생하면 출력 패널에 오류 메시지가 표시됩니다.

다음 씬 트리(모든 노드가 GeometryInstance3D에서 상속됨)를 고려하면 다음과 같습니다.

┖╴BatchOfHouses
    ┠╴House1
    ┠╴House2
    ┠╴House3
    ┖╴House4

이 예에서 BatchOfHouses*는 멀리서 볼 때 모든 자식 노드를 나타내도록 설계된 대형 메시입니다. *House1 ~ *House4*는 개별 주택을 나타내는 더 작은 MeshInstance3D입니다. 이 예에서 HLOD를 구성하려면 다음 두 가지만 구성하면 됩니다.

  • **가시성 범위 시작**을 `0.0`보다 큰 숫자로 설정하면 *BatchOfHouses*가 카메라에서 충분히 멀리 떨어져 있을 때만 표시됩니다. 이 거리 아래에는 *House1*부터 *House4*까지 표시되기를 원합니다.

  • House1*에서 *House4*까지 **Visibility Parent* 속성을 *BatchOfHouses*에 할당합니다.

이렇게 하면 *BatchOfHouses*의 **가시 범위 시작**과 *House1*의 **가시 범위 끝**을 *House4*로 조정할 필요가 없으므로 추가 조정을 더 쉽게 수행할 수 있습니다.

페이드 모드는 Visibility Parent 속성에 의해 자동으로 처리되므로 상위 노드가 완전히 페이드 아웃된 후에만 자식 노드가 숨겨집니다. 이는 눈에 보이는 팝업을 최소화하기 위해 수행됩니다. HLOD 설정에 따라 자체종속성 :ref:`페이드 모드 <doc_visibility_ranges_fade_mode>`을 모두 사용해 볼 수 있습니다.

참고

Visible 속성을 통해 숨겨진 노드는 기본적으로 가시성 종속성 트리에서 제거되므로 종속 인스턴스는 숨겨진 노드 또는 해당 조상을 고려하지 않습니다.

실제로 이는 Visible 상위 노드의 대상이 Visible 속성을 ``false``로 설정하여 숨겨진 경우 노드는 가시성 상위에 지정된 Visibility Range Begin 값에 따라 숨겨지지 않음을 의미합니다.

구성 팁

성능을 향상시키기 위해 멀리서 더 간단한 재료를 사용하십시오.

성능을 더욱 향상시키는 한 가지 방법은 원거리 LOD 메시에 더 간단한 머티리얼을 사용하는 것입니다. LOD 메시를 사용하면 렌더링해야 하는 정점 수가 줄어들지만 머티리얼의 픽셀당 셰이딩 로드는 동일하게 유지됩니다. 그러나 픽셀당 셰이딩 로드는 복잡한 3D 장면에서 GPU의 병목 현상을 일으키는 경우가 많습니다. GPU에서 이러한 셰이딩 로드를 줄이는 한 가지 방법은 시각적 차이가 크지 않을 때 더 간단한 재질을 사용하는 것입니다.

씬의 고유 재료 수를 늘리면 그 자체로 성능 비용이 발생하므로 그렇게 할 때 성능 향상을 주의 깊게 측정해야 합니다. 그럼에도 불구하고 원거리 LOD 메시에 더 간단한 머티리얼을 사용하면 필요한 픽셀당 계산 수가 줄어들기 때문에 여전히 순 성능 향상을 가져올 수 있습니다.

예를 들어, 멀리 떨어져 있는 LOD 메시에 사용되는 머티리얼에서는 다음과 같은 비용이 많이 드는 머티리얼 기능을 비활성화할 수 있습니다.

  • 일반 맵(특히 모바일 플랫폼)

  • 클리어코트

  • 비등방성

  • 높이

  • 서브서피스 산란

  • 조명 굽기

  • 굴절률

  • 근접 페이드

번역을 가져와서 구성하기

Godot는 현재 가시성 범위에 대해 알파 기반 페이딩만 지원합니다. 하지만 대신 다양한 LOD 레벨에 여러 가지 재질을 사용하여 디더링을 사용할 수 있습니다.

LOD 전환에 알파 블렌딩보다 디더링을 사용하면 두 가지 이점이 있습니다.

  • 알파 블렌딩에 비해 디더링 투명도가 렌더링 속도가 더 빠르므로 성능이 향상됩니다.

  • LOD 전환 중 :ref:`투명도 정렬 문제 <doc_3d_rendering_limitations_transparency_sorting>`으로 인한 시각적 결함이 없습니다.

디더링의 단점은 LOD 페이드 전환 중에 "노이즈가 있는" 패턴이 보인다는 것입니다. 이는 더 높은 뷰포트 해상도나 임시 안티앨리어싱이 활성화된 경우 눈에 띄지 않을 수 있습니다.

또한 BaseMaterial3D의 거리 페이드는 가까이 페이드 업 *또는 멀리 있을 때 페이드*만 지원하므로 이 설정은 설정의 일부로 두 개의 LOD와 함께 사용하는 것이 가장 좋습니다.

  • 여기서는 히스테리시스 또는 알파 페이드가 필요하지 않으므로 MeshInstance3D 노드 모두에서 Begin Margin**End Margin**이 ``0.0``로 설정되어 있는지 확인하세요.

  • 두 MeshInstance3D 노드에서 원하는 페이드 전환 거리만큼 감소 **시작**하고 동일한 거리만큼 증가 **끝**합니다. 이는 디더링 전환이 실제로 표시되는 데 필요합니다.

  • 가까이 표시되는 MeshInstance3D의 인스펙터에서 해당 재질을 편집합니다. 거리 페이드 모드를 **객체 디더**로 설정합니다. **최소 거리**를 공개 범위 **끝**과 동일한 값으로 설정합니다. **최대 거리**를 페이드 전환 거리를 동일한 값으로 설정합니다.

  • 멀리 표시된 MeshInstance3D의 재질을 인스펙터에서 편집합니다. 거리 페이드 모드를 **객체 디더**로 설정합니다. **최소 거리**를 공개 범위 **시작**과 동일한 값으로 설정합니다. **최대 거리**를 페이드 전환 거리를 더한 동일한 값으로 설정합니다.