【Ray Tracing】光线追踪(1)

本文介绍了光线追踪在计算机图形学中的重要性,相对于光栅化的局限性,光线追踪能更精确地模拟光影效果,尤其是处理间接光照和阴影。光线追踪算法包括基础的射线检测和Whitted风格的递归方法,但其计算量大,通常用于离线渲染。为提高效率,使用了包围盒(如AABB)技术进行加速。光线与包围盒的交点检测是关键,通过计算进入和退出时间来确定是否存在交点。
摘要由CSDN通过智能技术生成

课程来源:GAMES101-现代计算机图形学入门-闫令琪 Lecture13
GAMES101 现代计算机图形学入门
主讲老师:闫令琪,UCSB
课程主页:https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html

为什么要使用光线追踪?

  • 光栅化做阴影很困难,特别是当光线多次反射、或时软阴影时。
  • 间接光照:光打到一个物体上,又反射到另一个物体上……最后反射到摄像机。

在这里插入图片描述

  • 光栅化虽然快,但是质量很差,是一种很近似的渲染方法。
    在这里插入图片描述

  • 光线追踪虽然准确,但是非常慢。

  • 光栅化一般时实时的,光线追踪一般是离线的。

  • 一帧需要花10k CPU小时处理(非常非常慢)

  • 速度和质量,往往只能选一个。
    Zootopia, Disney Animation

基础光线追踪算法

  • 关于光线的三个想法(假设)
    1. 光以直线传播(尽管这是错误的)
    2. 如果光线交叉,它们就不会相互“碰撞”(尽管这仍然是错误的)
    3. 光线从光源传播到眼睛(但在路径反转-互易作用下,物理学是不变的)。

当你凝视着深渊的时候,深渊也凝视着你。

射线检测

  1. Generate an image by casting one ray per pixel 通过每像素投射一条射线来生成一个图像
  2. Check for shadows by sending a ray to the light 通过向光线发送光线来检查阴影
    在这里插入图片描述

产生“眼睛射线”

  • 原理:沿着一个光线,记录它最近的交点。
    在这里插入图片描述
  • 考虑这个点会不会被照亮:从这个点向光源连线。
    在这里插入图片描述

Whitted-Style Ray Tracing – Whitted风格光线追踪

在这里插入图片描述

  • Whitted-Style光线追踪是一个递归的算法。
  • 1979年,渲染这张图需要74分钟。2006年,只需要6秒。2012年,只需要1/30秒。

算法图解

  • 首先考虑反射光线
    在这里插入图片描述
  • 折射光线
    在这里插入图片描述
  • 对每个交点,做连线,看这个点能否被照亮。
    在这里插入图片描述
  • 算上能量损失
    在这里插入图片描述
    在这里插入图片描述

Ray-Surface Intersection 射线表面交点

光线是由它的原点和一个方向向量来定义的。
在这里插入图片描述
射线方程:
r ( t ) = o + t d 0 ≤ t < ∞ \mathbf{r}(t)=\mathbf{o}+t \mathbf{d} \quad 0 \leq t<\infty r(t)=o+td0t<

光和球求交点

Ray: r ( t ) = o + t d 0 ≤ t < ∞ \mathbf{r}(t)=\mathbf{o}+t \mathbf{d} \quad 0 \leq t<\infty r(t)=o+td0t<
Sphere: p : ( p − c ) 2 − R 2 = 0 \mathbf{p}:(\mathbf{p}-\mathbf{c})^2-\mathbf{R}^2=0 p:(pc)2R2=0
求交点就是求这连个方程的共同解
在这里插入图片描述
Solve for intersection:
( o + t d − c ) 2 − R 2 = 0 (\mathbf{o}+t\mathbf{d}-\mathbf{c})^2-\mathbf{R}^2=0 (o+tdc)2R2=0
简单的几何求一下:为了让他在物理上有意义,我们求得的解必须是一个实数,而不是一个虚数。虚数是没有物理意义的。
在这里插入图片描述

光线和一般性的隐式表面求交点

这个交点一定又在光线上,也一定在隐式表面上,然后求方程解即可。
在这里插入图片描述

光对于显式表面的交点

  • 转化为光和三角形求交点
    在这里插入图片描述
  • 三角形一定在一个平面内
  • 判断光线和平面是否相交
  • 判断交点是否在三角形内(这个之前讲过如何判断)
    在这里插入图片描述
  • 定义一个平面:平面由法向量和平面上的一个点来定义。
    在这里插入图片描述
  • 平面方程(如果p满足它,那么p就在这个平面上)
    \mathbf{p}:(\mathbf{p}-\mathbf{p}')·\mathbf{N}=0

解方程……
在这里插入图片描述

虽然比较麻烦,但这个式子是非常直观的式子。

在这里插入图片描述

光线追踪-性能挑战

  • 简单射线场景交叉点
    • 光线与每个三角形的射线交点
    • 找到最接近的命中值(即最小值t)
  • 问题:非常缓慢——
    • Naive algorithm = #pixels ⨉ # traingles (⨉ #bounces)
    • 朴素算法=#像素×#三角形(×#反弹)
  • For generality, we use the term objects instead of triangles later (but doesn’t necessarily mean entire objects)
  • 为了通用性,我们在后面使用术语对象而不是三角形(但并不一定意味着整个对象)
    在这里插入图片描述
    在这里插入图片描述

Bounding Volumes 包围盒/包围体积

通过包围盒的方式进行加速。
用一个相对简单的形状将物体包起来,如果一个光线连包围盒都碰不到,那么这个光线不可能碰到包围盒内的物体。
这是一个很简单,但很有效的加速方法。
在这里插入图片描述

我们一般使用一个轴对齐包围盒—— Axis-Aligned Bounding Box(AABB)
在这里插入图片描述
在这里插入图片描述

  • a box (3D) = three pairs of infinitely large slabs
    一个盒子(3D)= 三对无限大的板

  • Key ideas 核心思想

    • The ray enters the box only when it enters all pairs of slabs
      只有当光线进入所有的板对时,光线才会进入盒子
    • The ray exits the box as long as it exits any pair of slabs
      只要光线离开任何一对石板,光线就会离开盒子
  • For each pair, calculate the t m i n t_{min} tmin and t m a x t_{max} tmax (negative is fine)
    对于每一对,计算 t m i n t_{min} tmin t m a x t_{max} tmax(负数是可以的)。

  • 对于3D盒子, t e n t e r = m a x { t m i n } , t e x i t = m i n { t m a x } t_{enter} = max\{t_{min}\}, t_{exit} = min\{t_{max}\} tenter=max{tmin},texit=min{tmax}

  • If tenter < texit, we know the ray stays a while in the box.(so they must intersect!)
    如果 t e n t e r t_{enter} tenter< t e x i t t_{exit} texit,我们知道光线在盒子里停留一段时间(所以它们必须相交!)

  • However, ray is not a line
    然而,光线并不是一条线

    • Should check whether t is negative for physical correctness!
      应该检查t是否是负的物理正确性!
  • What if t e x i t < 0 t_{exit} < 0 texit<0?

    • The box is “behind” the ray — no intersection!
      这个盒子就在光线的“后面”,没有交点!
  • What if t e x i t > = 0 t_{exit} >=0 texit>=0 and t e n t e r < 0 t_{enter} < 0 tenter<0?

    • The ray’s origin is inside the box — have intersection!
      光线的原点在盒子里,有交叉点!
  • In summary, ray and AABB intersect iff
    总结,射线和AABB包围盒会相交,如果……

  • t e n t e r < t e x i t t_{enter} <t_{exit} tenter<texit && t e x i t > = 0 t_{exit} >= 0 texit>=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值