渲染相关概念
Dionysen

PBR(Physically Based Rendering)

  1. 微表面理论(Microfacet Theory)
    graph TD
    A[微表面理论] --> B[宏观表面]
    A --> C[微观表面]
    B --> D[我们看到的平滑表面]
    C --> E[实际的粗糙微表面]
    E --> F[镜面反射]
    E --> G[漫反射]
    F --> H[直接反射光线]
    G --> I[多次反射后散射]

微表面理论是PBR的基础,它认为:

  • 任何表面在微观尺度下都由微小的镜面构成
  • 这些微表面的朝向分布决定了材质的粗糙度
  • 粗糙度越高,微表面朝向越混乱,反射越分散
  • 粗糙度越低,微表面朝向越一致,反射越集中
  1. BRDF方程(双向反射分布函数)

PBR中使用的Cook-Torrance BRDF方程:

f(l,v) = kd * f散射 + ks * f镜面
f镜面 = (D * F * G) / (4 * (n·v) * (n·l))

其中:

  • D (Distribution) - 法线分布函数
  • F (Fresnel) - 菲涅尔方程
  • G (Geometry) - 几何遮蔽函数
  • kd - 漫反射系数
  • ks - 镜面反射系数
  • n - 法线向量
  • v - 视线向量
  • l - 光线向量
  1. 各项函数详解

a) **法线分布函数(D)**:

float DistributionGGX(vec3 N, vec3 H, float roughness)
{
float a = roughness * roughness;
float a2 = a * a;
float NdotH = max(dot(N, H), 0.0);
float NdotH2 = NdotH * NdotH;

float nom = a2;
float denom = (NdotH2 * (a2 - 1.0) + 1.0);
denom = PI * denom * denom;

return nom / denom;
}
  • 描述微表面法线的统计分布
  • 粗糙度越高,分布越分散
  • 粗糙度越低,分布越集中

b) **菲涅尔方程(F)**:

vec3 fresnelSchlick(float cosTheta, vec3 F0)
{
return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
}
  • 描述不同观察角度的反射率变化
  • F0是0度角时的反射率
  • 掠射角时反射率接近1
  • 金属的F0值较高,非金属较低

c) **几何函数(G)**:

float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
{
float NdotV = max(dot(N, V), 0.0);
float NdotL = max(dot(N, L), 0.0);
float ggx2 = GeometrySchlickGGX(NdotV, roughness);
float ggx1 = GeometrySchlickGGX(NdotL, roughness);
return ggx1 * ggx2;
}
  • 处理微表面之间的遮蔽和阴影
  • 考虑光线和视线被微表面遮挡的情况
  • 粗糙度越高,遮蔽越明显
  1. 能量守恒

PBR严格遵循能量守恒定律:

vec3 kS = F;           // 镜面反射比例
vec3 kD = 1.0 - kS; // 漫反射比例
kD *= 1.0 - metallic; // 金属不产生漫反射
  • 反射光能量永远不会超过入射光
  • 金属材质几乎没有漫反射
  • 非金属材质同时具有漫反射和镜面反射
  1. 线性空间和Gamma校正

PBR在线性空间进行计算:

// HDR色调映射
finalColor = finalColor / (finalColor + vec3(1.0));
// Gamma校正
finalColor = pow(finalColor, vec3(1.0/2.2));
  • 所有计算在线性空间进行
  • 最后应用色调映射处理HDR
  • 输出前进行Gamma校正
  1. 材质参数的物理含义
  • Metallic(金属度)

    • 0.0 = 非金属(绝缘体)
    • 1.0 = 纯金属
    • 很少使用中间值
  • Roughness(粗糙度)

    • 0.0 = 完全光滑(镜面)
    • 1.0 = 完全粗糙(漫反射)
    • 影响微表面分布
  • Albedo(基础色)

    • 非金属:表面颜色
    • 金属:F0反射率
  1. IBL(基于图像的光照)

完整的PBR通常还需要:

  • 漫反射辐照度图
  • 预过滤环境贴图
  • BRDF积分贴图

PBR Shader

layout(push_constant) uniform Material
{
vec3 AlbedoColor;
float Metalness;
float Roughness;
float Emission;

float EnvMapRotation;

bool UseNormalMap;
}
u_MaterialUniforms;
显示评论