うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】ライトが強いと白飛びするのをなんとかしてみる【Deferred】

【環境】 Unity2021.3.16f1, URP12.1.8, Deferred

以前 は Forward で確認をしましたが、今回は Deferred でライトの白飛びをなんとかしてみます

Deferred では Forward とはライトの処理箇所が異なっており、com.unity.render-pipelines.universal/Shaders/Utils/Deferred.hlsl でライトの計算をしています

Light UnityLightFromPunctualLightDataAndWorldSpacePosition(PunctualLightData punctualLightData, float3 positionWS, half4 shadowMask, int shadowLightIndex, bool materialFlagReceiveShadowsOff)
{
    ・・・
    // full-float precision required on some platforms
    float attenuation = DistanceAttenuation(distanceSqr, punctualLightData.attenuation.xy) * AngleAttenuation(punctualLightData.spotDirection.xyz, lightDirection, punctualLightData.attenuation.zw);
    ・・・

今回はライトの減衰を制御して強すぎないようにしてみます

    float attenuation = DistanceAttenuation(distanceSqr, punctualLightData.attenuation.xy) * AngleAttenuation(punctualLightData.spotDirection.xyz, lightDirection, punctualLightData.attenuation.zw);
+++    attenuation = min(attenuation, 0.01);

これで白飛びしないで明るくさせることができました