关于算法:计算体射线投射中的梯度

Computing the gradient in volume ray casting

请帮助我解决有关体积射线投射算法的以下问题:

在Wikipedia文章(链接)中,它说:"对于每个采样点,都会计算照明值的梯度。这些值表示体积内局部表面的方向。"

我的问题是:为什么照明值会有梯度?为什么不透明度值呢?当然,通过不透明度的变化可以更准确地描述从"填充"到"无填充"的过渡。

例如,考虑两个体素:[1][2]。 1是明亮且透明的,而2是黑暗且不透明的。在我看来,这对应于朝左的表面。我想念什么吗?


梯度矢量沿最大增加方向指向。在这种情况下,这意味着它指向照度增加最快的方向,因此在您的[1][2]示例中,2处的渐变确实指向左。

相反,如果采用不透明度的渐变,则会得到一个指向不透明度增加的方向的矢量,即"向内"。您可以取而代之以使向量朝外指向,但是仍然存在不透明性是局部的问题。它仅告诉您有关周围环境中对象的结构的信息。当您为某事物着色时,您想知道的是当您从点到点移动时,表面的照明程度如何。了解恒定照明的表面可以推断出这一点,但是从恒定不透明的表面只能推断出,如果表面和光源之间没有任何东西,照明度将达到多少。


梯度是等值面的法向向量,您可以将体积对象视为等值面的堆栈(其中很多; o),每个等值面在其表面上具有相同的标量场值;传递函数设置不透明度/红色/绿色/蓝色和标量值的对应关系,因此每个等值面都有指定的透明度和颜色。这样的表示使简单理解体积梯度在体积渲染中的作用...


在经典的光线跟踪中,您可以计算从眼睛到您面前的屏幕上的像素的光线,然后再进入到世界中以查看其撞击。确定相交点后,需要确定该点的照明特性。照明特性取决于表面法线。当您考虑它时,表面法线不仅是由交点本身决定的,而且还由周围的表面决定。

此相同原理也适用于射线投射。一旦确定射线确实击中了某些体素,就需要分析周围的体素以有效地计算可用于照明计算的"表面法线"。