games101【lecture13-16】Ray Tracing—whitted style

文章目录

  • 为什么引入光线追踪?
  • 光线追踪本身存在的问题
  • 光线定义
    • 以前研究
  • 光线追踪做法
    • 光线投射——Ray casting(Appel 1968)
    • Recursive (Whitted-Style) Ray Tracing
  • 光线求交
    • 射线定义
    • 光线与球如何判断位置
    • 推广——光线和隐式表面求交
    • 推广——光线和显式表面求交
    • 光线和平面求交
    • 光线求交如何加速——包围盒
    • 光线求交如何加速——基于包围盒的改进
      • 算法内容
      • 存在问题
    • 空间划分——基于包围盒改进的格子划分改进(套娃)
      • 示例——KD-Tree
    • 空间划分(BVH)——基于包围盒改进的格子划分改进的物体划分改进(套娃)
      • 存在问题:
      • BVH节点划分
      • BVH 数据结构
      • 算法实现

为什么引入光线追踪?

引入原因是因为光栅存在的问题:不能很好表示全局的效果,且很快但只能表示近似的效果

  1. 软阴影
  2. 光线反射需要超过两次及以上(eg:glossy reflection
  3. 间接光照

光线追踪本身存在的问题

  1. 实时非常慢,一般采用离线模式
  2. 一帧需要10k个cpu核心

光线定义

  1. 光线史一条直线
  2. 光线交叉不会发生碰撞
  3. 光线是从光源出发到达人的眼睛(光线路线可逆)

以前研究

在之前很多人支持是从人的眼睛看的地方会有对应的“光路”,使得人眼能够看到东西,光线追踪也类似——从相机出发,发射光线不断反射等等抵达光源,这种说法是不太对的,但是光路的确可逆,因此在图形学中还是用到了这样的方法。

光线追踪做法

光线投射——Ray casting(Appel 1968)

  • Generate an image by casting one ray per pixel
  • Check for shadows by sending a ray to the light

具体做法

  1. 从视点出发,穿过图像平面,
  2. 光线达到一个最近的物体位置点(判定相交),同时也可以解决深度缓冲的问题,因为直接得到了最近的点
    games101【lecture13-16】Ray Tracing—whitted style_第1张图片
  3. 和光源连线判定是否对光可见(是否在阴影中)
  4. 着色
    games101【lecture13-16】Ray Tracing—whitted style_第2张图片

Recursive (Whitted-Style) Ray Tracing

上述方法只做了一次反射,那么需要考虑光线追踪弹射多次的

方法:“An improved Illumination model for shaded display”T. Whitted, CACM 1980
Time:
• VAX 11/780 (1979) 74m
• PC (2006) 6s
• GPU (2012) 1/30s


  1. 首次的光线打到物体上
  2. 物体会进行反射和折射
  3. 反射和折射后的光线再和光源进行连线,判断是否能被看见
  4. 被看见则将弹射后的光线进行累加
    games101【lecture13-16】Ray Tracing—whitted style_第3张图片
    弹射后的光线自然会存在能量衰减,不然会导致图像过曝

光线求交

射线定义

定义为从一点出发,往某个方向传播的线,那么该线条具备的属性就是起点、方向向量、运动时间。因此可以得到如下公式:
games101【lecture13-16】Ray Tracing—whitted style_第4张图片

光线与球如何判断位置

  1. 已知光线方程如上述所示
  2. 球体方程定义如下,那么如果存在交点p,则可得到如下公式
    games101【lecture13-16】Ray Tracing—whitted style_第5张图片
  3. 根据方程组代入解得到对应t的值,那么存在如下情况
    • 光线与球不相交,则t无解
    • 光线与球相切,则只有一个解
    • 光线穿过球,则存在两个解

推广——光线和隐式表面求交

则t要求如下:为实数、大于等于0,小于无穷

那么将隐式表面定义为一个广泛的函数则是有P: f§ = 0,将交点p代入,则可知道最后的方程表达为f(o+td)=0

推广——光线和显式表面求交

点发射的一条线和简单三角形求交,如果为奇数则为在物体内,若为偶数则为物体外

光线和平面求交

  1. 平面定义:

    • 定义一个法线N,以及一个在平面上的一个点P’
    • 那么可以知道平面上任何一个点P和法线、以及指定的点P’关系为:(P-P’)·N = 0
  2. 因此若射线和平面存在交点P,则可解得运动时间t的方程,若t大于等于0则成立
    games101【lecture13-16】Ray Tracing—whitted style_第6张图片

  3. Möller Trumbore Algorithm

    原理为假设光线穿过的点为三角形片中心,则可得到该点与三角形重心关系,因为本身为三维向量,那么可以知道三个未知变量对应三个式子(三元一次方程),然后根据Gramer法则,来推得时间t、b1、b2。那么就可以在判断是否相交的同时计算得到交点位置

    t > 0,且(1-b1-b2), b1, b2 三者非负,则可得到该点在三角形内。
    games101【lecture13-16】Ray Tracing—whitted style_第7张图片

光线求交如何加速——包围盒

  1. 轴对齐包围盒(AABB):即与xyz平行的包围盒
    games101【lecture13-16】Ray Tracing—whitted style_第8张图片

  2. 使用轴对齐原因是因为可以减少很多的计算量,如下图对比所示:
    games101【lecture13-16】Ray Tracing—whitted style_第9张图片

  3. 针对光线和包围盒不同面进行求交
    先对x平面求交,那么我们可以得到在x0和x1平面上与射线的交点
    对y平面求交,可以得到y0和y1的交点,由于包围盒是取的其内部的范围,那么我们也对射线的交点求一个交集,从而可以得到最后的结果。
    games101【lecture13-16】Ray Tracing—whitted style_第10张图片

  4. 三维扩展:

    • 当光线穿过所有面的组,则说明光线进入包围盒
    • 当光线只要穿出任意一组,则说明光线离开包围盒

    也就是对应求最大和最小,那么对应可以知道其表达式:

    • 对于任何一组平面,有tmin和 tmax,
    • 对于三维则有:**tenter = max{tmin}, texit = min{tmax} **

    那么可以得到如下对应关系

    • 当出射时间小于0,则说明该盒子与射线不相交
    • 而如果出射时间大于0,入射时间小于0,则说明射线起始点位于包围盒内部
    • 所以若射线和AABB包围盒相交则有:tenter < texit && texit >= 0

光线求交如何加速——基于包围盒的改进

算法内容

光线和实际物体求交很慢,和包围盒求交很快

如何光栅化一条线?——DAA算法

  1. 首先找到包围所有物体的一个包围盒
  2. 划分格子
  3. 存储每个格子是否包含物体的信息,其中若格子在物体中心,并没有包含任何物体的边界,则不纳入包含物体信息
  4. 绘制射线依次求交这里射线的绘制可以参考光栅化中如何绘制一条线的算法,如DAA算法之类的
    games101【lecture13-16】Ray Tracing—whitted style_第11张图片
  5. 格子密度如何划分?——启发式算法,也就是格子数量等于常数C*物体数量,其中在三维空间中,常数C=27

存在问题

当空间中物体分布不均匀,则需要查找很久,算法效率比较低下

空间划分——基于包围盒改进的格子划分改进(套娃)

主要针对格子中物体分布不均时,改进其空间划分

  1. Oct-Tree:八叉树,二维上为四叉树,(划分停止是存在空间与任何物体都不相交,或者划分足够细的情况下,停止划分)
  2. KD-Tree:每一次会沿着某个维度划分,并且会在维度上进行交替,这样使得在空间上格子划分均匀(使得其空间划分与维度无关,这是因为八叉树的划分依赖于维度)
  3. BSP-Tree:任意用线进行划分,但是如果高维情况下会使得情况划分十分复杂。
    games101【lecture13-16】Ray Tracing—whitted style_第12张图片

示例——KD-Tree

games101【lecture13-16】Ray Tracing—whitted style_第13张图片

  1. 当前节点轴的划分:x-, y-, or z-axis
  2. 划分的起点的位置确定:不同划分方式不一样,选择最合适自己的
  3. 子节点存储:每一次划分后存在两个节点
  4. 实际的物体位置存储在叶子节点上
    games101【lecture13-16】Ray Tracing—whitted style_第14张图片
  5. 判断A框是否存在交点,求tmin、tmax
  6. 若存在交点,则判断其和A的叶子节点是否存在交点,判断右边和B区域
  7. 依次迭代
  8. 若为叶子节点则和叶子节点内部所有的物体求交

其实存在问题,就是物体和划分的区域的关系,因为可能会存在物体存在多个叶子节点

空间划分(BVH)——基于包围盒改进的格子划分改进的物体划分改进(套娃)

根据物体进行划分,也就是空间划分使得完整的物体存在某个区域
games101【lecture13-16】Ray Tracing—whitted style_第15张图片
然后根据物体划分,再不断迭代
games101【lecture13-16】Ray Tracing—whitted style_第16张图片

存在问题:

可能根据物体划分,会导致包围盒之间存在重叠区域较大,那么可以尽可能的根据某个标准划分使得包围盒重叠部分较小。

BVH节点划分

  1. 维度交叉划分
  2. 只沿着其轴最长的方向划分,同时使得节点的左右子树均衡(快速选择算法,O(n)

BVH 数据结构

  1. 中间节点存储:
    • 包围盒
    • 孩子节点:指针指向子节点
  2. 叶子节点存储:
    • 包围盒
    • 物体的list

算法实现

Intersect(Ray ray, BVH node) {
	// 不相交
	if (ray misses node.bbox) return;
	// 节点为叶子节点,与物体判断相交
	if (node is a leaf node)
		test intersection with all objs;
		return closest intersection;
	// 与左右子节点判断相交
	hit1 = Intersect(ray, node.child1);
	hit2 = Intersect(ray, node.child2);
	
	return the closer of hit1, hit2;
}

你可能感兴趣的:(图形学—Games101学习,图形学)