unity的URP管線渲染Shader分析

URP管線核心函數 UniversalFragmentPBR

half4 UniversalFragmentPBR(InputData inputData, half3 albedo, half metallic, half3 specular,
    half smoothness, half occlusion, half3 emission, half alpha)
{
    BRDFData brdfData;
    InitializeBRDFData(albedo, metallic, specular, smoothness, alpha, brdfData);
    
    Light mainLight = GetMainLight(inputData.shadowCoord);
    MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, half4(0, 0, 0, 0));

    half3 color = GlobalIllumination(brdfData, inputData.bakedGI, occlusion, inputData.normalWS, inputData.viewDirectionWS);
    color += LightingPhysicallyBased(brdfData, mainLight, inputData.normalWS, inputData.viewDirectionWS);

#ifdef _ADDITIONAL_LIGHTS
    uint pixelLightCount = GetAdditionalLightsCount();
    for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex)
    {
        Light light = GetAdditionalLight(lightIndex, inputData.positionWS);
        color += LightingPhysicallyBased(brdfData, light, inputData.normalWS, inputData.viewDirectionWS);
    }
#endif

#ifdef _ADDITIONAL_LIGHTS_VERTEX
    color += inputData.vertexLighting * brdfData.diffuse;
#endif

    color += emission;
    return half4(color, alpha);
}

首先一般遊戲採用的Metalic-Smooth工作流,

根據金屬度 計算反射度 根據反射度影響 diffuse顏色

根據金屬度影響高光顏色

金屬度=0 diffuse基本很少損失, 高光爲標準高光色,albedo 貢獻很少, 高光強度也很弱

反射能力和光滑度共同決定 Fresnel的強度

光滑度和粗糙度剛好相反

感知光滑度是人類操作的參數,而實際粗糙度是感知粗糙度的平方

人類眼睛感知的線性變化,在PBR模型中,認爲是平方級別的變化

實際粗糙度的平方也參與PBR中的一些計算

粗糙度影響微表面的幾何結構,也就是PBR中的G項

PBR中的透明物體,會影響物體的diffuse色,越透明,本色越少

接着獲取主光源信息,

包括Intensity 修正後的光顏色,主光源的陰影係數, 不過這個乘法是在Gamma空間做的,接着轉化到線性空間,傳遞給Shader

接着進行全局光計算

根據法線和視線計算反射,fresnel係數根據法線和View計算

逐頂點傳入了BakedGI,一般是光照貼圖或者LightProbe 或者天空盒子的Probe

間接光主要是環境光來自天空盒或者來自Ambient, 間接高光來自反射球,或者天空盒

間接光diffuse受到AO影響,從天空盒Probe或者Ambient中產生

間接光Specular, 根據粗糙度計算mipmap等級,採樣反射球, 同樣AO也影響高光

間接光diffuse和brdf的diffus相乘

間接漫反射光 + 粗糙度影響的間接高光 * fresnel係數

根據法線 Light方向 計算直接光效果

默認開啓直接光高光,根據HalfDir 粗糙度 影響法線分佈, 可見性, Fresnel, DVF/4

計算直接光高光,材質的高光色 * 高光係數 + 材質的diffuse

DirectBRDF 直接光的 高光和 漫反射 * 輻射度係數 光照顏色和光照 Normal Light 關係影響整體輻射度強度

依次再計算其它點光源的 Specular和diffuse影響

最後添加自發光

整體就是PBR最終的輸出顏色了

如果要製作卡通渲染

Radiance 輻射度計算中轉化爲色階

高光係數中增加色階

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章