Condividi tramite


Effetto Fresnel

La caratteristica materiale dell'effetto fresnel è un effetto ad hoc non fisicamente corretto. La caratteristica si basa sull'osservazione fisica degli oggetti che diventano più riflettenti in questi angoli. La riflessione fresnel stessa è già incorporata fisicamente nel modello di materiale PBR usato in Azure Rendering remoto. Al contrario, la caratteristica materiale dell'effetto fresnel è solo un effetto di colore aggiuntivo senza dipendenza dalle luci o dall'ambiente del cielo.

L'effetto fresnel dà agli oggetti interessati una brillantezza colorata intorno ai bordi. Le informazioni sulla personalizzazione degli effetti e sugli esempi dei risultati del rendering sono disponibili nelle sezioni seguenti.

Nota

L'effetto fresnel non può essere applicato alle nuvole di punti.

Abilitazione dell'effetto fresnel

Per usare la funzionalità di effetto fresnel, deve essere abilitata sui materiali in questione. È possibile abilitarla impostando il bit FresnelEffect dei PbrMaterialFeatures nel materiale PBR. Lo stesso motivo si applica ai ColorMaterialFeatures e al materiale Color. Vedere la sezione degli esempi di codice per una dimostrazione sull'utilizzo.

Dopo l'abilitazione tramite l'API, l'effetto fresnel sarà immediatamente visibile. Per impostazione predefinita, la brillantezza sarà bianca (1, 1, 1, 1) e avrà un esponente di 1. È possibile personalizzare queste impostazioni usando i setter dei parametri seguenti.

Personalizzazione dell'aspetto dell'effetto

Attualmente, l'effetto fresnel può essere personalizzato per ogni materiale usando le proprietà seguenti:

Proprietà Material Tipo Spiegazione
FresnelEffectColor Colore4 Il colore che viene aggiunto al massimo come brilla la fresnel. Il canale alfa è attualmente ignorato.
FresnelEffectExponent float La diffusione del fresnel brilla. Varia da 0,01 (sparsi su tutto l'oggetto) a 10 (solo gli angoli più gracing).

In pratica, diverse impostazioni di colore e esponente avranno un aspetto simile al seguente:

Fresnel effect examples

L'esponente dell'effetto fresnel viene progressivamente aumentato da 1 a 10 per ogni riga di colore. In questo modo si tira progressivamente il fresnel brilla ai bordi degli oggetti visualizzati. L'effetto fresnel non è influenzato anche dalla trasparenza, come si può vedere nell'esempio seguente:

Fresnel effect transparency examples

Come illustrato, gli oggetti sulla diagonale sono completamente trasparenti, ma brillare fresnel rimane. L'effetto simula fresnel basato fisicamente in questo senso, che è presente anche in questi screenshot.

Esempi di codice

Gli esempi di codice seguenti illustrano l'abilitazione e la personalizzazione dell'effetto fresnel per un materiale PBR e un materiale 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);
    }
}

Documentazione sull'API

Passaggi successivi