Поделиться через


Эффект Френеля

Функция эффекта Френеля для материалов проявляется как физически недостоверный специальный эффект. Эта функция основана на физическом наблюдении за объектами, которые лучше отражают окружение под этими углами. Само по себе отражение Френеля уже физически включено в модель материалов PBR, используемую в Удаленной отрисовке Azure. Функция материала с эффектом Френеля, с другой стороны, — это просто дополнительный цветовой эффект, не зависящий от освещения или среды неба.

Эффект Френеля придает объектам цветное сияние по краям. Сведения о настройке эффектов и примеры результатов отрисовки можно найти в следующих разделах.

Примечание.

Эффект fresnel нельзя применять к точкам облаков.

Включение эффект Френеля

Чтобы использовать функцию эффекта Френеля, ее необходимо включить в материалах. Ее можно включить, настроив бит FresnelEffect для PbrMaterialFeatures в материале PBR. Тот же шаблон применяется к ColorMaterialFeatures и цветовым материалам. Пример использования см. в разделе с примерами кода.

После включения через API эффект fresnel сразу будет видимым. По умолчанию сияние будет белым (1, 1, 1, 1), а экспонента будет равна 1. Эти параметры можно настроить с помощью методов задания параметров ниже.

Настройка внешнего вида эффекта

В настоящее время эффект Френеля можно настроить для каждого материала, используя следующие свойства.

Свойство материала Тип Описание
FresnelEffectColor Color4 Максимальный цвет, который добавляется в качестве сияния Френеля. Альфа-канал в данный момент игнорируется.
FresnelEffectExponent с плавающей запятой Распространение сияния Френеля. Диапазон от 0,01 (распространение по всему объекту) до 10 (только видимые углы).

На практике различные параметры цвета и экспоненты будут выглядеть следующим образом.

Fresnel effect examples

Экспонента эффекта Френеля постепенно увеличивается от 1 до 10 для каждой строки цвета. Это позволяет постепенно смещать сияние Френеля к краям просматриваемых объектов. На эффект Френеля также не влияет прозрачность, как видно в следующем примере.

Fresnel effect transparency examples

Как видно, объекты по диагонали полностью прозрачны, но сияние Френеля сохраняется. Этот результат имитирует физический эффект Френеля в этом отношении, что также представлено на этих снимках экрана.

Примеры кода

В следующих примерах кода показано, как включить и настроить эффект Френеля для материала PBR и цветового материала.

    void SetFresnelEffect(RenderingSession session, Material material)
    {
        if (material.MaterialSubType == MaterialType.Pbr)
        {
            var pbrMaterial = material as PbrMaterial;
            pbrMaterial.PbrFlags |= PbrMaterialFeatures.FresnelEffect;
            pbrMaterial.FresnelEffectColor = new Color4(1.0f, 0.5f, 0.1f, 1.0f);
            pbrMaterial.FresnelEffectExponent = 3.141592f;
        }
        else if (material.MaterialSubType == MaterialType.Color)
        {
            var colorMaterial = material as ColorMaterial;
            colorMaterial.ColorFlags |= ColorMaterialFeatures.FresnelEffect;
            colorMaterial.FresnelEffectColor = new Color4(0.25f, 1.0f, 0.25f, 1.0f);
            colorMaterial.FresnelEffectExponent = 7.654321f;
        }
    }
void SetFresnelEffect(ApiHandle<RenderingSession> session, ApiHandle<Material> material)
{
    if (material->GetMaterialSubType() == MaterialType::Pbr)
    {
        auto pbrMaterial = material.as<PbrMaterial>();
        auto featureFlags = PbrMaterialFeatures((int32_t)pbrMaterial->GetPbrFlags() | (int32_t)PbrMaterialFeatures::FresnelEffect);
        pbrMaterial->SetPbrFlags(featureFlags);
        pbrMaterial->SetFresnelEffectColor(Color4{ 1.f, 0.5f, 0.1f, 1.f });
        pbrMaterial->SetFresnelEffectExponent(3.141592f);

    }
    else if (material->GetMaterialSubType() == MaterialType::Color)
    {
        auto colorMaterial = material.as<ColorMaterial>();
        auto featureFlags = ColorMaterialFeatures((int32_t)colorMaterial->GetColorFlags() | (int32_t)ColorMaterialFeatures::FresnelEffect);
        colorMaterial->SetColorFlags(featureFlags);
        colorMaterial->SetFresnelEffectColor(Color4{ 0.25f, 1.f, 0.25f, 1.f });
        colorMaterial->SetFresnelEffectExponent(7.654321f);
    }
}

Документация по API

Следующие шаги