关于IBL光照与SH球谐光照中的采样方法原理分析(一) 您所在的位置:网站首页 learnopengl-cn 关于IBL光照与SH球谐光照中的采样方法原理分析(一)

关于IBL光照与SH球谐光照中的采样方法原理分析(一)

2023-04-15 03:07| 来源: 网络整理| 查看: 265

前置知识蒙特卡洛积分

我们一般采用离散和来代替积分的结果,这篇文章是介绍在计算机中我们常用的积分公式

蒙特卡罗积分推导 - 知乎 (zhihu.com)

逆CDF采样

如何根据一个概率密度函数来生成采样点,逆CDF采样原理给了我们一种实现方法

逆变换采样原理推导 - 知乎 (zhihu.com)

IBL中的采样方法

在IBL中有两种采样方法一种是基于GGX的重要性采样,另一种是均匀采样,我们先来介绍一下GGX重要性采样。

IBL中均匀采样计算diffuse irradiance

给出渲染方程:

将漫反射项单独拿出来:

计算漫反射的irradiance,我们需要着色点的上半圆进行均匀采样

我们将dw换算成sinθdθdΦ,可以得到下面的公式:

learnopengl里面直接用黎曼和进行采样的,这样的采样方法会将采样点在极点处堆积。

图源:https://www.bilibili.com/video/BV1Td4y1H7cE/?spm_id_from=333.999.0.0&vd_source=c7e7c8a5c6c4f5688fb8cf2fa331d7ce

那么我们如何才能获得一个均匀分布的采样呢?答案是按照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 实验室设备网 版权所有