关于IBL光照与SH球谐光照中的采样方法原理分析(一) | 您所在的位置:网站首页 › learnopengl-cn › 关于IBL光照与SH球谐光照中的采样方法原理分析(一) |
前置知识蒙特卡洛积分 我们一般采用离散和来代替积分的结果,这篇文章是介绍在计算机中我们常用的积分公式 蒙特卡罗积分推导 - 知乎 (zhihu.com) 逆CDF采样如何根据一个概率密度函数来生成采样点,逆CDF采样原理给了我们一种实现方法 逆变换采样原理推导 - 知乎 (zhihu.com) IBL中的采样方法在IBL中有两种采样方法一种是基于GGX的重要性采样,另一种是均匀采样,我们先来介绍一下GGX重要性采样。 IBL中均匀采样计算diffuse irradiance给出渲染方程: 将漫反射项单独拿出来: 计算漫反射的irradiance,我们需要着色点的上半圆进行均匀采样 我们将dw换算成sinθdθdΦ,可以得到下面的公式: learnopengl里面直接用黎曼和进行采样的,这样的采样方法会将采样点在极点处堆积。 那么我们如何才能获得一个均匀分布的采样呢?答案是按照dA的大小来决定采样的概率大小,球的表面积计算为 4\pi r^{2}, 我们在一个单位圆上半球的表面积为 2\pi ,那么采样半球面的均匀分布概率为 \frac{1}{2\pi} ,由 dA = sin\theta d\theta d\phi ,我们可以得到在dA上的采样概率为 \frac{1}{2\pi}sin\theta d\theta d\phi ,即采样的概率密度函数为: p(\theta,\phi)=\frac{1}{2\pi}sin\theta d\theta d\phi 接着我们来计算θ和Φ的边缘概率密度函数: p(\theta) = \int_{0}^{2\pi}p(\theta,\phi)d\phi=sin\theta\\ p(\phi) = \int_{0}^{\pi/2}p(\theta,\phi)d\theta=\frac{1}{2\pi}\\ 进一步我们求出他们的概率分布函数: P(\theta) = \int_{0}^{\theta}p(\theta)d\theta = 1-cos\theta\\ P(\phi) = \int_{0}^{\phi}p(\phi)d\phi = \frac{\pi\phi}{2}\\ 接下来我们就要用到逆CDF采样了,假设有u,v两个随机变量符合[0,1]的均匀分布(在计算机中这是很容易得到的数据),令u = P(θ),v = P(Φ),然后我们可得到: \theta = arccos(1-u)\\ \phi=\frac{2v}{\pi}\\ 后面我们只要随机生成u,v,就可以得到θ和Φ了。 给出伪代码: int sumSamples = 500; for(int i = 0 ; i什么来决定这个lobe中法线的分布呢?那就是GGX法线分布函数: 简单的介绍一下,α是微表面的粗糙程度,θh是半程向量和宏观法线的夹角,他的图像长成这样: 我们直接给出根据GGX公式得到的法线概率密度公式: 然后也是利用逆CDF原理才对上面的公式进行分解,直接给出结果(不想自己算): 后面我们可以根据需求来指定采样的数量,在learn opengl中代码长这样: 参考: 镜面IBL - LearnOpenGL CN (learnopengl-cn.github.io) How to generate uniformly random points on n-spheres and in n-balls | Extreme Learning 70_OpenGL_IBL1_哔哩哔哩_bilibili |
CopyRight 2018-2019 实验室设备网 版权所有 |