Volume Rendering
感性理解
感性理解:三维空间划分成很多体素,每个体素有RGBA四种信息,表示颜色(RGB)和透明度(A)
要渲染二维表示,我们选定坐标原点,以它为球心发出很多射线
每条射线会穿过一些体素,我们沿着光线的路径进行颜色的加权统计(权重为不透明度)
每个体素对最终颜色会造成\((1-\alpha)\mathbf {color}\)的影响(不透明度可视作概率,乘以颜色)
最终得到所有颜色的累计,即得到所求的颜色
公式推导
光强部分
考虑射线穿过的一个圆柱体,里面包含一些粒子,其半径为r,视面积为A
设其中粒子的密度为\(\rho(s)\),考虑一小段长度\(\Delta s\),粒子数
\[N=E\Delta s\rho (s) \]当\(\Delta s \rightarrow 0\),我们认为粒子不会发生重叠,此时粒子所占面积
\[E_{eff}=E\Delta s\rho(s)A \]那么,其不透明度\(\alpha\)可以认为是
\[\alpha = \dfrac{E_{eff}}{E}=\Delta s \rho (s) A \]一束射线,原本光强为\(I(s)\),通过这一小段距离\(\Delta s\)后,光强\(I(s+\Delta s)=(1-\alpha)I(s)\)
理解为,光线有\(\alpha\)的概率撞到小球,之后光强为0,有\((1-\alpha)\)的概率穿过,之后光强不变
那么当\(\Delta s\)无限趋近0时,有极限形式
\[\dfrac{dI(s)}{ds}=-A\rho(s)I(s) \]设\(\sigma(s)=A\rho(s)\),表征圆柱体的特性
那么有
\[\dfrac{dI(s)}{ds}=-\sigma(s)I(s) \]这是一个微分方程,且可以分离变量
\[\dfrac{1}{I(s)}dI(s)=-\sigma(s)ds \]两边积分得
\[\ln I(s) = \int_0^{s} -\sigma(t)dt \]也就是
\[I(s)= I(0) \exp({ \int_0^{s} -\sigma(t)dt}) \]令\(T(s)=\exp({ \int_0^{s} -\sigma(t)dt})\),表征的是从原点到s的总透明度(光强剩余百分比),有
\[I(s)=I(0)T(s) \]令\(F(s)=1-I(s)\),用来表示原点到s的总不透明度
那么\(F'(s)\)就能表示s点附近瞬间的不透明度(类似3Blue1Brown,微积分的本质里,积分上界函数的导数)
\(F'(s)=I(s)\sigma(s)\)
颜色部分
现在有了关于单色光的光强的式子,我们要的是沿着这条光线看到颜色的期望
\[E(\mathbf c) = \int_{0}^{\infty} F'(s)\mathbf c(s)ds \]也就是
\[E(\mathbf c) = \int_{0}^{\infty} I(s)\sigma(s)\mathbf{c}(s)ds \]这就是最终渲染出来的颜色!
离散处理
计算机操作需要离散的做法,采用均匀采样\(t_1\)到\(t_n\)共n个点,间距\(\delta_i=t_{i+1}-t_i\)
\[T(s)=\exp({ \int_0^{s} -\sigma(t)dt}) \]改写为
\[T(t_i)= \exp({\sum\limits_{j=1}^{i-1}-\sigma({t_j)\delta_j}}) \]同样将
\[T(s)=\exp({ \int_0^{s} -\sigma(t)dt}) \]改写为
\[\begin{aligned} E(\mathbf c) &= \sum\limits_{i=1}^{n-1}(F(t_{i+1})-F(t_i))\mathbf{c}(t_i)\\ &= \sum\limits_{i=1}^{n-1}(T(t_{i})-T(t_{i+1}))\mathbf{c}(t_i)\\ &=\sum\limits_{i=1}^{n-1}T(t_i)(1-\exp({-\sigma(t_i)\delta_i)\mathbf{c}(t_i)})\\ \end{aligned} \]