首页 > 其他分享 >Ray Tracking 加速结构

Ray Tracking 加速结构

时间:2024-03-31 21:23:30浏览次数:18  
标签:求交 Tracking 格子 KD 物体 Tree 划分 加速 Ray

基本原理中使用AABB作为判断光线和物体相交的加速。
在AABB内部如何快速判断判断光线和物体的相交情况呢?主要分为种方法:

  • Uniform grids
  • Spatial partitions

注意这里使用的加速结构是在光线追踪之前做的准备工作。

Grids


分格子,然后记住每个格子里有哪些物体。碰到格子的话,再和这个格子里的物体求交。

这样的话就沿着直线找就可以了(怎么沿着直线?比如,线是右上的,找到一个格子后,往右找或者往上找)

那么怎么划分是合理的呢?
一般认为:

格子的划分对排列整齐大小整齐的物体是work well的,但是对于分布不均形状复杂的是工作不好的。

Spatial Partitioning

这里有一些比较经典的按照空间结构划分的加速结构。
比如Oct-Tree(八叉树),KD-Tree,BSP-Tree。
八叉树是指把一个空间分为8块(3D空间下),但是八叉树的问题是在不同空间维度下的分块数是不同的。
KD-Tree是我先横着切一刀,分成两块,再对每块竖着切一刀分成两块,再横着...直到切到我们规定的策略。
BSP-Tree是按照一个方向去切,分完之后再按另一个方向。

KD-Tree

KD-Tree是我先横着切一刀,分成两块,再对每块竖着切一刀分成两块,再横着...直到切到我们规定的策略。下面是一个示意图(A的左孩子应该也会被切直到满足我们的条件,比如条件是有1个物体等等),其中我们存放的物体应该在叶子节点上:

求交的时候会先和父节点求交,如果和这个块有交点再和孩子节点求交直到和叶子结点(物体)求交。

Object Partitions & Bounding Volume Hierarchy (BVH)

上面的空间划分结构(以KD-Tree为例)有两个问题,一是物体可能散步在多个块中;二是物体(三角面片)在不在这个块中并不好判断。
所以就诞生了使用物体作为划分的BVH这也是比较常用的Ray Tracking加速的作法。
它的主要想法是根据三角面做划分,然后一堆三角面的包围盒作为一块。这样就解决了上面两个问题。

PS:假如划分按照物体的个数均分树可能也会平衡些。也可以有一些别的划分策略:

KD-Tree VS BVH

标签:求交,Tracking,格子,KD,物体,Tree,划分,加速,Ray
From: https://www.cnblogs.com/code-fun/p/18107282

相关文章

  • Python大数据为啥一定要用Numpy Array,靠着这份900多页的PDF面试整理
    1.内存占用更小适当地使用Numpy数组替代List,你能让你的内存占用降低20倍。对于Python原生的List列表,由于每次新增对象,都需要8个字节来引用新对象,新的对象本身占28个字节(以整数为例)。所以列表list的大小可以用以下公式计算:64+8*len(lst)+len(lst)*28字节而使......
  • Ray Tracking 基本原理
    光线追踪和光栅化的区别光栅化不能处理更全局的信息。比如软阴影、玻璃的反射以及以及经过多次反射的光线。光线追踪将整个过程变换为从摄像机发出感知射线,到达物体之后,如果相同的点也能够被光源感知到,以此进行渲染。感觉光栅化这个过程是从光源出发,最后通过投影转到相机上。光......
  • Yii2-助手类(ArrayHelper)
    Yii2-助手类(ArrayHelper)数组助手类ArrayHelperYii数组助手类提供了额外的静态方法,让你更高效的处理数组。模型转数组$model=Country::findOne(['code'=>'BR']);VarDumper::dump(ArrayHelper::toArray($model));//['code'=>'BR''name'=&g......
  • Array方法总结(三)
    Array.prototype.slice()返回一个新的数组对象。从原数组的start和end(不包括end)索引范围内浅拷贝。slice(start,end)constfruits=["Banana","Orange","Lemon","Apple","Mango"];constcitrus=fruits.slice(1,3);//fruits包含['......
  • Array方法总结(一)
    Array.prototype.at()at(index) 传入一个整数值参数,返回该索引对应的元素。传入负整数从数组最后一个元素开始倒数。constarray=[10,8,2];console.log(array.at(-2));//8Array.prototype.concat()合并两个或多个数组。返回一个新数组。constarray1=[7,[1,......
  • lodash已死?radash最全使用介绍(附源码详细说明)—— Array方法篇(1)
    相信很多前端同学甚至非前端都或多或少使用过lodash库,我们都知道lodash是一个非常丰富的前端工具库,比如最常用的防抖和节流,使用lodash都能很快实现,在github上更是有着58.7k的star数。但最近出现的Radash库,号称lodashplus版本,比之更新、更小、更全面、源码更易于理解。阅读本文......
  • 双端队列Deque——ArrayDeque的实现
    Deque接口表示一个双端队列(DoubleEndedQueue),允许在队列的首尾两端操作,所以既能实现队列行为,也能实现栈行为。Deque常用的两种实现ArrayDeque和LinkedList,这篇主要介绍下Deque的常用操作,并重点看下ArrayDeque的实现逻辑。1、接口API1.1、Queue接口Queue的API......
  • java的ArrayList类
    ArrayList<E>E是自定义数据类型ArrayList类:构造函数: 成员方法: public boolean add(E e):将指定元素加到集合末尾Appendsthespecifiedelementtotheendofthislist.publicclassArray{publicstaticvoidmain(String[]args){ArrayLista......
  • Qt QByteArray中存储的字节顺序转换
    在QByteArray中,可以使用Qt的函数来实现字节顺序的转换。具体而言,可以使用 qFromBigEndian 和 qFromLittleEndian 函数将大端和小端字节顺序的数据转换为主机字节顺序的数据。同样地,可以使用 qToBigEndian 和 qToLittleEndian 函数将主机字节顺序的数据转换为大端......
  • 天翼云发布边缘安全加速平台AccessOne,四大产品能力助力企业安全高速发展
    本文分享自天翼云开发者社区《天翼云发布边缘安全加速平台AccessOne,四大产品能力助力企业安全高速发展》,作者:天翼云社区官方账号2023年5月30日全国科技工作者日,以“连接世界从边缘开始”为主题的天翼云边缘安全加速平台发布会在线上顺利举办。会上,天翼云重磅发布边缘安全加速平台......