Использовать косвенное освещение в пользовательском шейдере URP
Чтобы использовать косвенное освещение в пользовательском шейдере Universal Render Pipeline (URP), выполните следующие действия:
- Добавьте строку
#includeвнутрь блокаHLSLPROGRAMв вашем файле шейдера. Обратитесь к разделам на этой странице для конкретных путей файлов включения. - Используйте любой из методов, описанных в следующих разделах.
Используйте отраженные зонды в пользовательском шейдере URP
Для использования зондов отражения или skybox, используйте следующую строку #include:
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/GlobalIllumination.hlsl"
| Метод | Синтаксис | Описание |
|---|---|---|
GlossyEnvironmentReflection |
half3 GlossyEnvironmentReflection(half3 reflectVector, float3 positionWS, half perceptualRoughness, half occlusion, float2 normalizedScreenSpaceUV) |
Функция поддерживает смешивание и. Аргумент perceptualRoughness выбирает уровень mip образованной текстуры. Чем выше значение, тем более размытыми выглядят отражения.Аргумент occlusion — это коэффициент затухания отражения.Аргумент normalizedScreenSpaceUV — это нормализованное положение фрагмента в экранном пространстве. |
Функция GlossyEnvironmentReflection имеет следующую простую перегрузку, которая не поддерживает смешивание:
half3 GlossyEnvironmentReflection(half3 reflectVector, half perceptualRoughness, half occlusion)
Объемы адаптивного зонда образца
Чтобы взять пробу из Адаптативных Томов Пробоотборника (APV), используйте следующую строку #include:
#include "Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.hlsl"
| Метод | Синтаксис | Описание |
|---|---|---|
EvaluateAdaptiveProbeVolume |
void EvaluateAdaptiveProbeVolume(in float3 posWS, in float3 normalWS, in float3 viewDir, in float2 positionSS, in uint renderingLayer, out float3 bakeDiffuseLighting) |
Выполняет выборку освещения из Адаптивные тома зонда. Аргумент positionSS задаёт позицию рендерируемого фрагмента в экранном пространстве.Аргумент renderingLayer — это маска слоёв рендеринга. |
Световые зонды для образцов
Для отбора проб из световых зондов используется следующая строка #include:
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/AmbientProbe.hlsl"
| Метод | Синтаксис | Описание |
|---|---|---|
SampleSH |
real3 SampleSH(real3 normalWS) |
Образец световые зонды. |
Пример
Следующий код шейдера URP вычисляет диффузный и зеркальный окружающий свет с помощью функции GlossyEnvironmentReflection.
float3 CustomLightingAmbient(float3 BaseColor,
float3 NormalWS,
float Metallic,
float Smoothness,
float Reflectance,
float AmbientOcclusion,
float PositionWS,
float2 screenspaceUV,
float3 ViewDirWS)
{
// Diffuse ambient lighting.
// Sample the sky probe with high roughness and use a normal vector instead of
// a reflection vector to approximate ambient light
float3 DiffuseAmbient = GlossyEnvironmentReflection(NormalWS, PositionWS, 1, 1, screenspaceUV);
// If the surface is metallic, set ambient to zero, otherwise multiply by BaseColor
DiffuseAmbient *= lerp(BaseColor, float3(0,0,0), Metallic);
// Specular ambient lighting - reflections
// Surfaces are more reflective at glancing angles. Compute the fresnel value for reflectance.
float Fresnel = pow((1 - dot(NormalWS, ViewDirWS)), 5);
// Reflectance is 100% at the glancing angle
Reflectance = lerp(Reflectance, 1, Fresnel);
// If the object is metal, use the base color for reflectance instead.
float3 ReflectionColor = lerp(float3(Reflectance, Reflectance, Reflectance), BaseColor, Metallic);
// Compute the reflection vector and use it to sample the sky probe for reflections.
float3 ReflectionVector = reflect(-ViewDirWS, NormalWS);
float3 SpecularAmbient = GlossyEnvironmentReflection(ReflectionVector, PositionWS, 1 - Smoothness, 1, screenspaceUV);
return (DiffuseAmbient + SpecularAmbient) * AmbientOcclusion;
}
Пример узла настраиваемой функции графа шейдера
Shader Graph Примеры функций содержит примеры индивидуальных моделей освещения.
Чтобы узнать, как использовать функцию GlossyEnvironmentReflection в узле пользовательской функции:
В примерной сцене откройте граф шейдера CustomLightingSimple.
Перейдите к подграфу SampleReflectionProbes.
-
Проверьте узел URPReflectionProbe. В узле содержится код HLSL, использующий функцию
GlossyEnvironmentReflection:#ifdef SHADERGRAPH_PREVIEW reflection = float3(0,0,0); #else reflection = GlossyEnvironmentReflection(reflectVector, positionWS, roughness, 1.0h, screenspaceUV); #endif