UDN
Search public documentation:

DevelopmentKitGemsRenderingOccludedActorsCH
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 主页 > 虚幻开发工具包精华文章 > 渲染遮挡的 Actor
UE3 主页 > 材质 & 贴图 > 渲染遮挡的 Actor

渲染遮挡的 Actor


最后一次测试是在2011年3月份的UDK版本上进行的。
可以与 PC 兼容

概述


在第三人称游戏中,有时它可以使用某些有趣的东西在外观上阻挡玩家的视线。但是,在玩家事实上需要可以透过阻挡的像素查看时,它可能会引发问题。这篇说明文章将会显示一个简单好用的方法渲染遮挡的 actors。

OccludedPawnScreenshot.jpg

材质


这个方法可以使用深度检测更改前景渲染的网格物体的不透明度。为了清楚起见,下面是渲染通道所进行的步骤列表。

  1. 根据法线渲染 actor 的网格物体
  2. 渲染顶部 actor 网格物体的遮挡版本;根据像素进行渲染
    1. 根据现有像素深度检查新的像素深度
    2. 如果深度差在某个值之上,那么继续渲染这个遮挡的像素
    3. 否则,不渲染这个像素

OccludedPawnMaterialNodeSetup.jpg

材质属性

为了能够访问这个材质中的 Scene Depth(场景深度)节点,该材质必须是 Translucent(半透明物体)。将这个材质设置为 Unlit 可以帮助提高性能。

OccludedPawnMaterialProperties.jpg

相关主题

示例


这是一个关于如何将遮挡效果添加到一个 pawn 的示例。它当然可以用于其他 actor,例如,静态网格物体 actor。唯一的条件是遮挡的网格物体必须与正常情况下见到的网格物体的位置、旋转和缩放程度都匹配。

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'
}

相关主题

限制


这个方法的局限性就是它检查遮挡的方式。只需通过比较深度差异,而不需要检查渲染像素的网格物体,这种方法通常可以错误地执行很多遮挡。

克服这种局限性的最好方法是更改关卡几何体,确保这里有足够大的深度差。

下载


  • 下载这篇说明中使用的源代码和内容。(OccludedPawn.zip)