光线追踪技术以及c++实现心得
光线追踪技术以及c++实现心得
光线追踪原理
光线追踪是一种基于物理原理的渲染方法,它通过模拟光线在场景中的传播来生成图像。光线追踪的核心思想是将场景中的物体看作是光源和材质的组合,然后通过计算光线与物体的交点来确定像素的颜色。
轴对齐包围盒AABB
在光线追踪中,AABB(Axis-Aligned Bounding Box)是一种常用的加速结构,用于快速判断光线是否与物体相交。AABB是一个包围盒,它与物体的每个面都平行,并且包围了物体的所有顶点。通过判断光线与AABB的相交情况,可以快速排除大部分不相交的物体,提高光线追踪的效率。
大家还记得三维空间中的射线参数方程吗:
其中,
利用平板法,可以得知射线是否与AABB相交,平板法的基本思想是通过计算射线与AABB的每个面相交的参数范围,然后检查这些范围是否重叠。
compute (tx0, tx1)
compute (ty0, ty1)
compute (tz0, tz1)
return overlap ? ((tx0, tx1), (ty0, ty1), (tz0, tz1))
加速结构bvh
在光线追踪中,其实大部分时间都浪费在判断光线是否与场景中的三角形面相交上,当模型面数多起来的时候,速度会显著变慢,这是就要用到BVH(Bounding Volume Hierarchy)是一种常用的加速结构,用于快速判断光线是否与物体相交。BVH是一种树形结构,它将场景中的物体划分为若干个小的包围盒,然后将这些包围盒按照一定的规则组织成一棵树。通过判断光线与BVH的相交情况,可以快速排除大部分不相交的物体,提高光线追踪的效率。
strcut BVH_Node{
AABB box;
BVH_Node* left;
BVH_Node* right;
int n,index;
}
上面是一个简单定义的bvh节点类型,其中n是该节点所包含三角形个数,只有在该节点为叶子节点才有用,不为叶子节点则n为0。 index是该节点所包含的第一个三角形的索引。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 游戏技术博客!