图形学笔记 - 5. 光线追踪 - RayTracing

Whitted-Style Ray tracing

为什么要光线追踪

  • 光栅化不能很好地处理全局效果

    • 软阴影
    • 尤其是当光线反射不止一次的时候
  • 栅格化速度很快,但质量相对较低

  • 光线追踪是准确的,但速度很慢

    • 光栅化:实时,光线追踪:离线
    • ~10K CPU核心小时来渲染一帧

基本光线追踪算法

光线

关于光线的三个观点:

  • 光沿直线传播(虽然这是错误的)
  • 光线交叉时不会相互"碰撞" (尽管这仍然是错误的)
  • 光线从光源传播到眼睛(但物理在路径反转-互易下是不变的)。
    "And if you gaze long into an abyss, the abyss also gazes into you." --- Friedrich Wilhelm Nietzsche (translated)

视觉发射理论

光线追踪

Appel 1968 -光线追踪

  • 通过每个像素投射一条光线来生成图像
  • 通过向光源发送光线来检查阴影
产生眼睛射线

针孔相机模型

阴影像素(仅限局部)

从观察点往成像平面的每个像素位置投射光线,再从投射光线与场景物体的交点向光源位置投射光线判断交点是否在阴影里。

递归(Whitted-Style)光线追踪

"An improved Illumination model for shaded display" T. Whitted, CACM 1980

Time:

  • VAX 11/780 (1979) 74m
  • PC (2006) 6s
  • GPU (2012) 1/30s

    一个递归的Ray Casting 方法,在Ray Casting假设的基础上考虑光线进一步的反射与折射。在每一个交点出都考虑光源的阴影着色,最后将这些点的着色累加作为该像素位置的成像结果。

光线-表面交点

光线方程

光线由它的原点和方向向量定义

r ( t ) = o + t d , t ≥ 0 r(t)=o+td,t\ge0 r(t)=o+td,t≥0

射线与球面相交

光线: r ( t ) = o + t d , t ≥ 0 \mathbf{r}(t)=\mathbf{o}+t\mathbf{d},t\ge0 r(t)=o+td,t≥0

球: p : ( p − c ) 2 − R 2 = 0 \mathbf{p}:(\mathbf{p}-\mathbf{c})^2-R^2=0 p:(p−c)2−R2=0

什么是交点?

交点p必须同时满足射线方程和球方程

求交点:
( o + t d − c ) 2 − R 2 = 0 (\mathbf{o}+t\mathbf{d}-\mathbf{c})^2-R^2=0 (o+td−c)2−R2=0
a t 2 + b t + c = 0 at^2+bt+c=0 at2+bt+c=0
a = d ⋅ d a=\mathbf{d}\cdot\mathbf{d} a=d⋅d
b = 2 ( o − c ) ⋅ d b=2(\mathbf{o}-\mathbf{c})\cdot \mathbf{d} b=2(o−c)⋅d
c = ( o − c ) ⋅ ( o − c ) − R 2 c=(\mathbf{o}-\mathbf{c})\cdot(\mathbf{o}-\mathbf{c})-R^2 c=(o−c)⋅(o−c)−R2
t = − b ± b 2 − 4 a c 2 a t = \frac{-b\pm \sqrt{b^2-4ac}}{2a} t=2a−b±b2−4ac

与隐式曲面的射线相交

一般隐式表面: p : f ( p ) = 0 \mathbf{p}:f(\mathbf{p})=0 p:f(p)=0

求解: f ( o + t d ) = 0 f(\mathbf{o}+t\mathbf{d})=0 f(o+td)=0

求解正实数

与三角形网格的光线相交

为什么?

  • 渲染:可见性,阴影,照明
  • 几何:内/外测试
    如何计算?
    让我们来分析一下:
  • 简单的想法:让射线与每个三角形相交
  • 简单,但慢(加速?)
  • 注:可以有0、1个交集(忽略多个路口)
    三角形在平面上
  • 光线平面交点
  • 测试命中点是否在三角形内
    许多优化方法...
平面方程

平面由法向量和平面上的一个点定义

平面方程(若p满足,则p在平面上):
p : ( p − p ′ ) ⋅ N = 0 \mathbf{p}:(\mathbf{p}-\mathbf{p'})\cdot \mathbf{N}=0 p:(p−p′)⋅N=0
a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0

带入射线求解:
( o + t d − p ′ ) ⋅ N = 0 (\mathbf{o}+t\mathbf{d}-\mathbf{p'})\cdot\mathbf{N}=0 (o+td−p′)⋅N=0
t = ( p ′ − o ) ⋅ N d ⋅ N t=\frac{(\mathbf{p}'-\mathbf{o})\cdot\mathbf{N}}{\mathbf{d}\cdot\mathbf{N}} t=d⋅N(p′−o)⋅N

检测 t ≥ 0 t\ge0 t≥0

Möller Trumbore算法

能不能一步到位?计算交点并判断是否在三角形内
O + t D = ( 1 − b 1 − b 2 ) P 0 + b 1 P 1 + b 2 P 2 \mathbf{O}+t\mathbf{D}=(1-b_1-b_2)\mathbf{P}_0 + b_1\mathbf{P}_1+b_2\mathbf{P}_2 O+tD=(1−b1−b2)P0+b1P1+b2P2

等式左边式射线,右边是三角形

三个未知数。

t b 1 b 2 \] = 1 S 1 ⋅ E 1 \[ S 2 ⋅ E 2 S 1 ⋅ S S 2 ⋅ D \] \\begin{bmatrix} t\\\\ b_1\\\\ b_2 \\end{bmatrix}=\\frac{1}{\\mathbf{S_1}\\cdot{}\\mathbf{E_1}}\\begin{bmatrix} \\mathbf{S_2}\\cdot\\mathbf{E_2}\\\\ \\mathbf{S_1}\\cdot\\mathbf{S}\\\\ \\mathbf{S_2}\\cdot\\mathbf{D} \\end{bmatrix} tb1b2 =S1⋅E11 S2⋅E2S1⋅SS2⋅D 其中 E 1 = P 1 − P 0 \\mathbf{E_1}=\\mathbf{P}_1-\\mathbf{P}_0 E1=P1−P0 E 2 = P 2 − P 0 \\mathbf{E_2}=\\mathbf{P}_2-\\mathbf{P}_0 E2=P2−P0 S = O − P 0 \\mathbf{S}=\\mathbf{O}-\\mathbf{P}_0 S=O−P0 S 1 = D × E 2 \\mathbf{S_1}=\\mathbf{D}\\times\\mathbf{E}_2 S1=D×E2 S 2 = S × E 1 \\mathbf{S_2}=\\mathbf{S}\\times\\mathbf{E}_1 S2=S×E1 代价:1次除法,27次乘法,17次加法 #### 光线表面求交加速 简单的光线-场景交集 * 详尽地测试与**每个三角形**的射线相交 * 找到最接近的命中点(即最小t) 问题: * 朴素算法=#像素 \* # 三角形 \* # 弹射数 * 非常慢 为了通用性,我们在后面使用术语"对象"而不是"三角形"(但不一定是指整个对象)。 ##### Bounding Volumes 包围体积 避免交叉的快速方法:用简单的体积绑定复杂的对象 * 对象被完全包含在卷中 * 如果没有碰到体积,就不会碰到物体 * 所以先测试BVol,然后测试对象是否命中 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f273ff1d94bb41e8bad4dc10145982a1.png) ###### 光线与盒子的交点 理解:盒子是3对平板的交点 具体地: 我们经常使用Axis-Aligned Bounding Box(AABB)轴对⻬包围盒 任意一条边都沿着x, y或z轴 ###### 射线与轴对齐框的交点 二维例子;3D也是一样!计算与平板的交点并取 t m i n / t m a x t_{min}/t_{max} tmin/tmax间隔的交点 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c57d2a583a8f4a60a0de56d291b9fc55.png) 我们怎么知道什么时候射线与盒子相交 Key ideas: * 光线**只有**在进入所有对平板时才能进入盒子 * 射线离开盒子的时间和离开任何一对平板的时间一样长 对于每一对,计算tmin和tmax(负数也可以) 对于3D框, t e n t e r t_{enter} tenter = max ⁡ t m i n \\max{t_{min}} maxtmin, t e x i t t_{exit} texit = min ⁡ t m a x \\min{t_{max}} mintmax 如果 t e n t e r \< t e x i t t_{enter} \< t_{exit} tenter\

相关推荐
聪明的笨猪猪12 分钟前
Java Spring “IOC + DI”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
im_AMBER1 小时前
Web 开发 24
前端·笔记·git·学习
烧冻鸡翅QAQ2 小时前
考研408笔记
笔记·考研
StarPrayers.2 小时前
卷积层(Convolutional Layer)学习笔记
人工智能·笔记·深度学习·学习·机器学习
能不能别报错3 小时前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
无言以对,沉默不语,随你随你。3 小时前
【解决办法】GitBash不能在任意文件夹打开
经验分享·笔记·git
牛马大师兄4 小时前
STM32独立看门狗IWDG与窗口看门狗WWDG知识梳理笔记
笔记·stm32·单片机·嵌入式硬件·嵌入式·看门狗
wan5555cn4 小时前
Windows 11系统鼠标键盘被禁用问题的全面解决方案
windows·笔记·深度学习·计算机外设
zhangrelay4 小时前
ROS云课三分钟-使用动态参数重配置调试Teb导航案例-251008
笔记·学习
BingeBlog5 小时前
[01] Qt的UI框架选择和对比
开发语言·c++·笔记·qt·ui·开源软件