This is the documentation for Enlighten.

7.1.2.5. 静的破壊

ジオメトリを透明と指定することにより、実行時にサーフェスの透過度を調整できます。これは物理ベースの透過ではありませんが、破壊を作成するか、ゲームプレイのエフェクトに対する反応として実装することにより、サーフェスの破壊をエミュレーションするために使用できます。

透過を機能させるには、Enlighten でプリコンピュート時にいくつかの追加データを作成する必要があります。これはデフォルトで実行されますが、既定のシステムで実行時に透過を機能させる必要がない場合は、以下の paramset パラメーターによりオフにできます。

computeClusterProbeSampleOffsetData="false"

このフラグが有効になった状態でプリコンピュートが実行されると、InputWorkspace オブジェクト内にオプションの RadDataBlock が生成されます。

class InputWorkspace
{
public:
...
/// 透過に使用されるプリコンピュートされたオプションのデータ
RadDataBlock m_ClusterProbeSampleOffsetData;
};

InputWorkspace オブジェクトにデータが存在している場合、以下の関数を使用してランタイム透過ワークスペースを作成できます。

Geo::u32 GEO_CALL CalcTransparencyWorkspaceSize(const Enlighten::InputWorkspace* inputWorkspace, Geo::s32 numInterpolants, PrecisionHint::Value precision = PrecisionHint::DEFAULT_PRECISION);
Enlighten::TransparencyWorkspace* GEO_CALL CreateTransparencyWorkspace(void* memory, const Enlighten::InputWorkspace* inputWorkspace, Geo::s32 numInterpolants, PrecisionHint::Value precision=PrecisionHint::DEFAULT_PRECISION);

注: API では精度の指定が可能ですが、現在は無視されています。

透過は透明なサーフェスの反対側にサンプル ポイントを作成すると機能します。配置されるこれらのサンプル ポイントとサーフェスの間の距離は、透明な壁またはオブジェクトのおおよその厚さである必要があります。プリコンピュート パイプラインの CreateSystemDusters ステージの間にオフセットが自動的に生成されます。

実行時にサーフェスの透過度を調整するには、 TransparencyBuffer を更新します。また、ピクセルごとの透過は InitialiseTransparencyBufferFromTexture で、サンプルごとの場合は InitialiseTransparencyBufferFromColoursPerPoint で指定できます。

DoIndirectInputLighting() の呼び出しの前に、フレームごとに 1 度、透過ワークスペースをプローブセットの新しい値を使って更新する必要があります。これは以下を呼び出して実施します。

void GEO_CALL UpdateTransparencyWorkspace( const InputWorkspace* inputWorkspace, Enlighten::TransparencyWorkspace *transparencyWorkspace, const InterpolationInputSet* interpolationInputs, Geo::s32 numInterpolationInputs, bool recomputeInterpolants);

プローブ セットが入力のリストに追加またはリストから削除された場合、recomputeInterpolants を true に設定して UpdateTransparencyWorkspace() 関数を呼び出す必要があります。ただし、ライティングのみが変更されている場合は、recomputeInterpolants を false に設定できます。

ワークスペースの透過とオフセットをリセットしたい場合、以下の関数を使用し、transparencyValueoffset については 0.f を渡します。

bool GEO_CALL SetTransparency(const Enlighten::InputWorkspace* inputWorkspace, Enlighten::TransparencyWorkspace *transparencyWorkspace, float transparencyValue);
bool GEO_CALL SetSamplePositions( const Enlighten::InputWorkspace* inputWorkspace, Enlighten::TransparencyWorkspace *transparencyWorkspace, float offset, bool forceUpdate );

これらの関数の詳細については、InputWorkspace.h をご覧ください。

次に、透過ワークスペースを Enlighten::IndirectInputLightingParameters クラスでパラメーターとして設定する必要があります。

透過ワークスペースを更新するコード例

//透過ワークスペースを更新します
if (system->m_TransparencyWorkspace && m_InterpolationInputSets.GetSize() && lightInputsChanged)
{
Enlighten::UpdateTransparencyWorkspace( system->m_InputWorkspace,
system->m_TransparencyWorkspace,
m_InterpolationInputSets.GetArray(),
m_InterpolationInputSets.GetSize(),
system->m_TransparencyInterpolantsNeedUpdate || requiresProbeInterpolationUpdate);
system->m_TransparencyInterpolantsNeedUpdate = false;
}