UDN
Search public documentation:

DecalsTechnicalGuideKR
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) 시스템과 그 사용법을 기술적인 관점에서 살펴 보겠습니다.

DecalComponent 멤버 변수


다음은 DecalComponent 멤버 변수에 대한 간략 설명입니다...

머티리얼

DecalMaterial 프로퍼티는 이 데칼에 사용할 머티리얼을 나타냅니다. 결국 DecalMaterial 로 이어지는 MaterialInstance 체인입니다.

크기

(탄젠트/바이노멀 방향) 표면상의 데칼 크기입니다:

  • Width/Height

평면 (Plane)

데칼의 크기입니다:

  • NearPlane/FarPlane

타일링

데칼 UV 에 대한 타일링 멀티플라이어와 오프셋입니다:

  • TileX/TileY
  • OffsetX/OffsetY

적중 정보

데칼 프러스텀 위치와 방향에 대한 정보로, 렌더 데이터 계산 도중이나 데칼 디버그 렌더링 용으로도 사용됩니다:

  • HitLocation
  • HitNormal
  • HitTangent
  • HitBinormal

클리핑

bNoClip 프로퍼티 디폴트는 FALSE 입니다. TRUE 가 되면 데칼 지오메트리를 계산할 때 "NoClip" 코드패쓰를 사용합니다. 이 코드패쓰는 데칼 프러스텀에 대해 (데칼을) 리시버가 될 수도 있는 트라이앵클을 소프트웨어적으로 클리핑하지 않습니다. 대신 데칼 렌더링 도중에 필(fill) 비용이 추가되지요. 게다가 "NoClip" 데칼 머티리얼에 사용된 텍스처는 그 어드레스 모드를 TA_Clamp 로 설정하고 에지 주변에 투명 테두리를 충분히 확보해야 밉매핑에도 부작용 없이 살아남을 수 있습니다.

bNoClip 은 버텍스-라이팅된(lit) 스태틱 메시상의 라이팅된 데칼용이라는 점, 참고하십시오.

스태틱

bStaticDecal 프로퍼티는 에디터를 통해 레벨에 놓은 데칼에 대해서만 TRUE 입니다. bStaticDecal 은 ADecalActor 의 defaultproperties 블록에서 TRUE 설정됩니다..

리시버

HitComponent 디폴트는 NULL 입니다. NULL 이 아닌 경우, 데칼 지오메트리 계산시 이 컴포넌트만을 리시버로 간주합니다. 이 프로퍼티를 설정하면 모든 리시버에 대해 교차되지 않도록 할 수 있습니다만, 데칼은 지정된 컴포넌트에만 비춰질 것이기에 (로켓 폭발같은 경우엔 안좋겠죠) 바람직하지 못한 결과가 날 수 있습니다.

컴포넌트

이 데칼에 대한 지오메트리와 거기에 연관된 렌더 데이터를 생성한 컴포넌트 목록입니다. ReceiverRenderData 배열은 항상 길이가 같으며, RenderData 의 i 번째 항목은 Receiver i 에 대한 데이터입니다. 이러한 레이아웃을 통해 리시버를 다른 데칼에 독립적으로 붙였다 떼었다 할 수 있습니다.

바이어스

둘 이상의 데칼이 겹칠 때 어느 하나를 다른 것 위나 아래에 렌더되도록 조정하기 위해서는 데칼의 깊이를 바이어스하(치우치게 만드)는데, 그럴 때 DepthBias 와 SlopeScaleDepthBias 파라미터를 사용하면 됩니다.

필터링

위에 설명한 대로 Filter 에는 필터링할 액터 목록이 담기며, FilterMode 는 이 데칼이 Filter 목록에 있는 액터를 무시할 것인지(FM_Ignore) / 그것에만 영향을 끼칠 것인지(FM_Affect) 를 결정합니다. 디폴트 값은 FM_None 인데, Filter 를 참고하지 않는다는 뜻입니다.

프로젝션 플랙

이 플랙은 데칼을 비출지 말지 결정합니다:

  • bProjectonBackfaces - 트라이앵글 뒷면
  • bProjectOnBSP - BSP
  • bProjectOnStaticMeshes - 스태틱 메시
  • bProjectOnSkeletalMeshes - 스켈레탈 메시
  • bProjectOnTerrain - 터레인

스크립트에서 데칼 만들기


데칼은 전형적으로 DecalManager 의 >SpawnDecal 멤버 함수를 호출하여 만듭니다. 기본적인 프로세스는 그저 SpawnDecal 에다 데칼의 크기, 방향, 머티리얼, 데칼을 어떻게 계산할지에 대한 힌트를 덧붙여 호출하는 것입니다.

게임에서 무기로 무언가를 맞혔을 때, 그에 반응해서 호출되는 SpawnHitDecal 멤버 함수가 담긴 웨폰 클래스가 있다 상상해 봅시다.

그 함수에 대한 코드는 이와 같을 것입니다:

// 게임 내 모든 무기에 공유되는 상태/행위를 담는 클래스
class BaseWeaponClassForYourGame extends Weapon

// ...

// 무기 적중에 따라 데칼 생성, SpawnExplosionEffects 같은 함수에 의해 호출.
simulated function SpawnHitDecal(ImpactInfo Impact)
{
    local DecalComponent         DecalTemplate;

    // 임팩트 정보에 저장된, 이를테면 피지컬 머티리얼 시스템 같은 것을 참고하여
    // 이 표면/무기 쌍에 적합한 데칼 파라미터를 구함.
    DecalTemplate = Impact.GetDecalTemplate( this );

    // 데칼 템플릿을 기반으로 데칼을 생성.
    WorldInfo.MyDecalManager.SpawnDecal( DecalTemplate.DecalMaterial,     // 이 데칼에 사용된 UMaterialInstance.
                              Impact.HitLocation,                         // 적중 위치에 스폰된 데칼.
                              rotator(-Impact.HitNormal),                 // 데칼을 표면 속으로 오리엔테이션.
                              DecalTemplate.Width, DecalTemplate.Height,  // 탄젠트/바이노멀 방향 데칼 크기.
                              DecalTemplate.Thickness,                    // 노멀 방향 데칼 크기.
                              DecalTemplate.bNoClip,                      // 참이면 "NoClip" 코드패쓰 사용.
                              FRand() * 360,                              // 랜덤 로테이션
                              Impact.HitInfo.HitComponent );              // NULL 이 아니면 이 컴포넌트만 고려.
}

데칼 수명 관리


단 하나, WorldInfo->MyDecalManager 를 통해 접근할 수 있는 DecalManager Actor 만이 임시 데칼을 관리합니다. 현재 월드에 있는 모든 데칼 목록을 유지합니다. 기본 구현은 단지 각 데칼에 대해 환경설정가능한 수명을 세고 있다가(tick down) 수명이 다하면 떼어(detach) 버리는 것입니다만, 다른 방식으로 구현하려면 이 클래스를 (WorldInfo 에 있는 환경설정가능 DecalManagerClassPath 를 통해) 쉽게 덮어쓸 수 있습니다.

DecalManager 는 생성하는 DecalComponents 를 풀(pool)에 모아 놓기도 합니다. 데칼의 수명이 다하면 풀로 보낸 다음, SpawnDecal() 이 호출되면 그 컴포넌트를 재사용합니다. 오브젝트를 계속해서 만들었다 버렸다하는 대신 최악의 경우에 필요한 DecalComponents 수만큼만 확보하여, 오브젝트 부하와 가비지 컬렉션 시간을 최소화시킵니다.

퍼포먼스 모니터링


관련 통계

Engine (게임내 콘솔에 stat engine 을 입력하면 볼 수 있는) 통계 그룹에는 데칼에 관련된 항목이 둘 있습니다: DecalDrawCalls 는 데칼 드로 콜 총 횟수이며, DecalTriangles 는 렌더러에 전달된 데칼 트라이앵글 총 갯수입니다. 또한 Game (stat game) 통계 그룹에는 DecalTime, 데칼 매니저와 데칼 수명 정책을 틱하는 데 소요된 총 시간이 표시됩니다.

관련 표시 플랙

데칼 렌더링을 관장하는 표시(show) 플랙은 둘 있습니다. SHOW DECALINFO 는 데칼 디버그 정보를 렌더링해 주며, 여기에는 데칼 프러스텀과 그 탄젠트 베이스도 포함됩니다. SHOW DECALS 는 데칼을 뷰포트에 그릴지를 글로벌하게 토글하는 것으로, 여기에는 DECALINFO 를 통해 켜진 데칼 디버그 렌더링도 포함됩니다.

데칼 글로벌하게 끄고/켜기

Engine 의 bStaticDecalsEnabled (스태틱 데칼 켜짐)과 bDynamicDecalsEnabled (다이내믹 데칼 켜짐) 컨픽 멤버 변수는 스태틱/다이내믹 데칼의 (지오메트리 계산이나 씬 부착과 렌더링 등) 모든 면을 끄고/켜는 데 사용됩니다. 두 변수 다 디폴트는 TRUE, 즉 데칼은 모두 켠다는 뜻입니다.

데칼 사용하기


에디터 툴을 사용하여 레벨에 데칼을 놓고 조작하는 법에 대한 정보는, Using Decals KR 페이지를 참고하시기 바랍니다.