Fresnel 效果
Fresnel 效果材質功能是非實際正確的臨機操作效果。 此功能是以物件的實際觀察情形為基礎,能更明顯地反射這些角度。 Fresnel 反射本身已實際併入 Azure 遠端轉譯中使用的PBR 材質模型。 相反地,Fresnel 效果材質功能只是一種加法色彩效果,且不相依於光線或天空環境。
Fresnel 效果可讓受影響的物件在其邊緣周圍顯示有色光亮。 您可以在下列各節找到效果自訂資訊和轉譯結果範例。
注意
Fresnel 效果無法套用至點雲。
啟用 Fresnel 效果
若要使用 Fresnel 效果功能,必須先在有問題的材質上啟用此功能。 您可以在 PBR 材質上設定 PbrMaterialFeatures 的 FresnelEffect 位元來啟用此功能。 相同的模式適用於 ColorMaterialFeatures 和色彩材質。 如需使用方式示範,請參閱程式碼範例一節。
透過 API 啟用之後,系統會立即顯示 Fresnel 效果。 預設光亮為白色 (1, 1, 1, 1),且指數為 1。 您可以使用下列參數 Setter 來自訂這些設定。
自訂效果外觀
您目前可以使用下列屬性來自訂每個材質的 Fresnel 效果:
材質屬性 | 類型 | 說明 |
---|---|---|
FresnelEffectColor | Color4 | 最常新增為 Fresnel 亮光的色彩。 目前已忽略 Alpha 色板。 |
FresnelEffectExponent | float | Fresnel 光亮的散射。 範圍從 0.01 (散射至物件的所有區域) 到 10 (僅限最邊緣的角度)。 |
不同色彩和指數設定的實際情形如下:
每個色彩列的 Fresnel 效果指數會從 1 遞增到 10。 將指數提升可將 Fresnel 亮光逐漸拉至檢視物體的邊緣。 Fresnel 效果也不受透明度影響,如下列範例所示:
如範例所示,對角線上的物件是完全透明的,但 Fresnel 亮光仍會維持不變。 效果在這方面會模擬以實際情形為基礎的 Fresnel,這也會顯示在這些螢幕擷取畫面中。
程式碼範例
下列程式碼範例示範如何啟用和自訂 PBR 材質和色彩材質的 Fresnel 效果:
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);
}
}