PBR

PBR

  • 理论
    • 微平面理论(Microfacet Theory)
    • 能量守恒(Energy Conservation)
    • 反射系数方程
    • BRDF
  • lighting
  • IBL

理论

PBR技术(physically based rendering)是由一系列技术构成,有一些物理参数,无论在什么光照条件下都可以反映正确纹理。
一个PBR光照模型必须要满足的条件:
1.基于微突面模型
2.能源节约
3.使用基于物理的BRDF

微平面理论(Microfacet Theory)

定义了粗糙度roughness,定义了光线向量和视线向量的中间向量h,光的反射还遵循能量守恒的原则,当光线照射到物体的表面,会因为碰撞而损耗一些能量

能量守恒(Energy Conservation)

光线照射到物体表面会发生反射和折射,在本章节中忽略了其他细节,特别是金属物体,其折射光线会被完全吸收。在PBR理论中,入射光线的能量大于反射光线与折射光线能量之和

反射系数方程

反射系数方程求的是某点p处,以某一角度w反射(射向观测者位置的方向)的反射光线的辐射值L
PBR中使用的反射系数方程,其中的参数有:

  • Radiant flux辐射通量
  • radiance 辐射
  • solid angle 实心角
  • radiant intensity 辐射强度

公式:

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;
}

BRDF

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+ksfcooktorrance

综上所述,一个完整的反射系数方程为:
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(ω0n)(ωin)DFGLi(p,ωi)nωidωi.
反射系数方程反应了一个PBR模型时如何被渲染的

lighting

点光源的光线强度会随着距离而衰减,而线光源不会,其有着固定的光线强度。光线的强度会随着距离的长远而改变强弱,其颜色值也和入射光线与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;

IBL

image based lighting把环境变量也纳入考虑范围

你可能感兴趣的:(OpenGL)