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