Fresnelův efekt

Funkce materiálu fresnelového efektu je ne fyzicky správný ad hoc efekt. Funkce je založená na fyzickém pozorování objektů, které se v těchto úhlech stávají reflexnější. Fresnel reflectance je již fyzicky začleněn do modelu materiálu PBR používaného ve službě Azure Remote Rendering. Naproti tomu funkce materiálu fresnelového efektu je pouze doplňkový barevný efekt bez závislosti na světelách nebo prostředí oblohy.

Fresnelový efekt dává ovlivněným objektům barevný lesk kolem jejich okrajů. Informace o přizpůsobení efektu a příkladech výsledků vykreslování najdete v následujících částech.

Poznámka:

Fresnelový efekt nelze použít pro bodové mraky.

Povolení efektu fresnel

Chcete-li použít funkci fresnelového efektu, musí být povolena na dotčených materiálech. Můžete ho povolit nastavením fresnelEffect bitu PbrMaterialFeatures na materiál PBR. Stejný vzor platí pro ColorMaterialFeatures a materiál Color. Ukázku použití najdete v části s ukázkami kódu.

Po povolení prostřednictvím rozhraní API se efekt fresnel okamžitě zobrazí. Ve výchozím nastavení bude lesk bílý (1, 1, 1, 1) a má exponent čísla 1. Tato nastavení můžete přizpůsobit pomocí níže uvedených nastavení setter parametrů.

Přizpůsobení vzhledu efektu

V současné době lze fresnel efekt přizpůsobit na materiál pomocí následujících vlastností:

Material – vlastnost Type Vysvětlení
FresnelEffectColor Color4 Barva, která se přidá nejvíce jako fresnel lesk. Alfa kanál se v současné době ignoruje.
FresnelEffectExponent float (číslo s plovoucí řádovou čárkou) Šíření fresnelu svítí. Pohybuje se od 0,01 (rozložené po celý objekt) na 10 (pouze nejvíce úhlů).

V praxi budou různá nastavení barev a exponentů vypadat takto:

Fresnel effect examples

Exponent fresnelového efektu se postupně zvyšuje z 1 na 10 pro každý řádek barev. Tím se postupně vytáhne fresnel lesk na okraje zobrazených objektů. Fresnel efekt je také nedotčen průhledností, jak vidíte v následujícím příkladu:

Fresnel effect transparency examples

Jak je znázorněno, objekty na diagonálu jsou plně průhledné, ale fresnel svítí. Efekt napodobuje fyzicky založené fresnel v tomto ohledu, který se nachází také na těchto snímcích obrazovky.

Ukázky kódu

Následující ukázky kódu ukazují povolení a přizpůsobení fresnelového efektu pro materiál PBR i barevný materiál:

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

Dokumentace k rozhraní API

Další kroky