外表均匀采样
球体
球体外表上的点 (x,y,z)(x,y,z)(x,y,z) 能够经过半径 RRR ,方位角 ∈[0,2]\phi\in [0,2\pi]∈[0,2] ,天顶角 ∈[0,]\theta\in [0,\pi]∈[0,] 来界说。
x=sincosy=sinsinz=cosx = \sin{\theta} \cos{\phi} \\ y = \sin{\theta} \sin{\phi} \\ z = \cos{\theta}x=sincosy=sinsinz=cos
假如仅仅均匀随机生成方位角 \phi 和 天顶角 \theta ,在球体外表所采样到的点,实践上并不是均匀散布,而是在南北极邻近更密布的散布。这是因为球体外表的微分面积 dA=r2sindddA = r^2\sin{\theta}d{\theta} d\phidA=r2sindd 不仅一起受到微分方位角和微分天顶角的影响,还受到了天顶角正弦值 sin\sin{\theta}sin 的影响。当天顶角 \theta 贴近极轴即 = \theta= \pi= 时,sin=1\sin{ \theta} = 1sin=1 ,面积最大。
由微分立体角的界说 d=sinddd\omega = \sin \theta d \theta d \phi d=sindd 能够得出球体的外表积。
∫d=∫02∫0sindd=4\int_{\Theta} d \omega=\int_{0}^{2 \pi} \int_{0}^{\pi} \sin \theta d \theta d \phi = 4\pi∫d=∫02∫0sindd=4
因而在球体外表均匀采样入射方向 i\omega_ii 时,其概率密度函数为面积的倒数,是一个常数。由此能够推出在一个微分面积 dAdAdA 内均匀采样的概率密度函数。
pdf(i)=14PA=14dApdf(\omega_i) = \frac{1}{4\pi} \\ P_A = \frac{1}{4\pi}dApdf(i)=41PA=41dA
经过二维独立连续随机变量方位角 \phi 和天顶角 \theta 来完成在球体外表的均匀采样,需求核算出用来参数化二者的概率密度函数 pdf(,)pdf(\theta,\phi)pdf(,) ,那么首要求出对应的边际密度函数。
f()=∫02pdf(,)d=sin2f()=∫0pdf(,)d=12f(\theta)=\int_{0}^{2\pi} pdf(\theta, \phi) d \phi=\frac{\sin \theta}{2} \\ f(\phi)=\int_{0}^{\pi} pdf(\theta, \phi) d \theta = \frac{1}{2\pi}f()=∫02pdf(,)d=2sinf()=∫0pdf(,)d=21
根据边际密度函数求出累积散布函数 FX(x)F_{X}(x)FX(x)。
F()=∫0f()d=1−cos2F_{\theta}(\theta)=\int_{0}^{\theta} f(\hat{\theta}) d \hat{\theta} = \frac{1-\cos \theta}{2}F()=∫0f()d=21−cos
F()=∫0f()d=2F_{\phi}(\phi)=\int_{0}^{\phi} f(\hat{\phi}) d \hat{\phi}=\frac{\phi}{2 \pi}F()=∫0f()d=2
对累积散布函数做逆变换取样,得到累积散布函数的反函数 FX−1(x)F_X^{-1}(x)FX−1(x)
F−1(x)=arccos(1−2x)F_{\theta}^{-1}(x)=\arccos (1-2 x)F−1(x)=arccos(1−2x)
F−1(x)=2xF_{\phi}^{-1}(x)=2 \pi xF−1(x)=2x
关于连续随机变量方位角 \phi 和天顶角 \theta ,假如要获得球体外表上均匀散布的点,只需求给定均匀散布变量 1,2∼Uniform[0,1]\xi_1, \xi_2 \sim Uniform[0,1]1,2∼Uniform[0,1] 。
=F−1(1)=arccos(1−21)=F−1(2)=22\theta =F_{\theta}^{-1}(\xi_1) = \arccos(1-2\xi_1) \\ \phi =F_{\phi}^{-1}(\xi_2) = 2\pi\xi_2=F−1(1)=arccos(1−21)=F−1(2)=22
转为三维坐标可得
x=21cos(22)y=21sin(22)z=1−21x = \sqrt{2\xi_1} \cos{(2\pi \xi_2)} \\ y = \sqrt{2\xi_1} \sin{(2\pi \xi_2)} \\ z = \sqrt{1-2\xi_1}x=21cos(22)y=21sin(22)z=1−21
三角形
取两个规范正态散布变量 u,v∼Uniform[−1,1]u,v \sim Uniform[-1,1]u,v∼Uniform[−1,1] 。运用三角形重心坐标,咱们能够经过两个随机变量,使得重心坐标 ,,\alpha , \beta, \gamma,, 线性组合的成果落在三角形内,且三者散布是均匀的,即可完成在三角形内均匀采样。
=1−u,=u⋅v,=u⋅(1−v) = 1 – \sqrt{u}, = \sqrt{u} \cdot v, = \sqrt{u} \cdot (1 – \sqrt{v})=1−u,=u⋅v,=u⋅(1−v)
设 s=us = \sqrt{u}s=u ,则能够进一步简化公式。
=1−s,=s⋅v,=1−− = 1 – s, = s \cdot v, = 1 – – =1−s,=s⋅v,=1−−
矩形
取两个规范正态散布变量 u,v∼Uniform[−1,1]u,v \sim Uniform[-1,1]u,v∼Uniform[−1,1] 。从矩形 ABCDABCDABCD 中选取相邻两边 AB,ADAB,ADAB,AD。
P=u⋅AB+v⋅ADP = u \cdot AB + v \cdot ADP=u⋅AB+v⋅AD
回绝采样法
回绝采样法是一个有效但不太优雅的算法。例如在单位球体内均匀采样时,随机生成一个规范立方体规模的点,核算该点到球心的距离,大于球体半径则从头随机生成点。
再例如在一个二维三角形内均匀采样,首要确认三角形的围住盒规模,即从三角形三个顶点中选取最大最小 xxx 坐标和 yyy 坐标。
max=(xmax,ymax)min=(xmin,ymin)max = (x_{max}, y_{max}) \\ min = (x_{min}, y_{min})max=(xmax,ymax)min=(xmin,ymin)
取两个规范正态散布变量 u,v∼Uniform[−1,1]u,v \sim Uniform[-1,1]u,v∼Uniform[−1,1] ,随机生成一个围住盒内的点。由最大坐标和最小坐标求出在围住盒内的均匀取样点 PPP 。再经过重心坐标或者叉乘法等办法判断该点是否三角形内,不在则从头随机生成点
P=(xmin+u⋅xmax,ymin+v⋅ymax)P = (x_{min} + u \cdot x_{max}, y_{min} + v \cdot y_{max})P=(xmin+u⋅xmax,ymin+v⋅ymax)
重要性采样
蒙特卡洛积分办法的路径追寻在半球面上进行采样。已知球面上均匀采样的三维坐标,同理可求得在半球上采样时,给定均匀散布变量 1,2∼Uniform[0,1]\xi_1, \xi_2 \sim Uniform[0,1]1,2∼Uniform[0,1] ,求出满意其累积散布函数的随机变量 ,\theta, \phi,,然后得到采样入射方向的三维坐标 x,y,zx,y,zx,y,z
=arccos(1−1)\theta = \arccos(1-\xi_1)=arccos(1−1)
=22\phi= 2\pi\xi_2=22
x=1cos(22)x = \sqrt{\xi_1} \cos{(2\pi \xi_2)}x=1cos(22)
y=1sin(22)y = \sqrt{\xi_1} \sin{(2\pi \xi_2)}y=1sin(22)
z=1−1z = \sqrt{1-\xi_1}z=1−1
均匀采样
若在半球面上进行均匀采样,则概率密度函数 pdf(x)pdf(x)pdf(x)应该是各处相同的常数 CCC 。将积分域转化到半球面上,即可求出常数 CCC 。
∫+Cdx=1\int_{\Omega^+} C d x=1∫+Cdx=1
∫02∫02Csindd=1\int_{0}^{2 \pi} \int_{0}^{\frac{\pi}{2}} C\sin \theta d \theta d \phi = 1∫02∫02Csindd=1
C=12C=\frac{1}{2\pi}C=21
cosine-weighted 采样
对 cosine\text{cosine}cosine 项进行重要性采样,即 PDF\text{PDF}PDF 与 cosine\text{cosine}cosine 成正比。 将积分域转化到半球面上,即可求出系数 ccc 。
pdf(x)=c⋅cospdf(x) = c \cdot \cos{\theta}pdf(x)=c⋅cos
∫+c⋅cosd=1\int_{\Omega^+}c \cdot \cos{\theta}d\omega = 1∫+c⋅cosd=1
∫02∫02c⋅cossindd=1\int_{0}^{2 \pi} \int_{0}^{\frac{\pi}{2}} c \cdot \cos{\theta} sin{\theta} d \theta d \phi = 1∫02∫02c⋅cossindd=1
c=1c = \frac{1}{\pi}c=1
Cook-Torrance BRDF 重要性采样
漫反射项
经过 Cook-TorranceBRDF\text{Cook-Torrance BRDF}Cook-TorranceBRDF 中漫反射的 BRDF\text{BRDF}BRDF ,咱们能够核算得出其烘托方程和蒙特卡洛积分办法下的烘托方程。
fr(p,o,i)=1f_r(p, \omega_o,\omega_i) = \frac{1}{\pi}fr(p,o,i)=1
Lo(p,o)=cosiLi(p,i)L_o(p,\omega_o) = \frac{\cos \theta_{\mathrm{i}}}{\pi} L_{\mathrm{i}}\left(\mathrm{p}, \omega_{\mathrm{i}}\right)Lo(p,o)=cosiLi(p,i)
Lo(p,o)≈1N∑i=1NcosiLi(p,i)pdf(i)L_o(p,\omega_o) ≈ \frac{1}{N} \sum_{i=1}^{N}\frac{\cos \theta_{\mathrm{i}}}{\pi} \frac{ L_i(p, \omega_i)}{pdf(\omega_i)}Lo(p,o)≈N1i=1∑Ncosipdf(i)Li(p,i)
观察烘托方程,咱们能够对漫反射选用 cosine-weighted\text{cosine-weighted}cosine-weighted 采样以加速烘托方程的收敛。
镜面反射项
镜面反射项中能够排除需求知道采样方向才能核算的菲涅尔项、非连续函数的几许项,因而咱们只需求使概率散布函数近似法线散布函数即可。
根据法线散布函数 D(h)D(\omega_h)D(h) 的物理意义——每单位立体角 dd\omegad 、每单位面积 dAdAdA 上所有法向量为 h\omega_hh 的微平面的面积,约定微外表中契合法线散布的微外表投影在宏观平面的面积为1,因而咱们能够得到其关于法向量为 h\omega_hh 的概率密度函数。
∫+coshD(h)dh=1\int_{\Omega^+}\cos{\theta_h}D(\omega_h)d\omega_h=1∫+coshD(h)dh=1
经过推导可得出法线和入射方向二者的换算联系,经过转化得到关于入射方向 i\omega_ii 的镜面反射项 pdf(i)pdf(\omega_i)pdf(i)。
dhdi=14(i⋅h)\frac{d\omega_h}{d\omega_i} = \frac{1}{4(\omega_i \cdot \omega_h)}didh=4(i⋅h)1
∫+cosh4(i⋅h)D(h)di=1\int_{\Omega^+}\frac{\cos{\theta_h}}{4(\omega_i \cdot \omega_h)}D(\omega_h)d\omega_i=1∫+4(i⋅h)coshD(h)di=1
pdf(i)=cosh4(i⋅h)D(h)pdf(\omega_i) =\frac{\cos{\theta_h}}{4(\omega_i \cdot \omega_h)}D(\omega_h)pdf(i)=4(i⋅h)coshD(h)
但在核算采样方向时咱们无需运用 pdf(i)pdf(\omega_i)pdf(i) ,还是运用前面已经核算好的 pdf(h)pdf(\omega_h)pdf(h) ,经过该 PDF 推导出法向量 h\omega_hh 后,再以 h\omega_hh 为镜面反射法线核算咱们终究需求的入射方向 i\omega_ii 即可。
假如运用不同的法线散布函数,显然随机采样的方向核算公式也是不同的,积分核算进程较为杂乱,这儿不一一核算了。
对光源重要性采样
当咱们要对光源进行直接采样时,需求将原本烘托方程中对微分立体角的微元,换源成在光源上的面积微元。
d=sinddd\omega = \sin{\theta}d\theta d\phid=sindd
咱们知道微分立体角 dd\omegad 能够认为是一个微小矩形,假如存在矩形光源,则能够根据相似三角形准则,得到单位半球的半径的平方与着色点 xxx 到矩形光源的距离平方之比,即为 dd\omegad 的面积与映射到光源上的面积 dA⋅cosdA \cdot \cos{\theta}dA⋅cos 之比,然后得到新的烘托方程。
ddA⋅cos=1∥x−x′∥2\frac{d\omega}{dA \cdot \cos{\theta}} = \frac{1}{\left\| x-x^{\prime} \right\|^2}dA⋅cosd=∥x−x′∥21
Lo≈1N∑i=1NLicosicoso1∥x−x′∥21pdfdAL_o ≈ \frac{1}{N} \sum_{i=1}^{N} L_i \cos{\theta_i} \cos{\theta_o} \frac{1}{\left\| x-x^{\prime} \right\|^2} \frac{1}{pdf} dALo≈N1i=1∑NLicosicoso∥x−x′∥21pdf1dA
关于面光源,在面光源上均匀采样则其概率密度函数是一个常数。关于球体光源,相比面光源较为杂乱,在此不做核算。
pdf=1Areapdf = \frac{1}{Area}pdf=Area1
反走样
SSAA
超采样抗锯齿 Super-SamplingAnti-aliasing\text{Super-Sampling Anti-aliasing}Super-SamplingAnti-aliasing 的原理是提升采样的分辨率。例如先上采样 222 \times 222 分辨率,则需求四倍的帧缓冲,然后再下采样到本来的分辨率。
MSAA
以 22MSAA2 \times 2 \text {MSAA}22MSAA 为例,多重采样抗锯齿 Multi-SamplingAnti-aliasing\text{Multi-Sampling Anti-aliasing}Multi-SamplingAnti-aliasing 将像素分为四个子像素,根据三角形覆盖四个子像素的比例决议该像素色彩。
例如一个三角形占有了四分之一个子像素,则该三角形为该像素奉献了四分之一的自身色彩值。但由于需求进行深度测验,每个子像素也都需求存储一个深度值,因而深度缓冲将变为本来的 222 \times 222 倍。考虑到多个三角形再单个像素区域有或许发生各占有一部分子像素的状况,因而色彩缓冲也将变为本来的 222 \times 222 倍。
三角形滤波
光线追寻的反走样算法,通常分为两种,一种是先均匀采样再加权累加。一种是先按概率密度采样,再累加均匀。
后者的办法中,显然最合理的光线采样散布应该是边际稀少,越接近中心越密布。这种散布理论上 sinc\text{sinc}sinc 函数是最优的,其能过滤掉高频信号,保留低频信号。可是完美的 sinc\text{sinc}sinc 函数只存在于理论,实践工程中只能近似模拟,例如三角形滤波。
sinc(x)=sin(x)/xsinc(x) = sin(x)/xsinc(x)=sin(x)/x
∫−∞+∞sinc(x)=∫−∞+∞sinc(x)=1\int_{-\infty}^{+\infty} sinc(x)=\pi \\ \\ \int_{-\infty}^{+\infty} sinc(\pi x)=1∫−∞+∞sinc(x)=∫−∞+∞sinc(x)=1
关于三角形滤波,其在界说域 [−1,1][-1,1][−1,1] 中满意积分为 111 ,然后能够得出其边际密度函数 f(x)f(x)f(x) 。假如要得到一个契合三角形滤波散布的变量,只需求给定均匀散布变量 x∼Uniform[0,1]x \sim Uniform[0,1]x∼Uniform[0,1] 。求出其累积散布函数 FX(x)F_{X}(x)FX(x),然后做逆变换取样得到其反函数 FX−1(x)F_{X}^{-1}(x)FX−1(x) ,而反函数 FX−1(x)F_{X}^{-1}(x)FX−1(x) 便是咱们想要的随机变量 XXX。
f(x)={x+1,−1≤x≤01−x,0≤x≤1f(x) = \left\{\begin{array}{ll} x+1, &-1≤x≤0\\ 1-x, &0≤x≤1 \end{array}\right.f(x)={x+1,1−x,−1≤x≤00≤x≤1
FX(x)=∫−∞xf(t)dt={12(x+1)2,−1≤x≤0−12(x−1)2+1,0≤x≤1F_{X}(x) = \int_{-∞}^{x} f(t)dt = \left\{\begin{array}{ll} \frac{1}{2}(x+1)^2, &-1≤x≤0 \\ -\frac{1}{2}(x-1)^2+1, &0≤x≤1 \end{array}\right.FX(x)=∫−∞xf(t)dt={21(x+1)2,−21(x−1)2+1,−1≤x≤00≤x≤1
X=FX−1(x)={2x−1,0≤x≤121−2−2x,12≤x≤1X = F_{X}^{-1}(x) = \left\{\begin{array}{ll} \sqrt{2x} -1, &0≤x≤\frac{1}{2} \\ 1-\sqrt{2-2x}, &\frac{1}{2}≤x≤1 \end{array}\right.X=FX−1(x)={2x−1,1−2−2x,0≤x≤2121≤x≤1
假如将每个像素划分为 222 \times 222 的子像素,分别对每个子像素应用三角形滤波,然后累加后取均匀值,即可得到梯形滤波。
纹路采样
采样纹路时需求留意,咱们获取了三角形的 UVUVUV 坐标和对应纹路贴图巨细后,所核算出的纹路坐标是整形,因而小数部分会舍去。而纹路坐标的规模是 x∼[0,width],y∼[0,height]x \sim [0,width],y \sim [0,height]x∼[0,width],y∼[0,height] 因而需求为纹路坐标各个维度加 0.50.50.5 以完成四舍五入,获取距离采样点最近的纹路坐标。
双线性性插值
以上办法显然不行精准,仅仅获取了最近的纹路坐标,而双线性插值则将周围的纹路坐标同时考虑进来,进行加权累加。
以采样点地点像素为重心,获取其周围四个象限的八个像素。首要根据象限位置决议要对哪个象限的四个像素进行加权累加。
将四个像素的中心之间的规模视为一个新的像素坐标系,则左下角便是 (0,0)(0,0)(0,0) ,采样点在坐标系中的坐标 (s,t)(s,t)(s,t) 便是各个像素的奉献。先在 xxx 轴上以 sss 对四个像素两两线性插值,终究在 y 轴上以 t 对两个成果进行线性插值。
mipmap
对纹路以相邻四个像素为单位进行加权均匀,终究得到一个原图画四分之一巨细的纹路,以此类推,终究得到一个金字塔结构的纹路调集,这便是 mipmap。
mipmap 常用于解决纹路瑕疵,例如过远的三角形,却占有很大一块纹路规模。假如根据远近,获取关于层级的mipmap纹路,就能够一定程度上成果这个问题。
三线性插值
mipmap\text{mipmap}mipmap 显然是不行完美的,各层级之间的联接过渡或许过于僵硬。因而在双线性插值的基础上,核算 mipmap\text{mipmap}mipmap 的层级不再只取整数,而是答应 1.31.31.3 这种层级的存在,咱们能够运用 [0,1][0,1][0,1] 的层级之差对相邻层级再做一次线性插值,也被称为三线性插值。
后处理
mipmap 近似高斯滤波
该技术原理不在此赘述,详情能够阅读另一篇文章
图形学论文阅读 – 运用盒型滤波图画金字塔实时近似大卷积核 – 掘金 ()