This is the documentation for Enlighten.
6.5.4. メッシュごとのプローブ ライティング
メッシュごとのプローブ ライティングは、各オブジェクトのバウンディング ボックスの中心に補間された 1 つのイラディアンス値を提供します。メッシュのすべてのピクセルは、この単一のイラディアンス サンプルによりライティングされます。
この近似により、有効な間接光の解像度をメッシュあたり 1 つに限定し、小さなメッシュに対して妥当なライティング精度を提供します。
この手法のランタイム コストは、使用するオブジェクトの数に応じて増加します。数千のオブジェクトを有する非常に大きなシーンでは、非同期ラジオシティ更新にかかる時間が大幅に延びる可能性があります。
オブジェクト数を最小限に抑えるには、近接する小さなメッシュのグループを単一のオブジェクトに合成します。
高レベル ランタイムによるメッシュごとのプローブ ライティングは、プローブ LODに対応しません
オブジェクトの管理
高レベル ランタイムを使用して、この手法を使ったライティングの対象となるメッシュを表す動的オブジェクトを管理します。
新しい動的オブジェクトを追加するには、IUpdateManager::AllocateDynamicObject を呼び出してオブジェクトを割り当て、その後 IUpdateManager::EnqueueAddDynamicObject を呼び出します。
Enlighten::DynamicObject desc; desc.m_Id = objectGuid; desc.m_LocalBoundingBox = objectLocalBounds; Enlighten::BaseDynamicObject* object = updateManager->AllocateDynamicObject(desc); updateManager->EnqueueAddDynamicObject(object);
オブジェクトを追加した後プロパティ セッター BaseDynamicObject::SetTransform を呼び出し、オブジェクトにワールド トランスフォームを設定します。
フレームごとに、オブジェクトが前のフレームから移動していた場合は、BaseDynamicObject::SetTransform を再度呼び出してワールド トランスフォームを更新します。
SH 係数を取得するには、IUpdateManager::GetDynamicObjectShCoeff を呼び出します。
IUpdateManager::GetDynamicObjectShCoeff は、オブジェクトが追加されてから、最初の非同期更新が完了するまで、0 出力を生成します。
Geo::SHCoeff redCoeffs, greenCoeffs, blueCoeffs; updateManager->GetDynamicObjectShCoeff(objectGuid, redCoeffs, greenCoeffs, blueCoeffs);
オブジェクトを削除するには、IUpdateManager::EnqueueRemoveDynamicObject を呼び出します。
updateManager->EnqueueRemoveDynamicObject(objectGuid);
間接光のレンダリング
メッシュを描画する際、ピクセル シェーダーで SH 係数を使用して、ピクセル法線の方向でSH ライティングを評価します。
ライト リーク
オブジェクトが、ライティングがまったく異なる 2 つのエリアを分割する壁に近い場合、プローブ ライティングが壁を通して漏れることがあります。これは、ライティングが壁の逆側のプローブから補間されているために生じます。
このようなライト リークを防ぐために Enlighten ではデフォルトで、プリコンピュートされたプローブ可視性データを動的オブジェクトに対して使用します。
このため、オブジェクトが動いたときにプローブ ライティングが突然変化することがあります。