共用方式為


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 effect examples

每個色彩列的 Fresnel 效果指數會從 1 遞增到 10。 將指數提升可將 Fresnel 亮光逐漸拉至檢視物體的邊緣。 Fresnel 效果也不受透明度影響,如下列範例所示:

Fresnel effect transparency examples

如範例所示,對角線上的物件是完全透明的,但 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);
    }
}

API 文件

下一步