Udostępnij za pośrednictwem


Efekt Fresnela

Cecha materiału efektu fresnel jest niezwiązany fizycznie, ad hoc efekt. Ta funkcja opiera się na fizycznej obserwacji obiektów, które stają się bardziej odbijające pod tymi kątami. Sama refleksja Fresnel jest już fizycznie włączona do modelu materiału PBR używanego w usłudze Azure Remote Rendering. Natomiast cecha materiału efektu fresnel jest po prostu efektem koloru addytywnego bez zależności od świateł ani środowiska nieba.

Efekt fresnel daje dotkniętym obiektom kolorowy blask wokół ich krawędzi. Informacje o dostosowywaniu efektu i przykładach wyników renderowania można znaleźć w poniższych sekcjach.

Uwaga

Nie można zastosować efektu fresnel do chmur punktowych.

Włączanie efektu fresnel

Aby można było korzystać z funkcji efektu fresnel, należy ją włączyć na owych materiałach. Można ją włączyć, ustawiając bit FresnelEffect pbrMaterialFeatures na materiale PBR. Ten sam wzorzec dotyczy elementu ColorMaterialFeatures i materiału Color. Zobacz sekcję przykłady kodu, aby zapoznać się z pokazem użycia.

Po włączeniu za pośrednictwem interfejsu API efekt fresnel będzie natychmiast widoczny. Domyślnie blask będzie biały (1, 1, 1, 1) i ma wykładnik 1. Te ustawienia można dostosować przy użyciu poniższych zestawów parametrów.

Dostosowywanie wyglądu efektu

Obecnie efekt fresnel można dostosować na materiał przy użyciu następujących właściwości:

Właściwość materiału Type Wyjaśnienie
FresnelEffectColor Kolor4 Kolor, który jest dodawany najwyżej jak fresnel świecić. Kanał alfa jest obecnie ignorowany.
FresnelEffectExponent liczba zmiennoprzecinkowa Rozprzestrzenianie się fresnel świeci. Zakresy od 0,01 (rozłożone na cały obiekt) do 10 (tylko najbardziej kąty gracingu).

W praktyce różne ustawienia kolorów i wykładnika będą wyglądać następująco:

Fresnel effect examples

Wykładnik efektu fresnel jest stopniowo zwiększany z 1 do 10 dla każdego wiersza kolorów. W ten sposób stopniowo ściąga fresnel świecić na krawędzie oglądanych obiektów. Efekt fresnel nie ma również wpływu na przezroczystość, jak widać w poniższym przykładzie:

Fresnel effect transparency examples

Jak pokazano, obiekty po przekątnej są w pełni przezroczyste, ale blask fresnel pozostaje. Efekt naśladuje fizycznie oparty fresnel w tym względzie, który jest również obecny na tych zrzutach ekranu.

Przykłady kodu

W poniższych przykładach kodu pokazano włączanie i dostosowywanie efektu fresnel zarówno dla materiału PBR, jak i materiału color:

    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);
    }
}

Dokumentacja interfejsu API

Następne kroki