<PhysicallyBasedRendering>chap4

Primitives and intersection acceleration

ray box intersections

使用ray和6个plane相交,判定交点是否在box内。

grid acceleration

把物体使用voxel来简化表示,然后用ray和voxel相交,这样可以快速剔除很多物体,进一步是否判定ray和object相交可以根据自己需要来选择。

bounding volume hierarchy

其实就是BVTree,但看名字就知道怎么实现了。

surface area heuristic

在确定划分方法之后,划分的粒度是一个重要问题。

这里在ray tracing社区里,普遍认为这个SAH(surface area heuristic)是比较靠谱的方法,或者说是衡量度。

划分粒度首先要解决给定几个划分,那一个更好的问题(而且不能用实际测试数据)。

<PBR>这个书讲解的也不是很到位,后来到这里看http://www.sci.utah.edu/~wald/PhD/wald_phd.pdf算是有一个了解

SAH用一个假设,ray是在空间里均匀分布的,那么一个ray与父voxel并且与一个子voxel相交的概率是:

surface area of voxel kid/suraface area of voxel_dad.

这里的surface area就是表面积了,对于voxel的表面积计算就是立方体的表面积计算。

有了这个度量衡,那么后面的具体划分方式和粒度就可以用这个来具体推算出来。

traverse

用把bvh树用depth first order放在一个linear array里,这样遍历就飞飞快(没递归,cache效率也好)。

KD-tree

KDTree(k dimention tree)和Octree是BSP(binary space partitioning)的两个分支。

BSP:第一次听说是在doom启示录里,第一次使用是在编写找工作用的demo中,着实有感情的一个算法。

简而言之就是:如果一个bounding box里面的primitive大于一个阀值,就把这个bounding box切分成两个,如果有primitive横跨了两个切好的bounding box,它的从属关系就是这两个bounding box。

然后递归。

kd tree:这里有一个可视化的demo可以更进一步的给我们感性认识

http://donar.umiacs.umd.edu/quadtree/points/pointquad.html

kd tree就是在切分的时候使用垂直于axis的plane来切,并且这个plane不用把空间均匀的切成几分,是一个flexible的概念。

octree典型做法是等分成8分,当然我们在各种文章和《game programming gems》这种书里也都看见了,有各种灵活化的变种。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值