光线投影体素和OpenGL

Rob*_*ock 2 opengl voxel raycasting

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

dat*_*olf 5

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

实时可视化体积数据仍然是由特殊硬件完成的任务,通常在医疗和测地成像系统中找到.基本上那些是大容量的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);
Run Code Online (Sandbox Code Playgroud)

finalizecombine取决于数据的类型和您想要的可视化.例如,如果要整合密度(如在X射线图像中),combine将进行求和操作并完成标准化.如果您想要一个云,您可以在体素之间进行alpha混合.