Voreen (二) 入点出点计算
继第一篇Voreen的文章介绍主流程以后,第二篇介绍Raycast的第一个绘制Pass,根据代理几何体绘制出入点出点。如上次所说,OptimizedProxyGeometry负责生成表示体数据的代理几何体,其输出是三角面片,而MeshEntryExitPoints以三角面片为输入,分别绘制出光线的起点图和终点图。体绘制的一些加速方法和剪切功能可通过生成不同形式的代理几何体实现。
最基本的方式是以体数据的长方体包围盒作为绘制的代理几何体,如下面左图所示,这样光线需要从包围盒的起点遍历到终点,很多经过传递函数映射以后alpha为0,对最终结果图没有贡献的大片区域,例如空气,都进行了光线遍历,效率比较低。很直观的一个加速做法是,将体数据进行一次预处理,分成一个一个的小盒子,并计算出每个小盒子的最大值最小值等统计信息,保存下来。绘制时,比较当前光线所经过的小盒子的最大值经传递函数映射是否已经alpha为0,如果是,则这个小盒子顶点信息将不加入最终MeshEntryExitPoints计算。右下图Voreen的参数Mode为Visible Bricks即这种空域跳转的加速算法,参数Resolution 32指的是小盒子的大小,面板中还加入了传递函数属性调节,根据算法原理,调节传递函数,进行出点入点计算的三角面片也会发生变化。此外,这个环节还可以加入六个正方位的Clipping功能,使能Enable Clipping,调整包围盒六个面即可。
在三角面片生成环节,还可以实现平面裁剪功能。如下图所示,拖动Plane Widget,使用最新的平面,截掉平面的另一侧。这是是通过Geometry Clipping这个Processor实现的,这个Processor的输入是三角面片,Processor内提供的是平面三角面片中三角形逐个裁剪的方法,它的输出也是三角面片。因此,输出的三角面片可以再次被其他平面进行裁剪,从而实现多个裁剪框,流程图如下所示。
大致分析完三角面片生成环节,我们再接着看MeshEntryExitPoints这一绘制环节。这一环节除了基本的三角形绘制外,增加了一个jittering过程,即对入点位置做一个微小的扰动,滤除采样伪影,如下图环状伪影。但是微小的扰动一般会带来额外的噪声。
没有jittering,额头处有明显环状伪影
Jittering后