Freigeben über


Fresnel-Effekt

Das Materialfeature „Fresnel-Effekt“ ist ein physikalisch nicht korrekter Ad-hoc-Effekt. Das Feature basiert auf der physikalischen Beobachtung von Objekten, die unter diesen Winkeln stärker reflektieren. Die Fresnel-Reflexion selbst ist bereits physisch im PBR-Materialmodell enthalten, das in Azure Remote Rendering verwendet wird. Im Gegensatz dazu ist das Materialfeature „Fresnel-Effekt“ lediglich ein additiver Farbeffekt ohne Abhängigkeit von Licht oder der Himmelumgebung.

Der Fresnel-Effekt verleiht den betroffenen Objekten an ihren Kanten einen farbigen Glanz. Informationen zur Effektanpassung und Beispiele für die Renderingergebnisse finden Sie in den folgenden Abschnitten.

Hinweis

Der Fresnel-Effekt kann nicht auf Punktwolken angewendet werden.

Aktivieren des Fresnel-Effekts

Damit das Fresnel-Effektefeature verwendet werden kann, muss es für die betreffenden Materialien aktiviert werden. Sie können es aktivieren, indem Sie das FresnelEffekt-Bit von PbrMaterialFeatures für das PBR-Material festlegen. Dasselbe Muster gilt für ColorMaterialFeatures und ColorMaterial. Eine Veranschaulichung der Verwendung finden Sie im Abschnitt der Codebeispiele.

Nachdem er über die API aktiviert wurde, wird der Fresnel-Effekt sofort sichtbar. Standardmäßig ist der Glanz weiß (1, 1, 1, 1, 1) und weist einen Exponenten von 1 auf. Sie können diese Einstellungen mithilfe der folgenden Parameter-Setter anpassen.

Anpassen der Effektdarstellung

Gegenwärtig kann der Fresnel-Effekt mithilfe der folgenden Eigenschaften pro Material angepasst werden:

Materialeigenschaft Typ Erklärung
FresnelEffectColor Color4 Die Farbe, die höchstens durch den Fresnel-Glanz hinzugefügt wird. Der Alphakanal wird derzeit ignoriert.
FresnelEffectExponent float Die Verteilung des Fresnel-Glanzes. Diese reicht von 0,01 (über das gesamte Objekt verteilt) bis 10 (nur die am stärksten zierenden Winkel).

In der Praxis werden verschiedene Farb- und Exponenteneinstellungen wie folgt aussehen:

Fresnel effect examples

Der Exponent des Fresnel-Effekts wird für jede Farbreihe progressiv von 1 bis 10 erhöht. Dadurch wird der Fresnel-Glanz progressiv an die Kanten der betrachteten Objekte gezogen. Der Fresnel-Effekt wird auch von der Transparenz nicht beeinflusst, wie Sie im folgenden Beispiel sehen können:

Fresnel effect transparency examples

Wie gezeigt, sind die Objekte auf der Diagonale völlig transparent, aber der Fresnel-Glanz bleibt erhalten. Der Effekt ahmt in dieser Hinsicht ein physikalisch basiertes Fresnel nach, was auch in diesen Screenshots vorhanden ist.

Codebeispiele

Die folgenden Codebeispiele zeigen die Aktivierung und Anpassung des Fresnel-Effekts sowohl für ein PBR-Material als auch für ein Farbmaterial:

    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ächste Schritte