Dela via


Fresnel-påverkan

Funktionen fresneleffektmaterial är en icke-fysiskt korrekt ad hoc-effekt. Funktionen baseras på den fysiska observationen av objekt som blir mer reflekterande i dessa vinklar. Själva fresnelreflektansen ingår redan fysiskt i PBR-materialmodellen som används i Azure Remote Rendering. Däremot är fresneleffekten materialfunktionen bara en additiv färgeffekt utan beroende av ljus eller himmelsmiljön.

Fresneleffekten ger berörda objekt en färgad glans runt kanterna. Information om effektanpassning och exempel på återgivningsresultat finns i följande avsnitt.

Kommentar

Fresnel-effekten kan inte tillämpas på punktmoln.

Aktivera fresnel-effekten

Om du vill använda funktionen fresnel-effekt måste den aktiveras på det aktuella materialet. Du kan aktivera det genom att ange FresnelEffect-biten av PbrMaterialFeaturesPBR-materialet. Samma mönster gäller för ColorMaterialFeatures och färgmaterialet. Se avsnittet kodexempel för en användningsdemonstration.

När den har aktiverats via API:et visas fresnel-effekten omedelbart. Som standard är glansen vit (1, 1, 1, 1) och har en exponent på 1. Du kan anpassa de här inställningarna med hjälp av parameteruppsättningarna nedan.

Anpassa effektens utseende

För närvarande kan fresneleffekten anpassas per material med hjälp av följande egenskaper:

Materialegenskap Type Förklaring
FresnelEffectColor Färg 4 Färgen som läggs till som mest när fresnel skiner. Alfakanalen ignoreras för närvarande.
FresnelEffectExponent flyttal Spridningen av fresnel skiner. Sträcker sig från 0,01 (fördelat på hela objektet) till 10 (endast de mest gracing vinklar).

I praktiken ser olika färg- och exponentinställningar ut så här:

Fresnel effect examples

Fresneleffektens exponent ökar gradvis från 1 till 10 för varje färgrad. Att göra det drar progressivt fresnelglansen till kanterna på de visade objekten. Fresnel-effekten påverkas inte heller av transparens, som du kan se i följande exempel:

Fresnel effect transparency examples

Som det visas är objekten på diagonalen helt transparenta, men fresnelglansen förblir. Effekten efterliknar fysiskt baserad fresnel i det avseendet, som också finns i dessa skärmbilder.

Kodexempel

Följande kodexempel visar aktivering och anpassning av fresneleffekten för både ett PBR-material och ett färgmaterial:

    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-dokumentation

Nästa steg