UDN
Search public documentation:

UsingDecalsKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 파티클과 이펙트 > 데칼 > 데칼 사용하기

데칼 사용하기


문서 변경내역: Dave Burke 작성. 홍성진 번역.

개요


데칼(decal) 시스템에 대한 참고서입니다. 콘텐츠 제작자를 대상으로는 데칼 머티리얼 제작법, 데칼을 레벨에 추가하는 법, 데칼을 조작해서 영향력을 조절하는 법 등에 대해 알아보겠습니다. 프로그래머를 대상으로는 데칼 시스템 아키텍스처에 대한 개요서가 되겠습니다.

데칼이란 무엇인가


데칼이란 씬의 표면 위에 머티리얼(질감)을 쏘는(project) 일종의 프리미티브 입니다. 데칼은 생성시 씬 지오메트리와 교차되도록 맞춰둔 볼륨을 지정합니다. 데칼 볼륨 안에 들어간 모든 표면 위에는 데칼 머티리얼을 쏴 줍니다. UE3 의 데칼은 한 번 만들면 변하지 않는다는 점에서 UE3 의 프로젝터와는 다릅니다. 다른 말로 데칼과 그것을 받는 표면 사이를 움직이는 액터에는 데칼 머티리얼을 쏘지 않는다는 뜻입니다. UE3 에서 진짜 빔 프로젝터같은 식은 LightFunctions 으로 이루어 내고 있습니다. (Lighting Reference KR 참고.) 데칼은 씬에 다양성을 추가하거나, 메시 인스턴싱을 감추거나, 이음새를 덮거나 하기에 좋습니다.

"스태틱" 데칼

"스태틱"(Static, 가만히 있는) 데칼은 언리얼 에디터에서 레벨에 놓은 데칼을 말합니다. 스태틱 데칼의 런타임 비용은 스태틱 메시와 거의 같습니다만, 데칼쪽이 폴리가 훨씬 적으면서 충돌하지도 않고 막지도 않으며 그림자를 드리우지도 않습니다.

"다이내믹" 데칼

"다이내믹"(Dynamic) 데칼은 게임플레이 도중 스폰되는 데칼로, 예를 들자면 무기에 맞은 효과 정도입니다. 게임에 스폰되는 데칼은 처음에 한 번 생성 비용이 들고, 그 이후의 프레임별 비용은 스태틱 데칼과 (드로 콜 뿐이니) 같습니다.

데칼 머티리얼


Decal Materials(데칼 머티리얼)은 데칼이 라이팅되는 방식 전용 셰이더 코드가 추가된 특수한 형태의 머티리얼입니다. 데칼을 일반 머티리얼에 할당할 수도 있지만, 그렇게 하면 데칼에 라이팅이 그르게 나옵니다. 맵을 리빌드하거나 맵 에러를 검사하거나 하면 머티리얼이 적합하지 않은 데칼이 통지될 것입니다.

머티리얼 인스턴스 체인은 데칼이 지원하기는 하나 단순한 머티리얼로만이며, 머티리얼 인스턴스가 데칼 머티리얼을 참조해야만 데칼에 라이팅이 바르게 먹습니다.

머티리얼과 데칼 머티리얼은 여러가지 이유로 확실히 구분지어야 합니다:

  1. 투명한 머티리얼을 사용하는 데칼은 포그에 관련해서 다른 투명 메시형과는 다르게 렌더됩니다.
  2. 라이팅된(lit) 머티리얼을 사용하는 데칼은 머티리얼 안에서 계산한 노멀을 데칼 탄젠트 프레임으로 변환(transform)해야 합니다.
  3. 데칼과 함께 사용되지 않는 셰이더(, 예를 들면 그림자, z-only, 속도 등)는 데칼 머티리얼에 대해서는 컴파일되지 않습니다. 즉 데칼이 아닌 메시(non-decal mesh)에 적용된 데칼 머티리얼은 바르게 그림자를 드리우거나, 모션 블러에 들어가거나 하지 않는다는 뜻입니다.

데칼 머티리얼 만들기

보통의 머티리얼과 마찬가지로 데칼 머티리얼은 콘텐츠 브라우저의 빈 곳에 우클릭한 후 새 DecalMaterial 을 선택하면 됩니다. 머티리얼에 새 이름과 대상 패키지를 지정해 주고 OK 를 누릅니다. 그러면 콘텐츠 브라우저에 데칼 머티리얼 오브젝트가 새로 생깁니다. 그 위에 더블클릭하면 머티리얼 에디터가 머티리얼을 편집할 수 있는 상태로 열립니다.

shot1.jpg

shot7.jpg

데칼을 레벨에 추가하기


데칼 만들기

씬에 데칼을 가장 쉽게 추가하는 방법은, 콘텐츠 브라우저에서 데칼 머티리얼을 선택한 다음 퍼스펙티브 뷰포트에서 'D' 키를 누르고 표면에 왼클릭하면 됩니다. 그러면 그 표면에 쏴지는 데칼이 생깁니다. 다른 방법으로는 보통의 우클릭 메뉴에서 액터 추가 옵션을 통해 데칼을 만들 수도 있지만, 그렇게 인스턴싱한 데칼의 위치와 방향은 수동으로 잡아줘야 합니다.

shot3.jpg

크기, 타일링, 오프셋 조절하기

데칼을 만들고 나면 트랜슬레이션과 로테이션 위젯을 사용하여 위치와 방향을 잡아주면 됩니다.

shot4.jpg

비균등 스케일 위젯으로 데칼 볼륨의 폭, 높이, 먼-평면(far-plane) 거리를 조절합니다.

데칼 머티리얼은 OffsetX, OffsetY, TileX, TileY 프로퍼티를 설정하여 타일링과 오프셋(이동)이 가능합니다. 이들 프로퍼티는 비균등 스케일 위젯에도 연결되어 있는데, 데칼 머티리얼의 비균등 스케일 위젯을 드래그할 때 Shift 키를 누르면 타일링이, Alt 키를 누르면 오프셋이 조절됩니다.

아래 이미지에서 보니, 넓은 타일링 데칼이 BSP 사이의 이음새를 덮어주고 있습니다.

shot8.jpg

받는 표면 조절하기

DecalFilter 프로퍼티 카테고리에는 데칼을 쏴줄 수 있는 표면을 조절하는 데 사용할 수 있는 프로퍼티 목록이 포함되어 있습니다. BSP, 스켈레탈 메시, 스태틱 메시, 터레인 등 어디에 데칼을 쏴줄 수 있는지 조절하는 체크박스가 있습니다.

아래 이미지에서 BSP 에는 쏘지 말라고 데칼에 설정해 놨기 때문에, 스태틱 메시에 있는 데칼 부분만 보이고 있습니다.

shot5.jpg

데칼에는 액터별로 쏴줄 수 있는 것을 조절할 수 있는 프로퍼티 Filter 와 FilterMode 도 있습니다. 아래 예제에서 보면 FilterMode = FM_Ignore 옵션으로 스태틱 메시가 추가되었는데, 그 스태틱 메시만 데칼이 무시한다는 뜻입니다.

shot6.jpg

프로그래머 대상


Decals Technical Guide KR 페이지를 참고하시기 바랍니다.

고민 해결


밉맵과 충돌(conflict)

데칼 텍스처에 밉맵 기능을 켜면 데칼 에지(가장자리) 주변에 부작용이 생길 수 있습니다:

decalbug.jpg

이 문제에 대한 자세한 설명과 그 회피 방법은 이렇습니다:

데칼 텍스처 좌표는 데칼 이미지 평면 위에 받는 지오메트리를 쏴서 계산합니다.

받는 지오메트리가 데칼 프러스텀에 대해 클리핑되(clipped, 잘리)면 (디폴트 행위), 데칼 프러스텀 외부는 필되(fill, 채워지)지 않으며, 모든 데칼 텍스처 좌표는 [0,1] 범위 안에 있게 됩니다.

데칼 컴포넌트를 터레인 위에 쏘고 있고 UDecalComponent::bNoClip (U 데칼 컴포넌트::클리핑 않음) 옵션이 참으로 설정된 경우, 데칼 지오메트리는 데칼 프러스텀에 대해 클리핑되지 않으며, 오히려 원래 메시의 버텍스를 '데칼 버텍스'로 사용합니다. 디폴트 방식과 비교했을때 'NoClip' 방식에 필(fill)이 추가되기는 하지만, 클리핑이 없어 관련되는 시간은 짧아집니다.

'NoClip' 접근법에서 주의할 점은, 데칼 이미지 평면 외부에 쏴 지는 버텍스는 음수값 텍스처 좌표를 사용하기에, 데칼 머티리얼에 사용되는 텍스처의 어드레스 모드에 클램프(clamp, 일정 범위로 제한)된 텍스처 어드레싱을 사용해 줘야 한다는 점입니다.

줄무늬(streaking)가 생기는 이유는, 더 낮은 레벨의 밉을 계산하는 데 사용된 필터링이 0 이 아닌 색을 에지 텍셀로 새 나가게 만들고, 텍스처의 클램프된 어드레싱 때문에 그 텍셀이 다른 파편(fragment)에 걸쳐 버리기 때문입니다. 이 줄무늬를 고치려면, 데칼 머티리얼 안의 텍스처에 대한 텍스처 프로퍼티를 열고, 텍스처 상의 bPreserveBorderR/G/B/A (테두리 보존) 플랙을 설정하여 더 낮은 밉에서도 투명한 테두리 픽셀이 보존되게 하면 됩니다.

렌더링 안됨

데칼이 에디터나 게임에서 보이지 않을 때 점검해 볼 사항은:

  • 뷰포트가 '라이팅포함'(Lit) 뷰모드로 설정되었는지 (데칼은 라이팅이 없으면 표시되지 않습니다).
  • 데칼이 받는 것과 같은 레벨에 있는지 (아니면 여러 개의 레벨에 있는 받는 것에 쏴 줘야 하는 경우 각 레벨마다 복제했는지).
  • 받는 메시 컴포넌트에서 bAcceptsStaticDecals (스태틱 데칼 수용) 옵션이 참으로 설정되었는지.
  • 데칼에 bProjectsOnBSP/StaticMeshes/등의 옵션이 적합하게 설정되었는지.
  • 데칼의 필터 안에 아무것도 없는지.

Z-파이팅

데칼은 부착된 지오메트리와 z-파이팅(누가 위인지 놓고 벌이는 집안 싸움)을 피하기 위해 뎁스 바이어스를 사용하며, 서로간에 z-파이팅을 피하기 위해서 뎁스에 쓰지(write) 않습니다. 대부분의 경우 데칼로 인해 벌어진 집안 싸움은 뎁스 바이어스로 중재(tweak)하여 해결할 수 있습니다. 배치된 데칼의 뎁스 바이어스는 인스턴스별로 설정 가능합니다. 보통 이 방법이 게임의 다른 부분에 영향을 끼치지 않기에 최선의 방법입니다. 배치된 다이내믹 데칼(피, 탄흔 등)의 경우엔 글로벌 디폴트를 조정합니다. DefaultProperties 에 설정되어 있는 DecalComponent.uc 의 DepthBias 프로퍼티 입니다.