UDN
Search public documentation:

DevelopmentKitGemsRenderingOccludedActorsKR
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 홈 > UDK 젬 > 가려진(occluded) 액터 렌더하기
UE3 홈 > 머티리얼과 텍스처 > 가려진(occluded) 액터 렌더하기

가려진(occluded) 액터 렌더하기


문서 변경내역: James Tan 작성. 홍성진 번역.
UDK 2011년 3월 버전으로 최종 테스팅, PC 호환

개요


3인칭 게임에서 가끔 플레이어의 시야를 재미난 것으로 막는 것이 시각적으로 괜찮을 때가 있습니다. 그러나 플레이어가 블로킹 픽셀을 통해 봐야 할 필요가 있을 때는 문제가 될 수 있습니다. 이 젬에서는 가려진(occluded) 액터를 렌더하는 데 있어 간단하고 퍼포먼스 친화적인 방법을 선보이도록 하겠습니다.

OccludedPawnScreenshot.jpg

머티리얼


이 방법은 전경에 렌더된 메시의 불투명도 변경을 위해 깊이 검사를 합니다. 명확히 하고자, 렌더링 파이프라인의 역할을 단계별로 나열해 보겠습니다.

  1. 노멀별로 액터의 메시를 렌더합니다.
  2. 맨 위에 액터 메시의 가려진 버전을 각 픽셀 단위로 렌더합니다.
    1. 기존 픽셀 깊이에 대해 새 픽셀 깊이를 검사합니다.
    2. 깊이 차이가 일정한 값 이상이면, 계속해서 가려진 픽셀을 렌더합니다.
    3. 아니면 픽셀을 렌더하지 않습니다.

OccludedPawnMaterialNodeSetup.jpg

머티리얼 프로퍼티

머티리얼의 Scene Depth (씬 뎁스) 노드에 접근하려면, 머티리얼은 Translucent (반투명)이어야 합니다. 퍼포먼스를 낫게 하려면 머티리얼을 Unlit (라이팅제외)로 설정하십시오.

OccludedPawnMaterialProperties.jpg

관련 토픽

예제


폰에 오클루전 이펙트를 추가하는 법에 대한 예제입니다. 물론 스태틱 메시 액터같은 기타 액터에도 사용할 수 있습니다. 그러기 위한 유일한 조건이라면, 위치, 로테이션, 스케일 측면에서 가려진 메시가 보통은 보일 메시의 것과 일치하기만 하면 됩니다.

OccludedPawn.uc
class OccludedPawn extends UTPawn;

var(Pawn) const SkeletalMeshComponent OccludedMesh;

simulated function SetMeshVisibility(bool bVisible)
{
  Super.SetMeshVisibility(bVisible);

  if (OccludedMesh != None)
  {
    OccludedMesh.SetOwnerNoSee(!bVisible);
  }
}

simulated function SetCharacterMeshInfo(SkeletalMesh SkelMesh, MaterialInterface HeadMaterial, MaterialInterface BodyMaterial)
{
  Super.SetCharacterMeshInfo(SkelMesh, HeadMaterial, BodyMaterial);

  if (OccludedMesh != None)
  {
    OccludedMesh.SetSkeletalMesh(SkelMesh);
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=OPawnSkeletalMeshComponent
    Materials(0)=Material'OccludedPawnContent.OccludedMaterial'
    Materials(1)=Material'OccludedPawnContent.OccludedMaterial'
    DepthPriorityGroup=SDPG_Foreground // 전경 레이어에 가려진 스켈레탈 메시를 렌더
    ShadowParent=WPawnSkeletalMeshComponent
    ParentAnimComponent=WPawnSkeletalMeshComponent
    bCacheAnimSequenceNodes=false
    AlwaysLoadOnClient=true
    AlwaysLoadOnServer=true
    bOwnerNoSee=true
    CastShadow=false // 그림자는 드리울 필요 없음
    BlockRigidBody=true
    bUpdateSkelWhenNotRendered=false
    bIgnoreControllersWhenNotRendered=true
    bUpdateKinematicBonesFromAnimation=true
    bCastDynamicShadow=false // 그림자는 드리울 필요 없음
    RBChannel=RBCC_Untitled3
    RBCollideWithChannels=(Untitled3=true)
    LightEnvironment=MyLightEnvironment
    bOverrideAttachmentOwnerVisibility=true
    bAcceptsDynamicDecals=false
    bHasPhysicsAssetInstance=true
    TickGroup=TG_PreAsyncWork
    MinDistFactorForKinematicUpdate=0.2f
    bChartDistanceFactor=true
    RBDominanceGroup=20
    MotionBlurScale=0.f
    bUseOnePassLightingOnTranslucency=true
    bPerBoneMotionBlur=true
  End Object
  OccludedMesh=OPawnSkeletalMeshComponent
  Components.Add(OPawnSkeletalMeshComponent)

  CamOffset=(X=16.0,Y=64.0,Z=-52.0)
}

이 게임 인포 서브클래스는 위에서 만든 OccludedPawn (가려진 폰) 클래스를 스폰하는 데만 필요합니다.

OccludedGameInfo.uc
class OccludedGameInfo extends UTDeathmatch;

defaultproperties
{
  DefaultPawnClass=class'OccludedPawn'
}

관련 토픽

한계


이 방법의 한계는 오클루전 검사법에 있습니다. 깊이 차이만 검사하지 무엇이 픽셀을 렌더하는지는 검사하지 않기 때문에, 오클루전이 계산 결과가 많이 잘못될 수가 있습니다.

이 한계를 극복하기 가장 좋은 방법은, 가급적 깊이 차가 커 지도록 레벨 지오메트리를 변경하는 것입니다.

내려받기