我目前正在研究光线投射和体素,这是一个很好的组合。 Sebastian Scholz的Voxelrenderer实现了这个非常漂亮,但也使用OpenGL。我想知道他的配方是如何工作的;你如何使用OpenGL与光线投射和体素?光线投射的想法并不是每个像素(或线,即在Doom中)投射光线,然后绘制结果?光线投射体素和OpenGL
回答
所提到的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);
finalize
和combine
取决于数据的类型,你想直观地想象。例如,如果您想整合密度(如在X射线图像中),则combine
将是求和操作并完成归一化。如果你要形象化一个云,你可以在体素之间进行阿尔法混合。
在三维像素空间中进行光线投射不会使用像素,效率会很低。
您已经有一个数组来说明哪些空间是空的,哪些空间具有体素立方体。
因此,一个快速版本正在追踪一条线,该线检查线条方向上每个体素的emptimess,直到它达到一个完整的体素。
这需要从存储器读取几百个操作数,每个读取操作需要2-3次射线矢量乘法。
要读取十亿记忆体位置的体素大约需要1秒,所以几百个将是非常快速的,总是在一帧内。
光线投射通常使用光学检测来检测数学公式出现的空间中的分数位置,其中网格顶点基于边界框,然后是网格,在体素中,它只是逐行检查整数数组中的直线,直到你发现一个非空洞。
为什么这会出现在搜索词体素中的第一个问题?我认为这是最近的! –
为什么这是体素最新列出的问题? 2011?我按下了它在顶部的新标签。 –
- 1. 使用光线投射物体拾取
- 2. 透视光线投射
- 3. Rigidbody2D或光线投射?
- 4. ThreeJS:PlaneBufferGeometry,光线投射和面临
- 5. Three.js剪辑和光线投射
- 6. 使用光线投射进行体积渲染 - 流过体积
- 7. Lensing在我的光线投射引擎
- 8. 光线投射前的疑问
- 9. 使用CSG树进行光线投射
- 10. 错误使用光线投射
- 11. Three.js光线投射碰撞检测
- 12. 从3D将光线投射到2D
- 13. Unity3D光线投射错误方向c#
- 14. 光线投射总是击中
- 15. 使用光线投射问题移动物体
- 16. Three.js使用动画进行光线投射物体选择
- 17. 如何根据原点和方向使用光线投射来创建光线?
- 18. 在Unity中使用光线投射和定时器的问题
- 19. Three.js鼠标事件与光线投射和相交测试
- 20. 大规模光线投射和计数命中
- 21. WPF光标投射问题
- 22. Opengl光线方向
- 23. 光线投射点多边形线对齐边缘
- 24. 光线追踪:仅使用单光线代替反射光线和折射光线
- 25. Babylon.js删除球体的光线反射
- 26. 光线投射相交与无限平面与法线和偏移
- 27. OpenGL与光和法线的第一步
- 28. OpenGL的光线追踪和网
- 29. openGL的射线挑
- 30. 光栅字体glScalef,OpenGL
所以最后,raycasting是由GPU上的片段着色器完成的,对吧? – RobotRock
是的,这是唯一能够以理智的方式完成这件事的地方;那么,人们也可以在几何/顶点着色器的组合中做到这一点,但这会很尴尬。 – datenwolf