Compartilhar via


Efeito Fresnel

A funcionalidade do material do efeito fresnel é um efeito ad hoc não fisicamente correto. A funcionalidade baseia-se na observação física dos objetos que se tornam mais reflexivos nesses ângulos. A própria reflexão de fresnel já está fisicamente incorporada no modelo de material de PBR usado no Azure Remote Rendering. Por outro lado, o recurso material de efeito de Fresnel é apenas um efeito de cor aditivo sem dependência das luzes ou do ambiente do céu.

O efeito de Fresnel fornece aos objetos afetados um brilho colorido em torno de suas bordas. Informações sobre personalização de efeito e exemplos dos resultados de renderização podem ser encontradas nas seções a seguir.

Observação

O efeito Fresnel não pode ser aplicado a nuvens de ponto.

Habilitando o efeito de Fresnel

Para usar o recurso do efeito de Fresnel, ele precisa ser habilitado nos materiais em questão. Você pode habilitá-lo definindo o bit FresnelEffect do PbrMaterialFeatures no material de PBR. O mesmo padrão se aplica ao ColorMaterialFeatures e ao Material de cor. Confira a seção exemplos de código para ver uma demonstração de uso.

Depois de habilitado por meio da API, o efeito Fresnel ficará imediatamente visível. Por padrão, o brilho será branco (1, 1, 1, 1) e terá um expoente de 1. Você pode personalizar essas configurações usando os setters de parâmetro abaixo.

Personalizando a aparência do efeito

Atualmente, o efeito de Fresnel pode ser personalizado por material usando as seguintes propriedades:

Propriedade de material Tipo Explicação
FresnelEffectColor Color4 A cor que é adicionada no máximo como o brilho de Fresnel. O canal alfa é ignorado no momento.
FresnelEffectExponent float O espalhamento do brilho de Fresnel. Varia de 0,01 (espalhado por todo o objeto) a 10 (somente os ângulos mais adornados).

Na prática, as configurações de cor e expoente diferentes terão a seguinte aparência:

Fresnel effect examples

O expoente do efeito de Fresnel é aumentado progressivamente de 1 a 10 para cada linha de cor. Ao fazer isso, o brilho do Fresnel é puxado progressivamente para as bordas dos objetos exibidos. O efeito de Fresnel também não é afetado pela transparência, como você pode ver no exemplo a seguir:

Fresnel effect transparency examples

Como mostrado, os objetos na diagonal são totalmente transparentes, mas o brilho de Fresnel permanece. Neste sentido, o efeito imita o Fresnel baseado fisicamente, que também está presente nessas capturas de tela.

Exemplos de código

Os exemplos de código a seguir mostram como habilitar e personalizar o efeito fresnel para um material de PBR e um material de Cor:

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

Documentação da API

Próximas etapas