基于物理着色(二)- 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友好的材质系统,希望能带来一些启发。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值