图形学笔记 - 5. 光线追踪 - RayTracing
Whitted-Style Ray tracing为什么要光线追踪
[*] 光栅化不能很好地处置惩罚全局效果
[*]软阴影
[*]尤其是当光线反射不止一次的时候
https://i-blog.csdnimg.cn/direct/eb3e2ece43634b5a91fe509f8d264a62.png
[*] 栅格化速率很快,但质量相对较低
[*] 光线追踪是正确的,但速率很慢
[*]光栅化:及时,光线追踪:离线
[*]~10K CPU核心小时来渲染一帧
基本光线追踪算法
光线
关于光线的三个观点:
[*]光沿直线流传(虽然这是错误的)
[*]光线交叉时不会相互“碰撞” (尽管这仍然是错误的)
[*]光线从光源流传到眼睛(但物理在路径反转-互易下是稳定的)。
“And if you gaze long into an abyss, the abyss also gazes into you.” — Friedrich Wilhelm Nietzsche (translated)
视觉发射理论
光线追踪
Appel 1968 -光线追踪
[*]通过每个像素投射一条光线来天生图像
[*]通过向光源发送光线来检查阴影
https://i-blog.csdnimg.cn/direct/b154102df1274a48836dcef4a4df2ceb.png
产生眼睛射线
针孔相机模子
https://i-blog.csdnimg.cn/direct/95003b5fa4c9435d8ef1912024baa503.png
阴影像素(仅限局部)
https://i-blog.csdnimg.cn/direct/c7129ba0306f4a30983e4b9cbdd0528c.png
从观察点往成像平面的每个像素位置投射光线,再从投射光线与场景物体的交点向光源位置投射光线判断交点是否在阴影里。
递归(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
https://i-blog.csdnimg.cn/direct/d1a4ebf16737425e81e9dad8fbedcfa8.png
一个递归的Ray Casting 方法,在Ray Casting假设的底子上考虑光线进一步的反射与折射。在每一个交点出都考虑光源的阴影着色,最后将这些点的着色累加作为该像素位置的成像效果。
https://i-blog.csdnimg.cn/direct/eeb0142ea1294d5dbdc131c6baedede4.png
光线-表面交点
光线方程
光线由它的原点和方向向量界说
https://i-blog.csdnimg.cn/direct/c04e55b8bd794b0695169fb2ea027a32.png
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
https://i-blog.csdnimg.cn/direct/7a3c000c65484629ac6b4b35320164c9.png
什么是交点?
交点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
求解正实数
https://i-blog.csdnimg.cn/direct/7b1ad9556e15433b806811fa1388a504.png
与三角形网格的光线相交
为什么?
[*]渲染:可见性,阴影,照明
[*]几何:内/外测试
怎样盘算?
让我们来分析一下:
[*]简单的想法:让射线与每个三角形相交
[*]简单,但慢(加速?)
[*]注:可以有0、1个交集(忽略多个路口)
三角形在平面上
[*]光线平面交点
[*]测试掷中点是否在三角形内
许多优化方法…
平面方程
平面由法向量和平面上的一个点界说
https://i-blog.csdnimg.cn/direct/1e694bf8d8d8477c9ceb789ba7228fc3.png
平面方程(若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<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=dxpx′−ox
一个减法一个除法
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]