使用对象顺序空白空间跳过实现体积渲染

时间:2012-08-31 13:07:55

标签: opengl 3d octree volume-rendering

我从场景图2009课程笔记的Advanced IlluminationTechniques forGPU-Based Volume Raycasting学习了一些体积渲染技术。我感兴趣的是对象顺序空白空间跳过,它将边界框栅格化为许多小块,如下图所示:medical volume data

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

1 个答案:

答案 0 :(得分:0)

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

我使用OpenGL 4和blogged about it在C ++中实现了这一点,包括源代码。以下是概要:

  • 初始化:给定具有iso值的体积纹理,在粗网格上生成边界几何体。例如,音量可以是256x256x200,网格单元可以跨越8³体素,因此网格尺寸为32x32x25。
    • 首先生成体积纹理gridTex,其中每个体素包含最大iso值。
    • 给定阈值iso值,生成边界几何。如果网格体素包含任何可见的内容,则该网格体素被视为活动。对于iso表面,这意味着该值高于阈值。对于gridTex中的每对相邻体素,如果一个处于活动状态而另一个处于非活动状态,则生成四边形。每次iso值改变时都这样做。
  • 第一遍:将边界几何体渲染到屏幕外缓冲区,存储每个片段的最小和最大深度值。
  • 第二遍:将正面再次渲染到主缓冲区。
    • 如果不是最小深度值则丢弃。根据最小和最大深度值计算光线的起始位置和结束位置。
    • 三月照常照射。