图形学笔记 - 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\

相关推荐
chushiyunen2 分钟前
dom操作笔记、xml和document等
xml·java·笔记
chushiyunen5 分钟前
tomcat使用笔记、启动失败但是未打印日志
java·笔记·tomcat
汇能感知9 分钟前
光谱相机的光谱数据采集原理
经验分享·笔记·科技
人人题32 分钟前
汽车加气站操作工考试答题模板
笔记·职场和发展·微信小程序·汽车·创业创新·学习方法·业界资讯
小脑斧爱吃鱼鱼1 小时前
鸿蒙项目笔记(1)
笔记·学习·harmonyos
lulinhao2 小时前
HCIA/HCIP基础知识笔记汇总
网络·笔记
杉之3 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
WarPigs3 小时前
blender场景导入Unity的流程(个人总结)
笔记
小杨爱学习zb5 小时前
学习总结 网格划分+瞬态求解设置
笔记·学习·算法
互联网上的猪6 小时前
Excel时间类型函数(包括today、date、eomonth、year、month、day、weekday、weeknum、datedif)
笔记·学习·excel