お世話になっております。
表題のとおりなのですがスタティックライトを使用してライトベイクを行うと、インダイレクトライトキャッシュに対して直接光成分が格納されてしまい、キャラクターがそのILCを拾った際発光するような現象が起きてしまい困っています。
何か対処法などありましたら教えて頂けましたら幸いです。
よろしくお願いいたします。
お世話になっております。
表題のとおりなのですがスタティックライトを使用してライトベイクを行うと、インダイレクトライトキャッシュに対して直接光成分が格納されてしまい、キャラクターがそのILCを拾った際発光するような現象が起きてしまい困っています。
何か対処法などありましたら教えて頂けましたら幸いです。
よろしくお願いいたします。
お世話になっております。
本件ですが、残念ながら現在のエディタ機能では対応ができません。
ただし、10行少しのコードの追加で対応可能ですので、そちらの機能について説明させていただきます。
やったことは、ライトのアトリビュートのLightmass項目に"Remove Direct Lighting on Light Volume for Static Light"を追加しました。
こちらがOffのままですと、従来の挙動通りILCが直接光を含みます。
ですが、こちらをOnにすることで、ILCにのみ直接光を含まなくさせることができます。
実際の変更箇所ですが。。。こちらはUE4.12で試しておりますがそれより下のバージョンでも同様に動くと思われます。そちらのバージョンが違う可能性もあるため、ソースコードの行数などは記載いたしません。
まず、Editor内部でどのライトが省かれるかを判定するために、アトリビュートを追加いたします。
Engine\Source\Runtime\Engine\Classes\Engine\EngineTypes.hの struct FLightmassLightSettingsにそのフラグを追加
//こちらを追加しました。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Lightmass)
bool bRemoveDirectLightingOnLightVolumeForStaticLight;
FLightmassLightSettings()
: IndirectLightingSaturation(1.0f)
, ShadowExponent(2.0f)
, bUseAreaShadowsForStationaryLight(false)
, bRemoveDirectLightingOnLightVolumeForStaticLight(false) // こちらにもデフォルトの挙動を追加してください。
{ }
enum EDawnLightFlags
{
// maps to ULightComponent::CastShadows
GI_LIGHT_CASTSHADOWS = 0x00000001,
...
GI_LIGHT_REMOVE_DIRECT_LIGHTING_ON_LIGHT_VOLUME = 0x00001000, //今回はこのフラグを追加いたしました。
};
次に、ライトコンポーネントがLightmassに渡される際に、1)の設定を確認し2)のフラグを立てるようにします。
Engine\Source\Editor\UnrealEd\Private\Lightmass\Lightmass.cpp
void Copy( const ULightComponent* In, Lightmass::FLightData& Out )
{
Copy((const ULightComponentBase*)In, Out);
..........
if (In->GetLightmassSettings().bUseAreaShadowsForStationaryLight)
{
Out.LightFlags |= Lightmass::GI_LIGHT_USE_AREA_SHADOWS_FOR_SEPARATE_SHADOW_FACTOR;
}
// こちらを追加いたしました。
if (In->GetLightmassSettings().bRemoveDirectLightingOnLightVolumeForStaticLight)
{
Out.LightFlags |= Lightmass::GI_LIGHT_REMOVE_DIRECT_LIGHTING_ON_LIGHT_VOLUME;
}
最後に、ILCがダイレクトライティングを計算するコードで内で、2)のフラグを確認しフラグが立っている場合は直接光を計算しないようにします。 (それは、CalculateApproximateDirectLightingという関数内で行われます。)
Engine\Source\Programs\UnrealLightmass\Private\Lighting\LightingSystem.inl
template
void FStaticLightingSystem::CalculateApproximateDirectLighting(
const FStaticLightingVertex& Vertex,
float SampleRadius,
float LightSampleFraction,
bool bCompositeAllLights,
bool bCalculateForIndirectLighting,
bool bDebugThisSample,
FStaticLightingMappingContext& MappingContext,
TGatheredLightSample& OutStaticDirectLighting,
TGatheredLightSample& OutToggleableDirectLighting,
float& OutToggleableDirectionalLightShadowing) const
{
if (bDebugThisSample)
{
int asdf = 0;
}
for (int32 LightIndex = 0; LightIndex < Lights.Num(); LightIndex++)
{
const FLight* Light = Lights[LightIndex];
// こちらを追加いたしました。
if (Light->LightFlags & GI_LIGHT_REMOVE_DIRECT_LIGHTING_ON_LIGHT_VOLUME)
{
continue;
}
....
以上となります。
これらの修正を行い、ライトマスとエディタを再ビルドすることにより対応が可能となります。
ご返答ありがとうございます!
こちら4.10では該当コードが見当たらないようで、4.11にアプデ次第試させて頂きます。
ありがとうございました!