图形学

求交运算

大多数求交无外基本就是写出射线方程和被交物体的方程,然后联立求解,根据一直条件是否符合
射线方程

\[ Ray = O+ D*t \tag{t>0, t<+} \]

球方程

\[ \left(T- Origin \right)= R^2 \]

平面方程

\[\left(P-Pos_0 \right)* \vec{n} = 0 \]

1. 射线与球的求交
求交就好了,最后对t分情况讨论 t的大小然后取值

2.射线与三角形的求交

传统求交方法即联立,求得下式

然后对于t求出的交点坐标是否在三角形内还需进一步判定,可用重心坐标求解

还有一种更高效的方法求交

Möller-Trumbore 算法的核心思想是一步到位的计算出光线是否与三角形相交,主要利用到的知识点是三角形的重心坐标。它是由Tomas Moller 和Ben Trumbore 于1997 年在一篇题名为“Fast, Minimum Storage Ray/Triangle Intersection”的论文中介绍

由三角形内一点都可以由一下方程表示

\[P = \left(1 - \alpha- \beta \right)A + \alpha B+ \beta C \]

所以射线与三角形求交可写成如下

\[O+ D*t = \left(1 - \alpha- \beta \right)A + \alpha B+ \beta C \]

化简

\[\vec{AO} = \alpha\vec{AB} + \beta\vec{AC} - tD \]

写成矩阵形式

\[\begin{pmatrix} \vec{AB}& \vec{AC}& -\vec{D} \end{pmatrix} \begin{pmatrix} \alpha\\ \beta\\ t \end{pmatrix} = \vec{AO} \]

求解\(\alpha、\beta、t\)问题就转换为了求解该方程组问题了,只需要使用克拉默法则即可求出\(\alpha、\beta、t\)三个值

克拉默法则
若线性方程的系数矩阵可逆(非奇异),即系数行列式 D≠0,则线性方程有唯一解,其解为
\(x_i = \frac{D_i}{D}\)

最后对比\(\alpha、\beta、t\)是否在\(\left(0,1\right)\)内即可 (具体原因可学习重心坐标)

蒙特卡洛积分

\[L_o = \int_\omega f_r * L_i*(w_i * n)*d_{w_i} \]

渲染方程需要求解定积分,被积函数通常都是多个维度的复杂函数,我们无法求出解析解。为此我们需要使用蒙特卡洛积分来求解渲染方程。

蒙特卡洛积分形式如下:

\[\int^b _{a} f(x)dx = \frac{1}{N} \sum_{i=1}^N \frac{f(x_i)}{pdf(x_i)} \]

其中所选取的样本点,服从概率 pdf(x)

至于为什么要除以pdf, 这里解释非常好https://learnopengl-cn.github.io/07%20PBR/03%20IBL/02%20Specular%20IBL/

从该图中我们可以看出,如果我们对人口任意随机采样,那么挑选身高为 1.70 的人口样本的可能性更高,而样本身高为 1.50 的概率较低。

对其进行求期望,易知期望是无偏的,求其方差,可知标准差和\(\frac{1}{\sqrt{n}}\)成正比,因此如果想要将误差降低1/2,需要提高4倍的采样数

逆变换采样

\(1.\)对于概率密度函数pdf(x),计算它的分布函数cdf(x) (累次积分),如等式(14)所示;
\(2.\)计算\(cdf(x)\)的反函数\(cdf^{-1}(x)\)
\(3.\)对于一个均匀分布的随机数\(\xi\),则X=\(cdf^{-1}(\xi)\), 就是符合该概率分布的随机数

举栗

例如在半球区域上的cos加权的半球采样,有 \(f(x) = c*cos\theta\)

\[\int_\omega c*cos\theta*d_{w_i} = \int_0 ^{2\pi} \int_0 ^{\frac{\pi}{2}} c*cos\theta* sin\theta*d\theta d\phi = 1 \]

可求得c = \(\frac{1}{\pi}\)

所以取\(pdf(x) = \frac{1}{\pi}*cos\theta * sin\theta\)

对pdf求的边缘分布后,运用逆变换,可得

\[\theta = cos^{-1}\sqrt\xi_1 \]

\[\phi = 2\pi\xi_2 \]

然后带回极坐标

\[x = sin\theta cos\phi \]

\[y = sin\theta sin\phi \]

\[z = cos\theta \]

便可得出采样的方位角
`
float4 CosineSampleHemisphere( float2 E )
{

float Phi = 2 * PI * E.x;
float CosTheta = sqrt( E.y );
float SinTheta = sqrt( 1 - CosTheta * CosTheta );
float3 H;
H.x = SinTheta * cos( Phi );
H.y = SinTheta * sin( Phi );
H.z = CosTheta;

float PDF = CosTheta * (1.0 /  PI);

return float4( H, PDF );}

`

SIR

与逆变换采样一样, SIR 是一种在给定 PDF 的情况下生成样本的方法。 尽管 SIR 对目标 PDF 本身的要求要少得多。 然而,这种方法只是对目标分布进行近似采样,并不是真正从目标 PDF 中抽取样本

阴影

PCF -> PCSS->VSSM->MSM

PCSS

  1. block search
  2. 计算\(W_{penumbra} = \frac{(d_{receiver} - d_{blocker})*w_{Light} }{d_{Blocker}}\)
  3. PCF ->就是最后对阴影的采样做了一次卷积

VSSM (Variance Soft Shadow Mapping)

改善PCSS第一步和第三步时采样时的消耗

只需得到 深度的EX、 \(D(X) = E(X^2) - E(X)^2\)
其中深度的平方在生成 shadow map时即可一块生成了

对于期望的求值,可考虑MINPMAP或者SAT
SAT:
一维情况

其实就是预计算


对于二维情况其实也很简单,

只需要先对每行做一次前缀和,然后对每一列做一次前缀和 即可生成SAT

都完成后
就是求大于深度t(没有遮挡阴影点)的概率了,考虑切比雪夫不等式(甚至不需要知道分布函数)

计算概率如下:

切比雪夫不等式 可认为为约等于

生成后,开始解决问题

PCSS第三个步骤的问题有上式即可解的,下面考虑第一个步骤采样消耗问题

考虑解决blocker search采样问题

其中不遮挡阴影点的比例\(\frac{N_1}{N}\) 可有上述的切比雪夫不等式求解
小心求证,大胆假设! 直接假设$Z_{unocc} $ 是阴影点的深度,有一点点道理 (绝大多数阴影接收点是个平面)

然后就只剩一个未知数了 \(Z_occ\)
(\(Z_{Avg}做一次范围查询即可完成\))

目前主流使用的还是PCSS,虽然有噪声(对于blocker search采样可随机采样几个点)但可接受

MSM(Moment Shadow Mapping)

VSSM其实还存在一些问题,因为我们假设其深度分布是单峰值的,当pdf为多峰值时就会出现不准的情况
如下附图


带来的问题

注意右侧面积为未遮挡的概率

所以为了解决这一假设带来的问题,MSM提出了距的概念,即用多个距来拟合分布函数,具体拟合过于复杂暂且不说


不同于VSSM 当我们有了CDF, 那么对于哪部分的概率就可以很容易得出
然后进行VASSM剩下的步骤即可

用博客园写latex太累了,转战知乎。。

posted @ 2023-10-28 10:24  a__leaf  阅读(192)  评论(1)    收藏  举报