2

我从 Scenegraph 2009 课程笔记的Advanced IlluminationTechniques for GPU-Based Volume Raycasting中学习了一些体积渲染技术。我对对象顺序空白空间跳过感兴趣,它将边界框光栅化为许多小块,如下图所示:医疗量数据

我想知道如何实现这个?通过八叉树?或任何其他技术?我已经实现了一个简单的光线投射体积渲染程序,没有对象顺序空白空间跳过。代码片段或伪代码会有很大帮助。

4

1 回答 1

0

基本思想是将边界几何体生成为三角形网格,然后将该网格渲染到屏幕外缓冲区,以便计算用于第二遍中光线行进的开始和结束位置。

我已经使用 OpenGL 4 在 C++ 中实现了这一点,并在博客中介绍了它,包括源代码。这是一般大纲:

  • 初始化:给定具有 iso 值的体积纹理,在粗网格上生成边界几何。例如,体积可以是 256x256x200,网格单元可以跨越 8³ 体素,因此网格尺寸为 32x32x25。
    • 首先生成一个体积纹理gridTex,其中每个体素都包含最大的 iso 值。
    • 给定阈值 iso 值,生成边界几何。如果网格体素包含任何可见的东西,则认为它是活动的。对于等值面,这意味着该值高于阈值。对于 中的每一对相邻体素gridTex,如果一个处于活动状态而另一个处于非活动状态,则生成一个四边形。每次 iso 值更改时都执行此操作。
  • 第一遍:将边界几何渲染到屏幕外缓冲区,存储每个片段的最小和最大深度值。
  • 第二遍:再次将正面渲染到主缓冲区。
    • 如果不是最小深度值,则丢弃。根据最小和最大深度值计算光线的开始和结束位置。
    • 像往常一样行进射线。
于 2013-12-03T23:09:38.770 回答