• GGX重要性采样


    在之前的文章里面,我们介绍了Cook-Torrance BRDF,这是一种常见的用于表现PBR的光照模型。今天我们想要解决的问题是,在该BRDF下,给定物体材质的粗糙度(roughness),该如何生成符合该粗糙度的采样方向呢(这对于路径追踪采样生成入射光、IBL算法中采样计算radiance都很重要)?

    法向分布函数(NDF)

    对GGX的采样主要是针对它的法向分布函数NDF来进行的。在之前的文章中,我们曾经简单地介绍过法向分布函数的概念,它是一个用来描述微面元模型中各个微面的法向分布密度的函数。该函数实际的意义是当前点的微表面(microfacet)的面积除以宏表面(macrofacet)的面积,然后再除以立体角,所以NDF的单位是立体角分之一。
    但是如果直接对NDF针对立体角dw积分的话,得到的结果其实并不是1,也就是说NDF实际上并不是法线的概率密度函数。
    真正的归一化公式如下:

    (LARGE int D(m)cos( heta_m)domega=1)

    其中D是法向分布函数,m是某个微面元的法向,( heta_m)则是微面元的法向和宏观表面法向的夹角,(omega)是该微面元所属的立体角。这个公式其实就是将微面元的面积映射到了宏表面上,如下图所示:

    也就是说,如果上面的积分中没有这个(cos heta),那么得到的其实是微表面面积之和和宏表面之比。
    更详细的理论推导可以参考这篇文章:How Is The NDF Really Defined?
    通过上面的公式可知,(D(m)cos( heta_m))才是真正关于微表面法线的概率密度函数。

    关于GGX的重要性采样

    知道了概率密度函数p,我们就可以根据它进行采样。在这里我们以GGX的NDF为例。
    GGX的NDF形式如下:
    (large{NDF-GGX(n,h,alpha)=frac{{alpha}^2}{pi {( {cos heta}^2 ({alpha}^2 - 1) + 1)}^2}})
    将它转换为球坐标系的概率密度函数为:

    (large{p( heta,phi)=frac{{alpha}^2 cos heta sin heta}{pi {( {cos heta}^2 ({alpha}^2 - 1) + 1)}^2}})

    ( heta)(phi)的边缘概率密度函数,得:

    进一步求得( heta)(phi)的CDF:
    (LARGE P_h(phi)=frac{phi}{2pi})

    设两个[0,1]之间的随机数(xi)(epsilon)分别对应(P_h(phi))(P_h( heta)),可以解得(其实用得就是逆方法):
    (LARGE phi = 2pixi)
    (LARGE heta = arccossqrt{frac{1-epsilon}{epsilon(alpha^2 - 1) + 1}})

    可以看到UE4中的GGX采样也是用该思路来计算的:

  • 相关阅读:
    Android Studio在项目中添加assets资源目录
    Android Studio向项目中导入jar包的方法
    Android Studio 配置 androidAnnotations框架详细步骤
    Android退出所有Activity最优雅的方式
    Android数据存储之SQLite使用
    Android数据存储之SharedPreferences使用
    三种实现Android主界面Tab的方式
    Android热门网络框架Volley详解
    Android必学之数据适配器BaseAdapter
    23种设计模式UML图
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/13788527.html
Copyright © 2020-2023  润新知