Fresnel-effect
De fresnel effect materiaalfunctie is een niet-fysiek correct, ad-hoc effect. De functie is gebaseerd op de fysieke observatie van objecten die steeds reflecterender worden in deze hoeken. Fresnel reflectance zelf is al fysiek opgenomen in het PBR-materiaalmodel dat wordt gebruikt in Azure Remote Rendering. De fresnel effect materiaalfunctie is daarentegen slechts een additief kleureffect zonder afhankelijkheid van lichten of de luchtomgeving.
Het fresnel-effect geeft betrokken objecten een gekleurde glans rond hun randen. Informatie over effectaanpassing en voorbeelden van de renderingresultaten vindt u in de volgende secties.
Notitie
Het fresnel-effect kan niet worden toegepast op puntwolken.
Het fresnel-effect inschakelen
Als u de fresnel-effectfunctie wilt gebruiken, moet deze worden ingeschakeld voor de betreffende materialen. U kunt dit inschakelen door de FresnelEffect-bit van de PbrMaterialFeatures in te stellen op het PBR-materiaal. Hetzelfde patroon is van toepassing op de ColorMaterialFeatures en het kleurmateriaal. Zie de sectie met codevoorbeelden voor een gebruiksdemonstratie.
Nadat dit is ingeschakeld via de API, is het fresnel-effect onmiddellijk zichtbaar. De glans is standaard wit (1, 1, 1, 1) en heeft een exponent van 1. U kunt deze instellingen aanpassen met behulp van de onderstaande parametersetters.
Het uiterlijk van het effect aanpassen
Op dit moment kan het fresnel-effect per materiaal worden aangepast met behulp van de volgende eigenschappen:
Materiaaleigenschap | Type | Uitleg |
---|---|---|
FresnelEffectColor | Kleur4 | De kleur die maximaal wordt toegevoegd als de fresnel glans. Het alfakanaal wordt momenteel genegeerd. |
FresnelEffectExponent | zwevend | De verspreiding van de fresnel glans. Varieert van 0,01 (verspreid over het hele object) tot 10 (alleen de meest gracing hoeken). |
In de praktijk zien verschillende kleur- en exponentinstellingen er als volgt uit:
De exponent van het fresnel-effect wordt geleidelijk verhoogd van 1 tot 10 voor elke kleurrij. Hierdoor trekt de fresnel glans geleidelijk naar de randen van de bekeken objecten. Het fresnel-effect wordt ook niet beïnvloed door transparantie, zoals u in het volgende voorbeeld kunt zien:
Zoals weergegeven, zijn de objecten op de diagonale volledig transparant, maar fresnel glans blijft bestaan. Het effect nabootst fysiek gebaseerde fresnel in dat opzicht, die ook aanwezig is in deze schermafbeeldingen.
Codevoorbeelden
De volgende codevoorbeelden tonen het inschakelen en aanpassen van het fresnel-effect voor zowel een PBR-materiaal als een kleurmateriaal:
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);
}
}