2011-06-26 63 views
2

我目前正在研究光线投射和体素,这是一个很好的组合。 Sebastian Scholz的Voxelrenderer实现了这个非常漂亮,但也使用OpenGL。我想知道他的配方是如何工作的;你如何使用OpenGL与光线投射和体素?光线投射的想法并不是每个像素(或线,即在Doom中)投射光线,然后绘制结果?光线投射体素和OpenGL

回答

5

所提到的raycaster是Voxelrenderer,即一种方法可视化体积数据,如存储在3D纹理中的不透明度。 Doom的光线投射算法还有另一个意图:对于屏幕上的每个像素,都会找到地图的第一个平面表面并绘制其中的颜色。现代GPU的光栅化功能已经放弃了raycasters的使用。

实时可视化体积数据仍然是由特殊硬件完成的任务,通常在医学和测地成像系统中可以找到。基本上那些大容量的RAM(几十GB)容纳RGBA数据。然后,对于屏幕上的每个像素,射线会通过该射线投射,并在该射线上集成RGBA数据。 GPU Voxelrenderer通过片段着色器执行相同的操作;伪代码:

vec4f prev_color; 
for(i=0; i<STEPS; i++) { 
    p = ray_direction * i*STEP_DELTA; 
    voxel = texture3D(volumedata, p); 
    prev_color = combine(voxel, prev_color); 
} 
final_color = finalize(prev_color); 

finalizecombine取决于数据的类型,你想直观地想象。例如,如果您想整合密度(如在X射线图像中),则combine将是求和操作并完成归一化。如果你要形象化一个云,你可以在体素之间进行阿尔法混合。

+0

所以最后,raycasting是由GPU上的片段着色器完成的,对吧? – RobotRock

+0

是的,这是唯一能够以理智的方式完成这件事的地方;那么,人们也可以在几何/顶点着色器的组合中做到这一点,但这会很尴尬。 – datenwolf

0

在三维像素空间中进行光线投射不会使用像素,效率会很低。

您已经有一个数组来说明哪些空间是空的,哪些空间具有体素立方体。

因此,一个快速版本正在追踪一条线,该线检查线条方向上每个体素的emptimess,直到它达到一个完整的体素。

这需要从存储器读取几百个操作数,每个读取操作需要2-3次射线矢量乘法。

要读取十亿记忆体位置的体素大约需要1秒,所以几百个将是非常快速的,总是在一帧内。

光线投射通常使用光学检测来检测数学公式出现的空间中的分数位置,其中网格顶点基于边界框,然后是网格,在体素中,它只是逐行检查整数数组中的直线,直到你发现一个非空洞。

+0

为什么这会出现在搜索词体素中的第一个问题?我认为这是最近的! –

+0

为什么这是体素最新列出的问题? 2011?我按下了它在顶部的新标签。 –