跳至正文

Ray Tracing1(Whitted-Style)

光栅化解决的并不是特别好的问题

全局的效果:

软阴影

类似毛玻璃的反射 光线在场景中反射了不止一次

间接光照 光线弹射了非常多次

 
 

 
 

光栅化是很快的 但是是近似的渲染方法 质量可能非常低

 
 

光线追踪非常精确 但是非常慢

一般光线追踪是做离线的运用

1帧就要花一万个CPU小时

 
 

 
 

光线追踪里的光线是什么呢?

1.光线是沿着直线传播的

2.光线和光线不会发生碰撞

3.光线一定是经过一系列的反射或者其它操作到达我们的眼睛

(光线的可逆性 认为眼睛也可以发出光线回到原来的位置)

 
 

可知光线说 当然是错误的 但是在光路的可逆性下其实可以这么说

 
 

光线投射

人眼有一条光线穿过一个像素

如果这条光线打到了一个实体 那就从光源连接一条线

看是否有阻挡 没有阻挡就形成了一条光路

我们永远认为人眼是一个点

是一个针孔摄像机

在光线投射里 记录最近的交点 正好解决深度缓存的问题

 
 

到这里还只是考虑了光线只弹射了一次

 
 

Whitted-Style

 
 

镜面反射(假设是完美的)

折射 再折射 打到物体上

 
 

着色也发生了变化

由于光线弹射的次数多了 在每一次弹射的点 都会计算着色值

还要联一条shadow rays

未弹射就叫做primary ray

一次弹射后的这些都可以叫做secondary rays

 
 

 
 

第一个问题:求交点

定义光线

光线如何和球做交点

两个函数都得满足

现在只有t是未知的

求出t

t得是正的

得有实际的物理意义 得是实数

光线与隐式表面的相交

光线对于显式表面怎么做相交?

有意思的推论:如果交点数是奇数一定是物体内

反之 偶数一定是物体外

肯定有某种方法能加速比较

忽略完美情况 0交点 1交点

三角形在一个平面内 所以可以分解问题

转化成光线与平面求交

平面如何定义?

平面上任意一点+法线

现在就可以来求交点了

和刚才做法一样 把p换成o+td

有没有更简单的方法呢?

MT算法

要用到克莱姆法则解多个变量

 
 

怎样加速得到与三角形求交的结果?

所有的三角形面都求交肯定可以

但速度太慢了

 
 

包围体积/包围和

用一个相对简单的形状包起来

如果光线连包围和都碰不到 是肯定碰不到物体的

 
 

box有三个对面(上下、前后、左右) 也就是说是三个对面形成的交集

通常用的AABB 任何一条边都是沿着坐标轴的

对于每个面我们都能得到一个进去的时间和出去的时间

 
 

 
 

转化回三维来思考这个问题:到底什么时候光线进去 什么时候光线出来

对于三个面 我各计算一次

他必须进入了所有的三个对面 才能算进入这个盒子

所以求这三个时间的的最大值

只要离开了其中的一个对面 就算离开了这个盒子

所以要求这三个时间的最小值

什么时候有交点呢?

如果时间在进入和离开之间 就算有交点了

注:这里仍然没有考虑负的情况

 
 

考虑负的情况:

出来的时间<0——盒子在光线背后
不可能有交点

出来的时间>=0 但进去的时间<0——光线从盒子里出发 起点就在盒子里

总结:当且仅当进入时间<离开时间并且离开时间>=0

 
 

为什么要轴对齐?因为好求啊

发表评论

您的电子邮箱地址不会被公开。