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 辐射度计算中转化为色阶

高光系数中增加色阶

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