PBR技术(physically based rendering)是由一系列技术构成,有一些物理参数,无论在什么光照条件下都可以反映正确纹理。
一个PBR光照模型必须要满足的条件:
1.基于微突面模型
2.能源节约
3.使用基于物理的BRDF
定义了粗糙度roughness,定义了光线向量和视线向量的中间向量h,光的反射还遵循能量守恒的原则,当光线照射到物体的表面,会因为碰撞而损耗一些能量
光线照射到物体表面会发生反射和折射,在本章节中忽略了其他细节,特别是金属物体,其折射光线会被完全吸收。在PBR理论中,入射光线的能量大于反射光线与折射光线能量之和
反射系数方程求的是某点p处,以某一角度w反射(射向观测者位置的方向)的反射光线的辐射值L
PBR中使用的反射系数方程,其中的参数有:
公式:
L 0 ( p , ω 0 ) = ∫ Ω f r ( p , ω i , ω 0 ) L i ( p , ω i ) n ⋅ ω i d ω i   . L_0(p,\omega_0) = \int\limits_\Omega f_r(p,\omega_i,\omega_0)L_i(p,\omega_i)n·\omega_id\omega_i\,. L0(p,ω0)=Ω∫fr(p,ωi,ω0)Li(p,ωi)n⋅ωidωi.
注意的是,在代码中,使用离散的思想计算微积分
int steps = 100;
float sum = 0.0f;
vec3 P = ...;
vec3 Wo = ...;
vec3 N = ...;
float dW = 1.0f / steps;
for(int i = 0; i < steps; ++i)
{
vec3 Wi = getNextIncomingLightDir(i);
sum += Fr(P, Wi, Wo) * L(P, Wi) * dot(N, Wi) * dW;
}
bidirectional reflective distribution function双向反射分布函数
Cook-Torrance BRDF兼有漫反射和镜面反射两个部分:
f r = k d f l a m b e r t + k s f c o o k − t o r r a n c e f_r=k_df_{lambert}+k_sf_{cook-torrance} fr=kdflambert+ksfcook−torrance
综上所述,一个完整的反射系数方程为:
L 0 ( p , ω 0 ) = ∫ Ω ( k d c π + D F G 4 ( ω 0 ⋅ n ) ( ω i ⋅ n ) ) L i ( p , ω i ) n ⋅ ω i d ω i   . L_0(p,\omega_0) = \int\limits_\Omega (k_d\dfrac{c}{\pi}+\dfrac{DFG}{4(\omega_0·n)(\omega_i·n)})L_i(p,\omega_i)n·\omega_id\omega_i\,. L0(p,ω0)=Ω∫(kdπc+4(ω0⋅n)(ωi⋅n)DFG)Li(p,ωi)n⋅ωidωi.
反射系数方程反应了一个PBR模型时如何被渲染的
点光源的光线强度会随着距离而衰减,而线光源不会,其有着固定的光线强度。光线的强度会随着距离的长远而改变强弱,其颜色值也和入射光线与p点法线的点积有关。
vec3 lightColor = vec3(23.47, 21.31, 20.79);
vec3 wi = normalize(lightPos - fragPos);
float cosTheta = max(dot(N, Wi), 0.0);
float attenuation = calculateAttenuation(fragPos, lightPos);
float radiance = lightColor * attenuation * cosTheta;
image based lighting把环境变量也纳入考虑范围