1. Kajiya-Kay毛发渲染模型深度解析
Kajiya-Kay模型是计算机图形学中专门用于模拟头发、毛皮等纤维状材质各向异性高光的经典光照模型。与传统的基于法线的高光计算不同,该模型创新性地使用切线方向作为主要计算基准,能够产生沿纤维走向的条状高光效果,这对于实现逼真的毛发渲染至关重要。
1.1 核心算法原理
模型的核心计算基于切线空间而非传统的法线空间。具体计算过程如下:
-
基础公式:
TdotH = dot(tangent, halfVector)
这里halfVector是光线方向与视线方向的中间向量(即normalize(lightDir + viewDir))。与传统Phong模型使用NdotH不同,使用切线向量与半角向量的点积能产生沿切线方向延伸的高光。 -
正弦变换:
TsinH = sqrt(1 - TdotH*TdotH)
这个转换是关键创新点,将点积结果转换为正弦值,使得高光出现在切线垂直方向(即纤维的法平面方向),形成典型的条状高光图案。 -
幂次控制:
pow(TsinH, shininess)
通过指数函数控制高光的锐利程度,shininess值越大高光越集中。
1.2 双层高光特性
真实毛发在光照下通常会表现出两个明显的高光区域:
- 主高光(Primary Specular):通常出现在发梢区域,强度较高且颜色接近光源色
- 次高光(Secondary Specular):出现在发根附近,通常会有轻微的色彩偏移(往暖色或冷色方向)
这种特性模拟了光线在毛发纤维内部的多次散射效果(类似Marschner模型的R、TRT分量)。在实现时,我们需要:
- 使用不同的切线偏移量(通过ShiftTangent函数)
- 设置不同的shininess值
- 赋予不同的高光颜色
1.3 切线扰动技术
单纯的数学计算会产生过于完美的高光条纹,而真实毛发的高光会有细微的不规则变化。我们通过噪声贴图扰动切线方向来增强真实感:
hlsl复制float3 ShiftTangent(float3 T, float3 N, float shift) {
// 从噪声贴图获取扰动值
float noise = tex2D(_AnisoNoiseTex, uv).r;
// 沿法线方向扰动切线
return normalize(T + N * shift * noise);
}
这个技术使得高光带产生自然的断裂和不规则变化,显著提升视觉真实度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. URP的PBR框架解析
Unity的通用渲染管线(URP)采用基于物理的渲染(PBR)框架,其核心是Cook-Torrance微表面模型。理解这个框架是整合自定义光照模型的前提。
2.1 BRDF组成要素
URP中的BRDF计算主要包含三个核心组件:
-
法线分布函数(D项)
描述微表面法线的统计分布,决定高光的形状和范围。URP默认使用GGX分布:hlsl复制float D_GGX(float NdotH, float roughness) { float a = roughness * roughness; float a2 = a * a; float NdotH2 = NdotH * NdotH; float denom = (NdotH2 * (a2 - 1.0) + 1.0); return a2 / (PI * denom * denom); } -
菲涅尔反射(F项)
使用Schlick近似计算不同角度下的反射率:hlsl复制float3 F_Schlick(float cosTheta, float3 F0) { return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); } -
几何遮蔽(G项)
采用Smith联合阴影函数,考虑光线和视线方向的遮蔽效果:hlsl复制float V_SmithGGXCorrelated(float NdotL, float NdotV, float roughness) { float a2 = roughness * roughness; flo
