基于物理着色(二)- Microfacet材质和多层材质

基于物理着色(二)- Microfacet材质和多层材质
https://zhuanlan.zhihu.com/p/20119162?columnSlug=graphics

Blinn-Phong并不是一个非常真实的分布,上面的公式也并不满足能量守恒定律(D需要满足w_{m}在半球面上积分为1,Blinn-Phong还需乘以一个常量\frac{e+2}{2\pi } 才满足这个条件)。近年来有许多新的分布函数被发明出来例如Beckmann,GGX等,他们的能量分布都更接近用光学仪器测量的反射数据。Disney BRDF也使用了GGX分布。本文后面的所有渲染结果也使用了GGX。G项也有各种不同的选择,本文使用了有粗糙度作为参数的Smith模型。网上GGX和Smith G项的实现很多,这里就不贴公式了,直接贴两段伪代码。

作者:文刀秋二
链接:https://zhuanlan.zhihu.com/p/20119162
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:文刀秋二
链接:https://zhuanlan.zhihu.com/p/20119162
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

float GGX_D(Vector3 wm, float alpha) // alpha为粗糙度 { float tanTheta2 = TanTheta2(wm), cosTheta2 = CosTheta2(wm); float root = alpha / (cosTheta2 * (alpha * alpha + tanTheta2)); return INV_PI * (root * root); } float Smith_G(Vector3 wo, Vector3 wi, Vector3 wm, float alpha) { auto SmithG1 = [&](Vector3 v, Vector wm) { float tanTheta = abs(TanTheta(v)); if (tanTheta == 0.0f) return 1.0f; if (Dot(v, wm) * CosTheta(v) <= 0) return 0.0f; float root = alpha * tanTheta; return 2.0f / (1.0f + Sqrt(1.0f + root*root)); }; return SmithG1(wo, wm) * SmithG1(wi, wm); }

折射光线能量的计算相比反射的略微复杂,想了解详细和看推倒过程的可以读这篇Paper:Microfacet Models for Refraction through Rough Surface。

推荐阅读这一篇论文:Arbitrarily Layered Micro-Facet Surfaces

。在下一节(基于物理着色(三)- Disney和UE4的实现)我则会谈一谈Disney Principled BRDF是如何运用这两篇文章介绍的这些模型设计出一个Artists友好的材质系统,希望能带来一些启发。

猜你喜欢

转载自blog.csdn.net/kuangben2000/article/details/70199292
今日推荐