我是靠谱客的博主 单身热狗,最近开发中收集的这篇文章主要介绍基于物理着色(二)- Microfacet材质和多层材质,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

Blinn-Phong并不是一个非常真实的分布,上面的公式也并不满足能量守恒定律(D需要满足w_{m}在半球面上积分为1,Blinn-Phong还需乘以一个常量frac{e+2}{2pi } 才满足这个条件)。近年来有许多新的分布函数被发明出来例如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友好的材质系统,希望能带来一些启发。

最后

以上就是单身热狗为你收集整理的基于物理着色(二)- Microfacet材质和多层材质的全部内容,希望文章能够帮你解决基于物理着色(二)- Microfacet材质和多层材质所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部