
传统建模中,3D对象都是使用表面表示,比如网格数据。光线传输通过简单的冯氏模型或者复杂的BRDF算法,使用一些表面属性,比如颜色、粗糙度、反射度等,只根据在表面上的点而被估计。这些方法通常缺乏对打在大气层或者物体内部光线的交互的能力。
和表面渲染相对应的是体渲染技术,它最初兴起于被科学可视化。CT、MRI、流体力学等。随着高效体绘制技术的发展,体数据在视觉艺术和计算机游戏中也变得越来越重要。针对模糊物体,如云、雾、火等。实现一些高质量的特效。通常结合表面渲染一起使用。
在发射吸收光学模型的基础上,通过对光的相互作用效应沿观测光线的积分来计算光的传播。对于每个像素:
一般从设备中获取的数据都是离散的三维数组,但用从连续的三维信号中获得的一个无穷小点的样本来识别每个体素更合适。通常使用最邻近滤波或者线性滤波替代理想的sinc-filter滤波。在cuda中可以使用3D纹理对象或者3D纹理引用存储体数据:
AABB,即Axis-Aligned Bounding Box,轴对齐包围盒,顾名思义,就是包围盒的每条边(2D空间中)或者每个面(3D空间中)都是轴对齐的(2D空间中)或者面对齐的(3D空间中)。AABB不具备方向性,当物体发生旋转时需要重新计算出其对应的包围盒。其优点是计算简单,但带来的误差也比较明显。其他碰撞检测的方法还有:Sphere、OBB、K-DOP等。光线与AABB相交SlabMethod算法求解过程在 https://zhuanlan.zhihu.com/p/128533024 文章中非常详细的讲解了,感谢 YivanLee 的分享。cuda体渲染示例的AABB算法实现:
光线从光源处,穿过物体,进入视点。吸收+发射模型表示光线从光源处发射出来,穿过物体时,被物体吸收。穿出物体后的光线进入视野,形成最终的颜色。
back-to-front,即光线从光源处或说物体的背面向视点处或说物体的前面前进,光线穿过物体时,不停的被吸收。与back-to-front相反的是front-to-back。相比于back-to-front,front-to-back的好处是,当累积的alpha值达到1.0或足够接近的值时,射线的进程就可提前终止。
成像面中的每个像素都是由一条光线穿过物体形成的一个颜色值。对于每条光线,使用AABB算法计算出光线与物体的交集。每条光线只对穿过物体的光线做计算,就可以避免冗余的无用计算。使用Cuda描述RayMarch算法的基本框架如下:
参考Cuda的体渲染示例,使用Qt作为显示界面库,运行效果:
参考资料
https://zhuanlan.zhihu.com/p/128533024
https://martinopilia.com/posts/2018/09/17/volume-raycasting.html
CUDA(Compute Unified Device Architecture),通用并行计算架构,是一种运算平台,包含CUDA指令集架构以及GPU内部的并行计算引擎。
只要使用一种类似于C语言的CUDA C语言,就可以开发CUDA程序,从而可以更加方便的利用GPU强大的计算能力,而不是像以前那样先将计算任务包装成图形渲染任务,再交由GPU处理。
CUDA体系结构的组成
开发库:开发库是基于CUDA技术所提供的应用开发库。
运行期环境:运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。
驱动:CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。也就是需要安装有nVIDIA硬件的电脑上安装相应的驱动来实现CUDA通用运算。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)