法线分布项(Specular D):GTR
- D为微平面分布函数,主要负责镜面反射波峰(specular peak)的形状。(反射波峰的形状)
- 正态分布函数D,或者说镜面分布,从统计学上近似的表示了与某些(中间)向量h取向一致的微平面的比率。
- Disney Principled BRDF中使用了两个固定的镜面反射波瓣(specular lobe),且都使用GTR模型,可以总结如下:
- 主波瓣(primary lobe)
-
- 使用γ= 2的GTR(即GGX分布)
- 代表基础底层材质(Base Material)的反射
- 可为各项异性(anisotropic) 或各项同性(isotropic)的金属或非金属
- 次级波瓣(secondary lobe)
-
- 使用γ= 1的GTR(即Berry分布)
- 代表基础材质上的清漆层(ClearCoat Layer)的反射
- 一般为各项同性(isotropic)的非金属材质,即清漆层(ClearCoat Layer)
- GGX比其他分布具有更长的尾部,但仍然无法捕捉到铬金属(chrome)样本的闪亮亮点。
- chrome 、GGX和Beckmann分布的点光源响应
公式
公式1
-
- a表示表面粗糙度
- h 当成是不同粗糙度参数下,平面法向量和光线方向向量之间的中间向量的话
- 计算正态分布函数网上代码
float D_GGX_TR(vec3 N, vec3 H, float a)
{
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;
}
公式2
- 以下是γ= 1和γ= 2时GTR分布的Shader实现代码:
// Generalized-Trowbridge-Reitz distribution
float D_GTR1(float alpha, float dotNH)
{
float a2 = alpha * alpha;
float cos2th = dotNH * dotNH;
float den = (1.0 + (a2 - 1.0) * cos2th);
return (a2 - 1.0) / (PI * log(a2) * den);
}
float D_GTR2(float alpha, float dotNH)
{
float a2 = alpha * alpha;
float cos2th = dotNH * dotNH;
float den = (1.0 + (a2 - 1.0) * cos2th);
return a2 / (PI * den * den);
}
以及各项异性的版本:
float D_GTR2_aniso(float dotHX, float dotHY, float dotNH, float ax, float ay)
{
float deno = dotHX * dotHX / (ax * ax) + dotHY * dotHY / (ay * ay) + dotNH * dotNH;
return 1.0 / (PI * ax * ay * deno * deno);
}
今天的文章PBR Specular D 法线分布 NDF分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/16196.html