Partager via


Effet Fresnel

La fonctionnalité de l’effet Fresnel sur les matériaux correspond à un effet ad hoc, non correct physiquement. La fonctionnalité est basée sur l’observation physique des objets qui deviennent plus réfléchissants à ces angles. Le principe de réflectance de Fresnel est déjà incorporé physiquement dans le modèle de matériau PBR utilisé dans Azure Remote Rendering. En revanche, la fonctionnalité de l’effet Fresnel sur les matériaux est simplement un ajout d’effet de couleur sans dépendance par rapport aux lumières ou à l’environnement du ciel.

L’effet Fresnel donne aux objets affectés une couleur brillante sur leurs bords. Vous trouverez des informations sur la personnalisation des effets et des exemples de résultats de rendu dans les sections suivantes.

Remarque

L’effet fresnel ne peut pas être appliqué aux nuages de points.

Activation de l’effet Fresnel

Pour utiliser la fonctionnalité d’effet Fresnel, vous devez l’activer sur les matériaux en question. Pour l’activer, définissez le FresnelEffect de PbrMaterialFeatures sur le matériau PBR. Le même modèle s’applique à ColorMaterialFeatures et au matériau de couleur. Consultez la section des exemples de code pour une démonstration d’utilisation.

Une fois activé via l’API, l’effet fresnel sera immédiatement visible. Par défaut, la brillance est blanche (1, 1, 1, 1) et a un exposant égal à 1. Vous pouvez personnaliser ces paramètres à l’aide des méthodes setter de paramètres ci-dessous.

Personnalisation de l’apparence de l’effet

Vous pouvez personnaliser l’effet Fresnel en fonction de chaque matériau à l’aide des propriétés suivantes :

Propriété du matériau Type Explication
FresnelEffectColor Color4 Couleur ajoutée au maximum au fur et à mesure de la brillance de Fresnel. Le canal alpha est ignoré.
FresnelEffectExponent virgule flottante Diffusion de la brillance de Fresnel. Va de 0.01 (réparti sur tout l’objet) à 10 (uniquement les angles les plus gracieux).

En pratique, les différents paramètres de couleur et d’exposant se présentent ainsi :

Fresnel effect examples

L’exposant de l’effet Fresnel est progressivement augmenté de 1 à 10 pour chaque ligne de couleur. Cela entraîne progressivement une brillance de Fresnel vers les bords des objets visualisés. L’effet Fresnel n’est pas non plus affecté par la transparence, comme vous pouvez le voir dans l’exemple suivant :

Fresnel effect transparency examples

Comme indiqué, les objets de la diagonale sont entièrement transparents, mais la brillance de Fresnel est conservée. À cet égard, l’effet imite l’effet Fresnel physique, qui est également présent dans ces captures d’écran.

Exemples de code

Les exemples de code suivants illustrent l’activation et la personnalisation de l’effet Fresnel pour un matériau PBR et un matériau de couleur :

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

Documentation de l’API

Étapes suivantes