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

打印 上一主题 下一主题

主题 1001|帖子 1001|积分 3005

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                  pp−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                     pp−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​+b1​P1​+b2​P2​
等式左边式射线,右边是三角形
三个未知数。
                                                    [                                                                                     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}                                    ​tb1​b2​​               ​=S1​⋅E1​1​               ​S2​⋅E2​S1​⋅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,然后测试对象是否掷中

光线与盒子的交点

明白:盒子是3对平板的交点
详细地:
我们常常使用Axis-Aligned Bounding Box(AABB)轴对⻬困绕盒
恣意一条边都沿着x, y或z轴
射线与轴对齐框的交点

二维例子;3D也是一样!盘算与平板的交点并取                                             t                                       m                               i                               n                                            /                                   t                                       m                               a                               x                                                 t_{min}/t_{max}                  tmin​/tmax​隔断的交点

我们怎么知道什么时候射线与盒子相交
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​<texit​,我们知道射线在盒子里停顿了一段时间(以是它们肯定是相交的!)
    然而,射线不是一条直线
  • 应该检查t是否为负以包管物理正确性!
    如果                                                   t                                           e                                  x                                  i                                  t                                                 <                            0                                  t_{exit}<0                     texit​<0
  • 盒子在光线的“反面”——没有交集!
    如果                                                   t                                           e                                  x                                  i                                  t                                                 ≥                            0                                  t_{exit}\ge0                     texit​≥0且                                                   t                                           e                                  n                                  t                                  e                                  r                                                 <                            0                                  t_{enter}<0                     tenter​<0
  • 射线的原点在框内,有交点
    总之,射线与AABB相交当且仅当:
  •                                                    t                                           e                                  n                                  t                                  e                                  r                                                 <                                       t                                           e                                  x                                  i                                  t                                                 且                                       t                                           e                                  x                                  i                                  t                                                 ≥                            0                                  t_{enter}<t_{exit}且 t_{exit}\ge0                     tenter​<texit​且texit​≥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​
    3个减法,6个乘法,1个除法
    垂直于x轴的平面:
                                                  t                               =                                                                      p                                        x                                        ′                                                  −                                                   o                                        x                                                                        d                                     x                                                             t=\frac{p_x'-o_x}{d_x}                        t=dx​px′​−ox​​
    一个减法一个除法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表