Compartir a través de


Efecto Fresnel

La característica de efecto Fresnel en el material es un efecto ad hoc que no es físicamente correcto. Se basa en la observación física de los objetos que se vuelven más reflectantes en estos ángulos. La propia reflectancia de Fresnel ya está incorporada físicamente en el modelo de material de PBR usado en Azure Remote Rendering. Por el contrario, la característica de efecto Fresnel en el material es simplemente un efecto de color aditivo que no depende de las luces ni del entorno del cielo.

El efecto Fresnel proporciona a los objetos a los que afecta un brillo de color alrededor de los bordes. Puede encontrar información sobre la personalización del efecto y ejemplos de los resultados de la representación en las secciones siguientes.

Nota:

El efecto fresnel no se puede aplicar a nubes de puntos.

Habilitación del efecto Fresnel

Para usar la característica de efecto Fresnel, debe estar habilitada en los materiales en cuestión. Puede habilitarla estableciendo el bit FresnelEffect de PbrMaterialFeatures en el material de PBR. El mismo patrón se aplica a ColorMaterialFeatures y el material de color. Consulte en la sección de ejemplos de código una demostración de su uso.

Después de habilitarse a través de la API, el efecto fresnel será visible inmediatamente. De forma predeterminada, el brillo será blanco (1, 1, 1, 1) y tendrá un exponente de 1. Puede personalizar esta configuración mediante los establecedores de parámetros siguientes.

Personalización de la apariencia del efecto

Actualmente, el efecto Fresnel se puede personalizar por material con las siguientes propiedades:

Propiedad de material Tipo Explicación
FresnelEffectColor Color4 El color que se agrega como máximo como brillo de Fresnel. Actualmente se omite el canal alfa.
FresnelEffectExponent FLOAT La distribución del brillo de Fresnel. Abarca desde 0,01 (se distribuye por todo el objeto) hasta 10 (solo en los ángulos más oblicuos).

En la práctica, se pueden ver diferentes configuraciones de color y exponente del siguiente modo:

Fresnel effect examples

El exponente del efecto Fresnel se incrementa progresivamente de 1 a 10 en cada fila de color. Al hacerlo, se lleva progresivamente el brillo de Fresnel a los bordes de los objetos vistos. El efecto Fresnel tampoco se ve afectado por la transparencia, como puede ver en el ejemplo siguiente:

Fresnel effect transparency examples

Como se muestra, los objetos de la diagonal son completamente transparentes, pero el brillo de Fresnel permanece. En este sentido, el efecto imita al efecto Fresnel basado en la representación física, que también se encuentra en estas capturas de pantallas.

Ejemplos de código

Los siguientes ejemplos de código muestran cómo habilitar y personalizar el efecto Fresnel para un material de PBR y un material de 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);
    }
}

Documentación de la API

Pasos siguientes