UDN
Search public documentation:

DecalsTechnicalGuideCH
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 主页 > 粒子 & 效果 > 贴花 > 贴花系统技术指南

贴花系统技术指南


概述


该页面会为程序人员提供有关贴花系统和使用贴花的技术详细信息。

DecalComponent 成员变量


以下是 DecalComponent 成员变量的简要描述…

材质

DecalMaterial 属性代表了要在这个贴花上使用的材质。一个必须最终通向 DecalMaterial 的 MaterialInstance 链。

Size(尺寸)

表面上的贴花的尺寸(切线/副法线 方向):

  • Width/Height(宽度/高度)

Planes(平面)

贴花的大小:

  • NearPlane/FarPlane(近平面/远平面)

Tiling(平铺块)

贴花的 UV 平铺块乘数及偏移量:

  • TileX/TileY
  • OffsetX/OffsetY

Hit Information(碰撞信息)

关于贴花平截头体的位置及方位的信息,在渲染数据计算及贴花调试渲染中使用:

  • HitLocation
  • HitNormal
  • HitTangent
  • HitBinormal

Clipping(剪辑)

bNoClip 属性默认为 FAlSE。如果为 TRUE,当计算贴花几何体时使用 "NoClip" 代码路径。这个代码路径不会相对于贴花平截头体对潜在的接受者三角形执行软件剪辑,这是以在贴花渲染过程中的额外的填充为代价的。另外,在 "NoClip" 的贴花材质中使用的贴图的地址模式必须设置为 TA_Clamp,并且使得它们的外侧的边周围的透明边界要足够地宽,从而可以幸免于 mipmapping(贴图分级细分)。

注意,在带光照的顶点的静态网格物体上的带光照的贴花隐含了 bNoClip 的值。

Static(静态)

仅对于通过编辑器放置到关卡中的贴花的 bStaticDecal 属性是 TRUE。可以通过 ADecalActor 的 defaultproperties 代码块将 bStaticDecal 设置为 TURE。

Receivers(接受者)

HitComponent 默认为 NULL。如果它不是 NULL,那么当计算贴花几何体时,仅这个组件被认为是可能的接受者。设置这个属性排除项必须和其它所有可能的接收者取交集,但是这可能会导致意想不到的问题,因为贴花将会仅投射到特定的组件上(这是不好的,比如对于火箭爆炸来说)。

组件

生成这个贴花的几何体及其相关渲染数据的组件列表。 ReceiverRenderData 数组将总是相同的长度,并且 RenderData 的第 i 个元素是 Receiver 的第 i 个元素的数据。这种布局允许接收者 附加/脱离 那些独立于其他内容单独存在的贴花。

偏移

当两个或多个贴花重叠时,可以使用 DepthBias 和 SlopeScaleDepthBias 参数来偏移贴花的深度来控制它渲染在其他贴花的上面还是下面。

Filtering(过滤)

正如上面所描述的,Filter(过滤器)包含了一系列的要过滤的 actor,FilterMode 描述了 Filter (FM_Ignore) 的 actor 是否应该被忽略或者是否应该只将它作为受到这个贴花影响的 actor。默认的值是 FM_None,意味着不考虑过滤器

Projection Flags(投射标记)

这些标记控制了贴花是否对其进行投射:

  • bProjectonBackfaces - 三角形的背面
  • bProjectOnBSP - BSP
  • bProjectOnStaticMeshes - 静态网格物体
  • bProjectOnSkeletalMeshes - 骨架网格物体
  • bProjectOnTerrain – 地形

通过脚本创建贴花


贴花一般是通过调用 DecalManager 的 >SpawnDecal 成员函数来创建的。基本的过程是使用贴花的尺寸、方位、材质以及如何计算贴花的暗示信息来调用 SpawnDecal 函数。

想象一个武器类,它包含 SpawnHitDecal 成员函数,当响应游戏中武器撞击到某个东西的行为时调用这个函数。

这个函数的代码可能如下所示:

// A class containing state/behaviour shared by all weapons in your game. (一个包含了您的游戏中所有武器所共享的 状态/行为 的类。)
class BaseWeaponClassForYourGame extends Weapon

// ...

// Generates a decal based on a weapon hit; called by functions like eg. SpawnExplosionEffects. (基于武器碰撞生成贴花;由类似于 SpawnExplosionEffects 这样的函数调用。)
simulated function SpawnHitDecal(ImpactInfo Impact)
{
    local DecalComponent         DecalTemplate;

    // Consult eg. the physical material system stored in the impact info(参照存储在碰撞信息中的物理材质系统)
    // to get decal parameters appropriate for this surface/weapon pairing.(来获得符合这个 表面/武器 配对的贴花参数。)
    DecalTemplate = Impact.GetDecalTemplate( this );

    // Create a decal based on the decal template.(基于贴花模板创建一个贴花)
    WorldInfo.MyDecalManager.SpawnDecal( DecalTemplate.DecalMaterial,                // UMaterialInstance used for this decal.(为这个贴花使用的 UMaterialInstance。)
                              Impact.HitLocation,                         // Decal spawned at the hit location.(在碰撞位置产生的贴花。)
                              rotator(-Impact.HitNormal),                 // Orient decal into the surface.(将贴花放到表面上。)
                              DecalTemplate.Width, DecalTemplate.Height,  // Decal size in tangent/binormal directions. (贴花在 切线/副法线 方向的尺寸。)
                              DecalTemplate.Thickness,                    // Decal size in normal direction.(在法线方向上贴花的尺寸。)
                              DecalTemplate.bNoClip,                      // If TRUE, use "NoClip" codepath.(如果为 TRUE,则使用 "NoClip" 代码路径。)
                              FRand() * 360,                              // random rotation(随机旋转)
                              Impact.HitInfo.HitComponent );               // If non-NULL, consider this component only.(如果为非 NULL,则只考虑这个组件。)
}

贴花的生命周期管理


单例模式的 DecalManager Actor,可以通过 WorldInfo->MyDecalManager 来对其进行访问,它管理了临时的贴花。它保存了当前在世界中的所有的贴花列表。基本的实现是简单地检测每个贴花的可配置的生命周期,当时间过期时分离它,但是您可以很容易重写这个类(通过 WorldInfo 中的可配置的 DecalManagerClassPath)来实现不同的行为。

DecalManager 也可以缓存它创建的 DecalComponents。当一个贴花的生命周期结束时,它将会返回到缓冲池中,以后的函数 SpawnDecal() 调用时可以再次使用该组件。这样通过仅保持在最差的情形下保留尽可能多的 DecalComponent 而不是频繁地创建并丢弃对象的操作,可以最小化对象的消耗及垃圾回收所花费的时间。

性能监测


相关统计数据

引擎统计数据组(通过在游戏控制台中输入 stat engine 来查看)包含了两个和贴花相关的项:DecalDrawCalls,贴花描画调用函数的总数量;DecalTriangles,传入到渲染器的贴花三角形的总数量。同时,游戏统计数据组 ( stat game ) 包含了 DecalTime、监测贴花管理器所花费的时间及贴花的生命周期政策。

相关显示标志

有两个显示标记来管理贴花渲染。 SHOW DECALINFO 启用了贴花的调试信息的渲染,包括贴花平截头体及它们的切线基础。 SHOW DECALS 全局地切换贴花是否描画到视口中,包括任何使用 DECALINFO 启用的贴花的调试信息渲染。

全局启用/禁用贴花

引擎中的 bStaticDecalsEnabledbDynamicDecalsEnabled 配置成员变量可以用于 启用/禁用静态及动态贴花的所有方面(几何体计算、场景附加及渲染等)。这两个值默认都为 TRUE ,意味着完全地启用贴花。

使用贴花


关于在关卡中使用编辑器工具放置及操作贴花的更多信息,请参照使用贴花页面。