본문으로 건너뛰기

레이어 (Layers)

레이어 개요

레이어를 사용하면 애플리케이션의 렌더 루프를 사용자 정의할 수 있습니다. 레이어를 사용하여 일부 고급 렌더링 기능을 구현할 수 있습니다. 예를 들어:

  • 메시가 렌더링되는 순서를 수정
  • 카메라가 일부 메시만 렌더링하도록 설정
  • 어떤 조명이 어떤 메시에 영향을 미치는지 설정

OasisW 애플리케이션은 항상 존재하는 기본 레이어 세트로 생성됩니다. 자신만의 레이어를 만들고 특정 요구사항에 맞게 순서를 재정렬할 수 있습니다.

기본적으로 레이어는 렌더링할 메시의 목록입니다. 각 레이어는 두 개의 서브 레이어로 나뉩니다: 불투명(Opaque)과 투명(Transparent). 메시가 레이어에 추가될 때 레이어는 메시의 머티리얼이 투명하게 렌더링되어야 하는지 여부에 따라 두 서브 레이어 중 하나에 저장합니다. 이는 투명 서브 레이어가 불투명 서브 레이어와 다르게 정렬되는 경우가 많기 때문입니다.

렌더링 순서

메시가 렌더링되는 순서를 결정하는 세 가지 요소가 있습니다.

카메라 우선순위

카메라의 우선순위는 메시가 렌더링되는 순서를 제어하는 주요 요소입니다. 각 카메라에는 우선순위가 할당되며, 우선순위 값이 작은 카메라가 먼저 렌더링됩니다.

각 카메라에는 설정된 레이어 목록도 있으며, 이는 카메라가 렌더링하는 레이어를 제어합니다. 그 순서는 다음 섹션에서 설명합니다.

Camera Layers

레이어 구성

다음은 애플리케이션의 레이어 순서입니다. 각 애플리케이션에는 this.app.scene.layers로 애플리케이션에서 사용할 수 있는 pc.LayerComposition 객체가 포함되어 있습니다. 레이어 구성은 모든 서브 레이어의 순서를 결정합니다. 순서는 레이어가 아닌 서브 레이어를 기반으로 하므로, 예를 들어 모든 불투명 서브 레이어를 먼저 렌더링한 다음 모든 투명 서브 레이어를 렌더링할 수 있습니다.

참고: 월드 레이어 이후에 렌더링되는 레이어 내부에 모델 컴포넌트를 배치해도 모델이 월드 레이어의 모든 것 위에 렌더링되지 않습니다! 모델을 렌더링하는 데 사용되는 표준 머티리얼에는 depthTest라는 속성이 있습니다. 이것이 true(기본값)일 때 모델의 각 픽셀이 렌더링되기 전에 GPU는 이 픽셀 앞에 다른 것이 있는지 테스트합니다. 해당 픽셀이 이전 레이어에서 그려졌더라도 깊이 테스트는 보이는 픽셀만 그려지도록 보장합니다. 메시를 렌더링할 때 카메라로부터의 거리를 무시하려면 머티리얼에서 depthTest를 비활성화하세요.

정렬 모드

각 서브 레이어에는 정렬 모드가 있습니다. 매 프레임마다 서브 레이어의 메시는 해당 정렬 모드에 따라 정렬됩니다. 이는 서브 레이어가 렌더링될 때 메시가 렌더링되는 순서를 결정합니다.

  • 머티리얼 / 메시 (pc.SORTMODE_MATERIALMESH) - 이것은 불투명 서브 레이어의 기본 모드입니다. 메시 인스턴스는 머티리얼과 메시 간의 전환을 최소화하여 렌더링 성능을 향상시키도록 정렬됩니다.
  • 뒤에서 앞으로 (pc.SORTMODE_BACK2FRONT) - 이것은 투명 서브 레이어의 기본 모드입니다. 메시 인스턴스는 뒤에서 앞으로 정렬됩니다. 이는 서로 다른 깊이에서 많은 반투명 객체를 올바르게 렌더링하는 방법으로, 하나가 다른 것 위에 블렌딩됩니다.
  • 앞에서 뒤로 (pc.SORTMODE_FRONT2BACK) - 메시 인스턴스는 앞에서 뒤로 정렬됩니다. GPU와 씬에 따라 이 옵션은 오버드로우 감소로 인해 pc.SORTMODE_MATERIALMESH보다 더 나은 성능을 제공할 수 있습니다.
  • 수동 (pc.SORTMODE_MANUAL) - 이것은 UI 또는 2D 레이어의 기본 모드입니다. 메시 인스턴스는 MeshInstance.drawOrder 속성을 기반으로 정렬됩니다. Element 컴포넌트와 Sprite 컴포넌트는 이 정렬 모드를 사용하는 레이어에 배치되어야 합니다.
  • 없음 (pc.SORTMODE_NONE) - 정렬이 적용되지 않습니다. 메시 인스턴스는 레이어에 추가된 순서와 동일한 순서로 렌더링됩니다.

이러한 정렬 모드 외에도 MeshInstance.drawBucket 속성은 레이어 내에서 MeshInstances의 추가적이고 더 거친 수준의 정렬을 제공합니다. 0부터 255(기본값 127)까지의 이 정수 값은 메시 렌더링의 주요 정렬 키 역할을 합니다. 메시는 drawBucket에 따라 오름차순으로 정렬되고(낮은 값이 먼저 렌더링됨), 그 다음 레이어의 선택된 정렬 모드에 따라 각 버킷 내에서 추가로 정렬됩니다. drawBucket 설정은 메시 인스턴스가 정렬 모드가 pc.SORTMODE_BACK2FRONT, pc.SORTMODE_FRONT2BACK, 또는 pc.SORTMODE_MATERIALMESH로 설정된 서브 레이어에 추가될 때만 효과적입니다. 이를 통해 머티리얼이나 깊이에 관계없이 특정 그룹이 다른 그룹보다 먼저 또는 나중에 렌더링되도록 강제하여 해당 특정 정렬 모드 내에서 전체 렌더링 순서에 대한 세밀한 제어를 제공합니다.

기본 레이어

OasisW 애플리케이션은 기본 레이어 세트로 생성됩니다. 일부 엔진 기능이 제대로 작동하지 않을 수 있으므로 이러한 레이어를 그대로 두어야 합니다. 기본 순서는 다음과 같습니다:

Default Layers

  1. World (Opaque) - 투명하지 않은 컴포넌트와 대부분의 불투명 컴포넌트 메시를 렌더링하는 데 사용됩니다.
  2. Depth (Opaque) - 씬의 색상 또는 깊이 버퍼를 캡처하는 데 사용됩니다. 깊이 레이어를 참조하세요.
  3. Skybox (Opaque) - 스카이박스를 렌더링하는 데 사용됩니다. 오버드로우를 줄이기 위해 World (Opaque) 이후에 렌더링됩니다.
  4. World (Transparent) - 투명한 컴포넌트와 기타 투명 컴포넌트 메시를 렌더링하는 데 사용됩니다.
  5. Immediate (Opaque) - 즉시 모드 메시를 렌더링하는 데 사용됩니다. 예: app.renderLine().
  6. Immediate (Transparent) - 즉시 모드 메시를 렌더링하는 데 사용됩니다. 예: app.renderLine().
  7. UI (Transparent) - Element 컴포넌트를 렌더링하는 데 사용됩니다. 모든 Element 컴포넌트는 투명하므로 Opaque 서브 레이어는 사용되지 않습니다.

사용자 정의 레이어 사용

기본 레이어는 기존 엔진 기능을 구현하는 데 훌륭하지만, 진정한 힘은 콘텐츠가 렌더링되는 순서를 사용자 정의하기 위해 자신만의 레이어를 만드는 데서 나옵니다.

레이어 생성

레이어는 에디터의 Settings 섹션에 있는 LAYERS 패널에서 제어됩니다.

Creating a layer

레이어 섹션에서 생성하려는 레이어의 이름을 입력하고 Add Layer를 클릭하세요. 새 레이어가 버튼 아래의 사용 가능한 레이어 목록에 나타납니다.

정렬 모드 설정

Edit a layer

레이어 목록에서 각 서브 레이어의 정렬 모드를 선택할 수 있습니다. 레이어를 확장하고 드롭다운 메뉴에서 정렬 모드를 선택하세요.

레이어 순서 선택

Add layer

ADD SUBLAYER를 선택하고 추가하려는 서브 레이어를 선택하여 레이어 구성에 서브 레이어를 추가하세요. 레이어가 렌더 순서 목록에 있으면 각 서브 레이어를 위아래로 드래그하여 순서를 재정렬할 수 있습니다.

레이어에서 엔티티 렌더링

메시를 렌더링하는 컴포넌트는 모두 메시가 어떤 레이어와 서브 레이어에 추가되어야 하는지 결정하는 데 사용되는 layers 속성을 가집니다. 이러한 컴포넌트에는 Model, Element, Sprite, Particle System이 포함됩니다. Camera와 Light 컴포넌트도 각각 렌더링하고 조명을 비추는 레이어를 결정하는 layers 속성을 가집니다.

Layer Components

참고: 모델이 Test Layer에 할당되었습니다. 렌더링되려면 카메라가 레이어 목록에 Test Layer를 포함해야 합니다. 조명을 받으려면 조명도 레이어 목록에 Test Layer를 포함해야 합니다.

씬에는 일반적으로 메시를 렌더링하는 많은 엔티티가 포함됩니다. 각각이 정확히 하나의 레이어에 있도록 하는 것이 권장됩니다. 대부분의 경우 이들은 World 레이어에 있지만, 더 많은 제어를 위해 Terrain, Buildings, Characters와 같은 레이어에 할당할 수 있습니다.

새 씬은 기본적으로 단일 카메라를 포함하며, 이는 많은 애플리케이션에서 필요한 전부입니다. 추가 카메라는 씬의 서로 다른 카메라 간 전환, PIP(Picture in Picture) 또는 스플릿 스크린 렌더링, 또는 씬을 텍스처로 렌더링하는 경우에 유용합니다.

추가 카메라를 추가할 때 다음 단계를 권장합니다:

  1. 렌더링 순서를 제어하기 위해 새 카메라와 기존 카메라의 우선순위를 설정하세요.
  2. 새로 생성된 카메라의 레이어를 설정하여 어떤 레이어를 렌더링하는지 지정하세요. 예를 들어, 위에서 아래로 보는 맵 카메라를 렌더링하고 Terrain과 Building 레이어만 포함하고 Characters는 포함하지 않을 수 있습니다.
  3. 카메라가 텍스처로 렌더링하는 경우 스크립트를 사용하여 카메라의 renderTarget 속성에 렌더 타겟을 할당하세요.