當前位置:首頁 >教程首頁 > Unreal Engine >Unreal入門AO知識科普

Unreal入門AO知識科普

發布時間:2021-03-18 10:21:27

Hello,大家好,今天是一篇Unreal入門AO知識科普分享,我是木偶心沒。

1.png

AO,Ambient Occlusion,環境光遮蔽。主要是描述了表麵上的任何一點所接受到的環境光被周圍幾何體所遮蔽的百分比,因此使得渲染的結果更加富有層次感,對比度更高。如下來自wiki的效果對比:

2.png

在臉上有皺紋的地方給加了陰影細節,整個臉就更加立體和有層次。而且AO可以解決漏光,陰影漂浮等問題,會改善場景中角落,鋸齒,裂縫等細小物體陰影不清晰等問題,增強場景的深度和立體感。

而我們常說的AO是指寫在材質裏麵的AO貼圖,但是材質裏麵的AO貼圖並不會被寫入到Gbuffer中,而是會被疊加到lightmap,stationary sky light和reflection capture specular中去,其他的動態間接光比如說ambient cube和movable sky不會對它產生任何影響。所以在引擎裏麵沒有辦法直接預覽。(通過Buffer Visualization>Material Ambient Occlusion得不到正確的效果)

3.png

而在引擎的預覽窗口裏麵還有另外一個選項Ambient Occlusion。

4.webp.jpg

可以看到這個Ambient Occlusion是有效果的。

5.png

然而這個AO效果並不是材質貼圖裏麵的AO,而是unreal自帶的場景AO,Screen Space Ambient Occlusion,簡稱SSAO。

可以在嚐試一下如果把Show>Lighting Features>Screen Space Ambient Occlusion關掉,場景裏麵就沒有AO效果了。

6.png

所以我們現在來叨一下SSAO的原理以及計算方法。

SSAO是屏幕空間的AO,也就是不是場景的預處理,是屏幕後期處理,根據OpenGL的算法,要得到SSAO,

首先需要解算AO,然後進行blur,最後再通過lighting pass疊加到物體上。

7.png

1、計算AO

計算AO的方法是根據每個點切線空間的切線法線為中心,畫一個半球,然後隨機采樣半球裏麵的點,判斷如果這些點的深度大於中心點的深度,就說明采樣點被遮擋了,反之采樣點沒有被遮擋。

圖片

圖中灰色的圓圈就是被遮擋的采樣點,然後再將所有的采樣點用采樣係數(離中心點越近采樣點係數越大)疊加起來,得到的就是最後中心點的遮蔽值。

這裏貼一個采樣算法顯得比較專業:

std::uniform_real_distributionrandomFloats(0.0, 1.0); // 隨機浮點數,範圍0.0 - 1.0

std::default_random_engine generator;

std::vectorssaoKernel;

for (GLuint i = 0; i < 64; ++i)

{

    glm::vec3 sample(

        randomFloats(generator) * 2.0 - 1.0,

        randomFloats(generator) * 2.0 - 1.0,

        randomFloats(generator)

    );

    sample = glm::normalize(sample);

    sample *= randomFloats(generator);

    GLfloat scale = GLfloat(i) / 64.0;

    ssaoKernel.push_back(sample);

}

2、模糊AO

需要對ao進行模糊的原因是上述采樣得到的AO效果很噪,所以為了創建一個光滑的環境遮蔽結果,我們需要模糊環境遮蔽紋理。

而模糊的辦法可以用高斯模糊,或者使用另外一種類似高斯模糊的辦法,就是在用中心點與采樣點的uv坐標距離,法線和深度關係共同得到采樣係數,距離越遠采樣係數越小,法線和深度的差距越大采樣係數也越大。然後再用高斯模糊的辦法偏移每一個坐標並且得到平均的結果就是高斯模糊的效果。

3、混合

應用所得的AO值得辦法就是將逐片段AO乘到光照環境分量上,得到加了光照的片段著色器。

#version 330 core

out vec4 FragColor;

in vec2 TexCoords;

uniform sampler2D gPositionDepth;

uniform sampler2D gNormal;

uniform sampler2D gAlbedo;

uniform sampler2D ssao;

struct Light {

    vec3 Position;

    vec3 Color;

    float Linear;

    float Quadratic;

    float Radius;

};

uniform Light light;

void main()

{            

    // 從G緩衝中提取數據

    vec3 FragPos = texture(gPositionDepth, TexCoords).rgb;

    vec3 Normal = texture(gNormal, TexCoords).rgb;

    vec3 Diffuse = texture(gAlbedo, TexCoords).rgb;

    float AmbientOcclusion = texture(ssao, TexCoords).r;

    // Blinn-Phong (觀察空間中)

    vec3 ambient = vec3(0.3 * AmbientOcclusion); // 這裏我們加上遮蔽因子

    vec3 lighting  = ambient;

    vec3 viewDir  = normalize(-FragPos); // Viewpos 為 (0.0.0),在觀察空間中

    // 漫反射

    vec3 lightDir = normalize(light.Position - FragPos);

    vec3 diffuse = max(dot(Normal, lightDir), 0.0) * Diffuse * light.Color;

    // 鏡麵

    vec3 halfwayDir = normalize(lightDir + viewDir);

    float spec = pow(max(dot(Normal, halfwayDir), 0.0), 8.0);

    vec3 specular = light.Color * spec;

    // 衰減

    float dist = length(light.Position - FragPos);

    float attenuation = 1.0 / (1.0 + light.Linear * dist + light.Quadratic * dist * dist);

    diffuse  *= attenuation;

    specular *= attenuation;

    lighting += diffuse + specular;

    FragColor = vec4(lighting, 1.0);

}

以上就是SSAO的一個大概解算過程,所以就算不給模型單獨添加AO貼圖,都可以得到AO效果。而這種SSAO還是會存在一些問題,比如說陰影清晰度和畫質不高,所以在與不具備AO特效的場景相比時,圖像質量的提升並不大。所以下一節我們研究一下升級版本的HBAO以及最新的HBAO+

來源:Thepoly公眾號

华体会hth体育网 賞析
  • 2101期學員李思庭作品

    2101期學員李思庭作品

  • 2104期學員林雪茹作品

    2104期學員林雪茹作品

  • 2107期學員趙淩作品

    2107期學員趙淩作品

  • 2107期學員趙燃作品

    2107期學員趙燃作品

  • 2106期學員徐正浩作品

    2106期學員徐正浩作品

  • 2106期學員弓莉作品

    2106期學員弓莉作品

  • 2105期學員白羽新作品

    2105期學員白羽新作品

  • 2107期學員王佳蕊作品

    2107期學員王佳蕊作品

專業問題谘詢

你擔心的問題,火星幫你解答

微信掃碼入群領福利

掃碼領福利最新AI資訊

點擊谘詢
添加老師微信,馬上領取免費課程資源

1. 打開微信掃一掃,掃描左側二維碼

2. 添加老師微信,馬上領取免費課程資源

×

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯係,請保持電話暢通!
確定