Изменить, как освещение затухает, используя свет падения в URP
Чтобы создать уникальный визуальный стиль в вашей сцене, вы можете изменить функцию падения света в URP для освещения в реальном времени и печеного освещения.
Этот пример заменяет функцию URP light falloff по умолчанию квадратичной функцией falloff, которая имеет другой визуальный стиль. Вы можете модифицировать функции, упомянутые на этой странице, для достижения других визуальных стилей. Функция квадратичного light falloff имеет поведение, аналогичное функции falloff во Встроенном Render Pipeline.
Подготовка исходного кода URP для модификации
Эта настройка требует модификации исходного кода URP. Инструкции см. в Модификация исходного кода URP.
Изменить свет падения для реального времени огней
Чтобы изменить поведение падения света для светильников реального времени:
-
Откройте файл HLSL:
Packages/com.unity.render-pipelines.universal/ShaderLibrary/RealtimeLights.hlsl -
Измените метод
DistanceAttenuation. Используйте следующий код:// The quadratic falloff function provides a visual style // similar to the Built-In Render Pipeline light falloff. float DistanceAttenuation(float distanceSqr, float2 distanceAndSpotAttenuation) { // Calculate the linear distance from the squared distance value. float distance = sqrt(distanceSqr); // Calculate the range of the light by taking the inverse square root of the attenuation parameter. float range = rsqrt(distanceAndSpotAttenuation.x); // Normalize the distance to a value between 0 and 1 (1 at the source, 0 at the max range). float distance01 = saturate(1.0f - (distance / range)); // Apply quadratic falloff. float lightAtten = pow(distance01, 2.0f); // Smooth the falloff across the entire range for a more gradual and natural fade. float smoothFactor = smoothstep(0.0f, 1.0f, distance01); lightAtten *= smoothFactor; return lightAtten; } -
Измените метод
AngleAttenuation. Используйте следующий код:float AngleAttenuation(float3 spotDirection, float3 lightDirection, float2 spotAttenuation) { // Compute the cosine of the angle between spotlight and surface. float SdotL = dot(spotDirection, lightDirection); // Linearly interpolate attenuation between the inner and the outer cone. float atten = saturate(SdotL * spotAttenuation.x + spotAttenuation.y); // Apply cubic smoothing for a gradual edge falloff. atten = atten * atten * (3.0f - 2.0f * atten); return atten; }
На следующей иллюстрации сравнивают по умолчанию URP свет падения, пользовательской функции свет падения в этом примере, и свет падения в Встроенный Render Pipeline.
Изменение светового потока для печеных огней
Чтобы убедиться, что внешний вид печеного освещения в вашем проекте соответствует внешнему виду освещения в реальном времени, измените световой падение печеных огней.
-
Откройте следующий файл:
Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs -
Изменить значение
lightData.falloffна FalloffType.Legacy:lightData.falloff = FalloffType.Legacy;
Значение FalloffType.Legacy использует квадратичное затухание, которое соответствует падению в реальном времени в этом примере. Вы можете использовать другие значения, чтобы соответствовать освещению в реальном времени в вашем проекте.
Для получения дополнительной информации об изменении функции падения света в печеном освещении см. Изменение расстояния затухания огней с падением