0%

PRB名词解释

1 什么是PRB,有什么用

基于物理的渲染过程,是一种着色和渲染技术,用于更精确的描述光如何与物体表面互动,PBR的优势在于其通过精确的物理计算公式,可以准确的得到各种光照环境下的效果。

2 PBR分类

基于金属的工作流Metal / Roughness
基于镜面反射的工作流Specular / Glossiness

3 PBR中 BRDF公式大概

输出颜色 = 散射光占比 * (表面颜色/PI)+ 镜面反射比例 *( DFG / 4 * max(dot(法线,视线),0) * saturate(dot(法线,光线)) ) * (光线 dot 法线)

4 PBR散射光占比

散射光占比kD:为了保持能量守恒,散射光占比 和 镜面光占比之和不能超过1.0    kD = float3(1.f, 1.f, 1.f) - kS    金属度越高,散射越少 kD = kD * (1.f - metallic);

5 镜面反射比例

镜面光占比kS 镜面光占比为菲涅尔结果  kS = F     DFG 已经包含

6 DFG

6.1
    D 法线分布函数(Normal Distribution Function):估算在受到表面粗糙度的影响下,取向方向与中间向量一致的微平面的数量。这是用来估算微平面的主要函数。
    F 菲涅尔方程(Fresnel Rquation):菲涅尔方程描述的是在不同的表面角下表面所反射的光线所占的比率。菲涅尔效果就是当视线与法线夹角越大折射效果减弱而反射效果增强,
        拿水来说我们近处的水透明见底可理解为光线发生了全折射而零反射,远处的水波光粼粼可理解为光线发生了零折射而全反射。
    G 几何函数(Geometry Function):描述了微平面自成阴影的属性。当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。

6.2
    法线分布函数(Normal Distribution Function ),描述了描述了微观表面上的表面法线m的统计分布,即具有正确朝向的微表面法线浓度

    基本性质:
    >>>> 1.法线分布函数作为微平面密度的度量,应始终为正值
    >>>> 2.微表面总面积不小于对应宏观表面总面积
    >>>> 3.任何方向上微观表面投影面积与宏观表面投影面积相同
    >>>> 4.观察方向若为法线方向( v =n ) ,则其积分可以归一化

    各种模型:
    >>>> Berry [1923]
    >>>> Beckmann [1963]
    >>>> Phong [1973]
    >>>> Blinn-Phong [1977]
    >>>> ABC [1989]
    >>>> GGX [2007] / Trowbridge-Reitz [1975]
    >>>> Shifted Gamma Distribution,SGD [2012]
    >>>> Trowbridge-Reitz(GTR)[2012]
    >>>> Student’s T-Distribution , STD [2017]
    >>>> Exponential Power Distribution , EPD [2017]等

    GGX模型:
    >>>> denom = (dot(N,H))的平方 * ((a的平方 - 1.0) + 1.0)
    >>>> GGX = a的平方/ (PI * denom的平方)
    >>>> 事件代码
1
2
3
4
5
6
7
8
9
10
11
12
// GGX正态分布函数
float DistributionGGX(float3 N,float3 H,float roughness)
{
float a2=roughness*roughness;
a2=a2*a2;
float NdotH=saturate(dot(N,H));
float NdotH2=NdotH*NdotH;

float denom=(NdotH2*(a2-1.0)+1.0);
denom = UNITY_PI*denom*denom;
return a2/denom;
}
6.3
    菲涅尔方程描述的是在不同的表面角下表面所反射的光线所占的比率。菲涅尔效果就是当视线与法线夹角越大折射效果减弱而反射效果增强
    cosTheta = clamp(dot(halfDir,viewDir),0,1)
    F0 = 不同采材质的反射率
1
2
3
4
5
// 菲涅尔简化方程代码
float3 FresnelSchlick(float cosTheta,float3 F0)
{
return F0 + (1.0-F0) * pow(1.0-cosTheta,5.0);
}
6.4
    几何遮蔽函数:它主要是用来模拟微平面的一个点有没有被遮住
    为了有效的估算几何部分,需要将观察方向(几何遮蔽(Geometry Obstruction))和光线方向向量(几何阴影(Geometry Shadowing))都考虑进去。我们可以使用史密斯法(Smith’s method)来把两者都纳入其中
    Smith 几何遮蔽函数G:
    >>>> worldNormal,viewDir,worldLightDir,_Roughness
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

// Smith 几何遮蔽函数
float3 GeometrySchlickGGX(float NdotV,float roughness)
{
float r = roughness + 1.0; //直接光照K值
float k = r*r/8.0;

float denom = NdotV * (1.0-k) + k;
return NdotV/denom;
}

float GeometrySmith(float3 N,float3 V,float3 L,float roughness)
{
float NdotV = saturate(dot(N,V));
float NdotL = saturate(dot(N,L));
float ggx1 = GeometrySchlickGGX(NdotV,roughness);
float ggx2 = GeometrySchlickGGX(NdotL,roughness);

return ggx1 * ggx2;
}

7 总结
结束: ( kD * albedo / UNITY_PI + specular) * NdotL
自己老是容易忘记 年级大了?