中EN
概念页

光线求交测试

Ray Intersection Tests

光线求交用于拾取、光线追踪、地面高度查询等。本页给出四类经典测试:光线-球(代数解与带早期拒绝的几何优化解)、光线-盒(平板法与光线斜率法)、光线-三角形(Möller-Trumbore,直接从顶点求重心坐标与距离)、光线-多边形(先求平面交点,再投影到二维做交叉数测试)。共同思路是先做便宜的拒绝测试、推迟除法与开方、必要时降维。

光线-球(22.6 节)

球心 c\mathbf{c}、半径 rr,把光线代入 ∥p−c∥−r=0\lVert\mathbf{p}-\mathbf{c}\rVert-r=0,利用 d⋅d=1\mathbf{d}\cdot\mathbf{d}=1 得

t2+2bt+c=0,b=d⋅(o−c),  c=(o−c)⋅(o−c)−r2,t=−b±b2−ct^2+2bt+c=0,\quad b=\mathbf{d}\cdot(\mathbf{o}-\mathbf{c}),\; c=(\mathbf{o}-\mathbf{c})\cdot(\mathbf{o}-\mathbf{c})-r^2,\quad t=-b\pm\sqrt{b^2-c}

b2−c<0b^2-c<0 则错过,可省去开方;否则取最小正根。(网站上的碰撞检测章节给出了数值更稳定的解法。)

几何优化解:

  1. l=c−o\mathbf{l}=\mathbf{c}-\mathbf{o},l2=l⋅ll^2=\mathbf{l}\cdot\mathbf{l};l2<r2l^2<r^2 表示原点在球内,必然相交(只需布尔结果时可退出)。
  2. s=l⋅ds=\mathbf{l}\cdot\mathbf{d};若 s<0s<0 且原点在球外,球在光线背后,拒绝。
  3. m2=l2−s2m^2=l^2-s^2;若 m2>r2m^2>r^2 必然错过,拒绝。此后保证相交。
  4. q=r2−m2q=\sqrt{r^2-m^2},交点距离 t=s±qt=s\pm q:原点在球外取 s−qs-q,在球内取 s+qs+q。

完整执行时运算量与代数解相当,但拒绝发生得早得多,平均成本更低。(预存 r2r^2 看似优化,实际可能因多访问内存而更慢。)圆柱、圆锥、椭球、胶囊、菱形体也有类似的几何优化方法。

光线-盒(22.7 节)

平板法(Kay 与 Kajiya,源自 Cyrus-Beck 裁剪):把盒看成三个平板,对每个平板求进入与离开的 timint_i^{min}、timaxt_i^{max},

tmin=max⁡(tumin,tvmin,twmin),tmax=min⁡(tumax,tvmax,twmax)t^{min}=\max(t_u^{min},t_v^{min},t_w^{min}),\qquad t^{max}=\min(t_u^{max},t_v^{max},t_w^{max})

tmin≤tmaxt^{min}\le t^{max} 则直线与盒相交(最远的"进入"不晚于最近的"离开");再要求 tmax≥0t^{max}\ge0 才是光线(盒不在背后)。OBB 实现要点:p=ac−o\mathbf{p}=\mathbf{a}^c-\mathbf{o},每条轴算 e=ai⋅pe=\mathbf{a}^i\cdot\mathbf{p}、f=ai⋅df=\mathbf{a}^i\cdot\mathbf{d};∣f∣>ϵ|f|>\epsilon(约 10−2010^{-20},仅防除法溢出)时 t1,2=(e±hi)/ft_{1,2}=(e\pm h_i)/f 并更新区间,区间为空或 tmax<0t^{max}<0 立即拒绝;光线平行于平板时若 −e−hi>0-e-h_i>0 或 −e+hi<0-e+h_i<0 则在平板外,拒绝。最后返回 tmin>0t^{min}>0 时的 tmint^{min},否则 tmaxt^{max}。

优化:预先计算 1/f1/f 用乘法代替除法;循环内尽早与当前最近距离 ll 比较;AABB 时 e=pie=p_i、f=dif=d_i,直接用 amin\mathbf{a}^{min}、amax\mathbf{a}^{max};允许除以零并正确解读结果可省掉平行判断;某些 NVIDIA 架构可用单条 GPU 指令完成"最小值中的最大值"。平板法可推广到 k-DOP、视锥和任意凸多面体。用 SAT 也能推导光线-盒测试,但得不到交点距离。

光线斜率法(Eisemann 等,2007):在三个二维投影中测试,每个投影中由两个盒角定义光线"看到"的极值范围(类似轮廓边),光线斜率必须介于原点到这两点的斜率之间,三个投影都通过才命中。部分比较项只依赖光线,预计算后可高效测试大量盒;可只返回是否命中,也可稍加成本返回距离。

光线-三角形(22.8 节,Möller-Trumbore)

不需要预存三角形法线(对网格省内存,对动态几何免于每帧重算平面方程)。三角形上点 f(u,v)=(1−u−v)p0+up1+vp2\mathbf{f}(u,v)=(1-u-v)\mathbf{p}_0+u\mathbf{p}_1+v\mathbf{p}_2,(u,v)(u,v) 为重心坐标(第三个权重 w=1−u−vw=1-u-v,可用于纹理坐标、法线、颜色插值)。令 o+td=f(u,v)\mathbf{o}+t\mathbf{d}=\mathbf{f}(u,v),记 e1=p1−p0\mathbf{e}_1=\mathbf{p}_1-\mathbf{p}_0,e2=p2−p0\mathbf{e}_2=\mathbf{p}_2-\mathbf{p}_0,s=o−p0\mathbf{s}=\mathbf{o}-\mathbf{p}_0,得线性方程组 (−d    e1    e2)(t,u,v)T=s(-\mathbf{d}\;\;\mathbf{e}_1\;\;\mathbf{e}_2)(t,u,v)^T=\mathbf{s}。几何上相当于把三角形平移到原点并变换为单位三角形、光线方向对齐 x 轴。由克莱姆法则与混合积恒等式:

(tuv)=1q⋅e1(r⋅e2q⋅sr⋅d),q=d×e2,  r=s×e1\begin{pmatrix}t\\u\\v\end{pmatrix}=\frac{1}{\mathbf{q}\cdot\mathbf{e}_1}\begin{pmatrix}\mathbf{r}\cdot\mathbf{e}_2\\ \mathbf{q}\cdot\mathbf{s}\\ \mathbf{r}\cdot\mathbf{d}\end{pmatrix},\qquad \mathbf{q}=\mathbf{d}\times\mathbf{e}_2,\;\mathbf{r}=\mathbf{s}\times\mathbf{e}_1

实现顺序:算 a=e1⋅qa=\mathbf{e}_1\cdot\mathbf{q}(矩阵行列式),∣a∣<ϵ|a|<\epsilon(正常浮点条件下 10−510^{-5} 即可)拒绝;f=1/af=1/a;u=f(s⋅q)u=f(\mathbf{s}\cdot\mathbf{q}),u<0u<0 拒绝;v=f(d⋅r)v=f(\mathbf{d}\cdot\mathbf{r}),v<0v<0 或 u+v>1u+v>1 拒绝;最后 t=f(e2⋅r)t=f(\mathbf{e}_2\cdot\mathbf{r})。所有计算延迟到需要时;单面版本剔除行列式为负的三角形,可把唯一的除法推迟到确认相交之后。

变体与注意:

  • 若可多存数据,存 p0,e1,e2\mathbf{p}_0,\mathbf{e}_1,\mathbf{e}_2 和未归一化法线 n=e1×e2\mathbf{n}=\mathbf{e}_1\times\mathbf{e}_2,令 m=s×d\mathbf{m}=\mathbf{s}\times\mathbf{d},则 (t,u,v)=1−n⋅d(n⋅s,  m⋅e2,  −m⋅e1)(t,u,v)=\frac{1}{-\mathbf{n}\cdot\mathbf{d}}(\mathbf{n}\cdot\mathbf{s},\;\mathbf{m}\cdot\mathbf{e}_2,\;-\mathbf{m}\cdot\mathbf{e}_1),主要省一次叉积;是否更快取决于额外内存访问,需实测。
  • 直接在三维中操作的光线-三角形测试大多计算上等价,可用 SSE 一次测 4 条光线。
  • 这类测试可能把恰好打在边或顶点上的光线判为未命中,光线可能从共享边穿过网格;Woop 等给出边与顶点都"水密"的测试,性能略低。
  • 另一类方法先求与平面交点,再投影到使三角形面积最大的坐标平面做二维包含测试;不同 CPU、编译器、命中率下没有单一最佳测试。

光线-多边形(22.9 节)

多边形平面 np⋅x+dp=0\mathbf{n}_p\cdot\mathbf{x}+d_p=0,交点参数

t=−dp−np⋅onp⋅dt=\frac{-d_p-\mathbf{n}_p\cdot\mathbf{o}}{\mathbf{n}_p\cdot\mathbf{d}}

∣np⋅d∣<ϵ|\mathbf{n}_p\cdot\mathbf{d}|<\epsilon 视为平行。然后丢弃法线绝对值最大的分量,把顶点和交点投影到对应坐标平面(避免投影成零面积),该分量可预存,拓扑在投影下保持(前提是多边形确实平坦)。

交叉数测试(Jordan 曲线定理,又称奇偶测试):从点出发沿 +x 方向发射射线,与多边形边相交奇数次则在内部。对自交多边形,有些视觉上在内部的区域会被判为外部;若要都算内部,需计算环绕数 (winding number)。实现时把点平移到原点:边两端 y 同号则不可能相交;否则若两端 x 都为正则计数,若 x 异号则求与 x 轴交点判断正负。射线恰好经过顶点时可能被计两次,约定 y≥0y\ge0 的顶点视为在射线上方即可避免。高效版本用符号消去代替除法求截距;对顶点很多的多边形,先比较 x 坐标差再做判断可能更快。

优点缺点
较快、健壮,无需额外信息或预处理只给出内/外,不像光线-三角形测试那样给出可插值的重心坐标

重心坐标可推广到凸和凹多边形;由直线段与贝塞尔曲线组成的闭合轮廓也可用类似的交叉计数,并可在像素着色器中用于文本渲染。

GEA 的视角:碰撞查询中的射线(卷 II 14.3.7.1)

  • GEA 的射线投射把"射线"定义为有向线段:p(t)=p0+tdp(t)=p_0+t\mathbf d,t∈[0,1]t\in[0,1],终点 p1=p0+dp_1=p_0+\mathbf d。接触点用唯一的 tt 值描述,多数 API 直接返回 tt。这与本页各算法求出的参数 tt 是同一个量,只是 GEA 把 tt 限制在线段范围内,长度就是查询距离。
  • 引擎 API 通常返回最早接触(tt 最小),有的返回线段穿过的全部 collidable。每个接触包含 tt、被击中对象的 id,可能还有法线等表面属性。射线推广到移动整个凸形状就是形状投射,此时 tt 只描述形状中心的位置,必须另外返回接触点。详见 碰撞查询。

PBRT 的视角:离线光线追踪器里的形状求交(PBRT 4e 第 6 章)

上文 RTR4 和 GEA 讲的是单个求交算法;PBRT 讲的是一个离线渲染器怎样把它们组织成统一的 Shape 接口,并且把浮点误差当成算法的一部分(误差部分见 浮点误差与鲁棒光线求交)。

Shape 接口(6.1)

  • 每个形状必须提供:渲染空间 AABB Bounds()、法线方向锥 NormalBounds()(用于判断发光形状照不到某点)、Intersect()(返回 (0,tmax)(0,t_{max}) 内最近交点及 SurfaceInteraction)、谓词 IntersectP()(阴影光线用,更快)、Area()、两种 Sample()/PDF()(按面积、按参考点立体角,见 形状采样)。
  • tt 在变换下不变:物体空间射线 oo=Mor, do=Mdr\mathbf o_o=\mathbf M\mathbf o_r,\ \mathbf d_o=\mathbf M\mathbf d_r,交点 po=oo+tdo\mathbf p_o=\mathbf o_o+t\mathbf d_o,两边左乘 M−1\mathbf M^{-1} 得 pr=or+tdr\mathbf p_r=\mathbf o_r+t\mathbf d_r。前提是变换后不归一化方向,所以 pbrt 刻意不归一化物体空间射线。
  • 不支持单面形状:光栅化器用背面剔除提速,但光线追踪通常要先求交才知道法线朝向,收益小;而且不封闭的单面物体会让"从光源到点"和"从点到光源"两条阴影光线结论不一致,物理上不自洽。这与实时管线默认开启背面剔除的做法相反(见 剔除技术)。

光线-AABB 平板法(6.1.2)

与上文 22.7 节相同的平板法,PBRT 补充了两个工程细节:

  • 不检查 dx=0d_x=0:1/d_x 得到 ±∞\pm\infty,算法仍正确;原点恰在平板面上又平行时会出现 0⋅∞=0\cdot\infty= NaN,更新 t0,t1t_0,t_1 的比较写成"NaN 时保持不变"的形式(任何与 NaN 的比较都为假)。
  • 预先算好方向倒数和各分量符号的版本可以直接选出近/远平面,省掉依赖计算结果的比较;BVH 遍历中这一优化让总渲染时间快约 15%。

二次曲面:球、圆柱、圆盘(6.2–6.4)

  • 球心在原点、半径 rr:at2+bt+c=0at^2+bt+c=0,a=∣d∣2, b=2(d⋅o), c=∣o∣2−r2a=|\mathbf d|^2,\ b=2(\mathbf d\cdot\mathbf o),\ c=|\mathbf o|^2-r^2(式 6.3);圆柱去掉 zz 分量;圆盘直接 t=(h−oz)/dzt=(h-o_z)/d_z,dz=0d_z=0 时判为不相交。系数用区间类 Interval 计算,判别式用 6.8.3 的精确形式。
  • 部分球/圆柱用 zmin,zmax,ϕmaxz_{min},z_{max},\phi_{max} 裁剪:ϕ=atan2⁡(y,x)\phi=\operatorname{atan2}(y,x) 映射到 [0,2π)[0,2\pi);t0t_0 被裁掉再试 t1t_1。只有用户确实裁剪了 zz 才做 zz 测试,否则舍入会误裁。
  • 拆成 BasicIntersect()(只算 tt、物体空间点和 ϕ\phi)与 InteractionFromIntersection()(构造完整几何):IntersectP() 只用前者;GPU 路径先在所有形状中找到最近交点再构造 SurfaceInteraction,正好对应。
  • 曲面微分几何:球的 ∂p/∂u=(−ϕmaxy, ϕmaxx, 0)\partial p/\partial u=(-\phi_{max}y,\ \phi_{max}x,\ 0),∂p/∂v=(θmax−θmin)(zcos⁡ϕ, zsin⁡ϕ, −rsin⁡θ)\partial p/\partial v=(\theta_{max}-\theta_{min})(z\cos\phi,\ z\sin\phi,\ -r\sin\theta);法线导数用 Weingarten 方程(见 参数曲面与贝塞尔面片),供第 10 章的纹理抗锯齿使用。

三角形:Woop 水密求交(6.5.3)

与上文 Möller-Trumbore 的对照:

Möller-Trumbore(RTR4 22.8)Woop 等 (2013)(pbrt-v4)
思路直接解 o+td=(1−u−v)p0+up1+vp2\mathbf o+t\mathbf d=(1-u-v)\mathbf p_0+u\mathbf p_1+v\mathbf p_2 的 3×3 线性系统(Cramer 法则)先把顶点变到"射线坐标系":平移 TT 让原点在 (0,0,0)(0,0,0),置换 PP 让 $
判定u,v≥0, u+v≤1u,v\ge0,\ u+v\le1,含除法三条边函数 eie_i 同号;e0+e1+e2=0e_0+e_1+e_2=0 为侧向掠射,判不相交
共享边相邻三角形各自算 u,vu,v,舍入可能让光线从缝里漏过水密:边函数 e0=p1xp2y−p2xp1ye_0=p_{1x}p_{2y}-p_{2x}p_{1y} 是 ab−cdab-cd 形式,浮点下符号保证正确;某个 eie_i 恰为 0 时用双精度重算(8800 万次测试中不到 0.0000023% 走到这一步)
成本不需要预处理,内存小置换和切变系数只取决于射线,可缓存在射线里复用

其他细节:先检测退化三角形(变换后的舍入可能让退化三角形"变得不退化");先用未归一化的 ∑eizi\sum e_iz_i 与 tmax∑eit_{max}\sum e_i 比较,确定有效后才做除法(式中 ∑ei\sum e_i 为负时不等号反向);重心坐标 bi=ei/∑ejb_i=e_i/\sum e_j。几何法线用边向量 dp02 × dp12 而不是 ∂p/∂u×∂p/∂v\partial p/\partial u\times\partial p/\partial v,以免坏的 UV 参数化翻转法线;与插值着色法线不在同一侧时,翻转的是几何法线。

双线性面片与曲线(6.6–6.7)

  • 双线性面片(四个顶点不必共面,双直纹曲面)用 Reshetov (2019) 的单精度算法:固定 uu 得到一族直线 fu(v)f_u(v),射线与这族直线的距离为 0 是关于 uu 的二次方程,所以最多两个交点;对 [0,1][0,1] 内的根再用两直线最近点公式求 v,tv,t(含行列式)。
  • 曲线(三次贝塞尔 + 线性插值宽度):用 LookAt 把曲线变到射线坐标系,"上"方向取垂直于射线和首末控制点连线的方向以收紧包围盒;递归二分(变差缩减性保证细分后更直),到最大深度后用首末点线段近似,求最近点参数 w=(p−p0)⋅(p3−p0)∥p3−p0∥2w=\frac{(\mathbf p-\mathbf p_0)\cdot(\mathbf p_3-\mathbf p_0)}{\|\mathbf p_3-\mathbf p_0\|^2},再判断距离是否小于半宽;用过端点的切线垂线作边函数,避免相邻段重复计数。详见 毛发渲染。

原书问题

  • 6.1.4 物体空间射线的下标:在线版写的是"物体空间射线 ror_o 的原点为 Moo\mathbf M\mathbf o_o、方向为 Mdo\mathbf M\mathbf d_o"。本页解码该处 SVG 字形(下标为 LATINMODERNMAIN-6F 即字母 o),确认原文如此;按上下文应为 Mor\mathbf M\mathbf o_r、Mdr\mathbf M\mathbf d_r(由渲染空间量变换而来),紧接的推导也只有这样才成立。来源:https://pbr-book.org/4ed/Shapes/Basic_Shape_Interface#IntersectionCoordinateSpaces
  • 6.5.3 边函数符号与图注矛盾:正文说"边函数对直线右侧的点为正、左侧为负",图 6.14 的图注却说左侧为正。按式 6.5 e(p)=(p1x−p0x)(py−p0y)−(px−p0x)(p1y−p0y)e(\mathbf p)=(p_{1x}-p_{0x})(p_y-p_{0y})-(p_x-p_{0x})(p_{1y}-p_{0y}) 验算:取 p0=(0,0), p1=(1,0), p=(0,1)\mathbf p_0=(0,0),\ \mathbf p_1=(1,0),\ \mathbf p=(0,1)(在有向线左侧)得 e=1>0e=1>0,图注正确、正文写反(算法只要求三者同号,不受影响)。来源:https://pbr-book.org/4ed/Shapes/Triangle_Meshes#Ray–TriangleIntersection
  • 6.5.1 习题引用编号:正文"参见章末习题 6.8.8"的链接指向的是第一道习题(在渲染空间直接求交二次曲面,即习题 6.1);6.8.8 是"讨论"小节的编号,在线版的显示编号有误。
  1. realtime_rendering_4ed.pdf 第 22 章 Intersection Test Methods
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.3.7.1 节
  4. PBRT 4e source excerpt: chapter 06 (Shapes)
  5. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 6 章 6.1–6.7 节,pbr-book.org/4ed/Shapes

相关页面

游戏数学相交测试基础与分离轴Intersection Test Fundamentals & Separating Axis相交测试判断两个对象是否相交(包含、边界相交或分离),有时还需要最近交点或穿透深度与方向,是碰撞检测、视锥剔除、拾取和光线追踪的基础。本页汇总 RTR4 第 22 章的通用工具:光线与曲面的表示、常见包围体定义(AABB、OBB、k-DOP、凸多面体、胶囊与菱形体)、分离轴测试 (SAT)、几何概率与表面积启发式 (SAH)、设计相交例程的经验法则,以及基于 GPU 的拾取。游戏数学包围体重叠测试Bounding Volume Overlap Tests碰撞检测先测试包围体是否重叠,只有重叠时才逐图元测试;最底层则需要三角形之间、三角形与盒之间的精确测试。本页整理 RTR4 第 22.10~22.13 节:平面与 AABB/OBB(只测两个角的"投影半径"法)、三角形-三角形(Guigue-Devillers 行列式法)、三角形-AABB(13 轴 SAT)、球-球、球-盒(Arvo 及其向量化版本)、AABB-AABB、k-DOP-k-DOP 与 OBB-OBB(15 轴 SAT)。更复杂的 BV(OBB、k-DOP)空体积更少、更紧,代价是测试更贵。游戏数学直线与平面求交Line & Plane Intersections本页收录 RTR4 第 22.15~22.16 节的基础几何工具:二维直线/光线/线段求交(垂直点积法与无除法的早期拒绝法)、三维直线求交与异面直线最近点,以及三个平面的交点公式(可用于求 k-DOP 等平面围成凸体的角点)。这些在游戏中常用于射线检测、二维几何、碰撞与包围体构建。图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。图形学渲染方程Rendering Equation渲染方程 (Kajiya, 1986) 把"某点接收到的光就是其他点发出或反射的光"写成递归积分,概括了光从光源出发经任意次反弹到达眼睛的所有路径。反射方程是它的受限特例。离线用辐射度 (Radiosity) 或蒙特卡洛路径追踪求解;实时渲染则靠简化和预计算逼近它(RTR4 第 11 章)。图形学文本渲染Text Rendering文本中一个像素的变化就可能把 "l" 变成 "1",因此字形渲染格外讲究。主要路线有:按字号预生成字形位图纹理(配合微调和子像素渲染)、有符号距离场纹理(可在三维表面任意缩放旋转)、以及在 GPU 上直接求值字形曲线。图形学多边形三角化Polygon Triangulation模型数据很少恰好是渲染需要的格式。图形 API 和硬件都针对三角形优化,所以复杂多边形要先剖分 (tessellation),最常见的是三角化 (triangulation)。本页讲三维数据的来源、三角化算法(耳切法、凸剖分、模板缓冲法)、四边形对角线选择与纹理扭曲,以及边缘裂缝和 T 型顶点。图形学硬件光栅化与透视校正插值Hardware Rasterization & Perspective-Correct InterpolationGPU 光栅化由三角形设置与三角形遍历组成。硬件用每条边一个边函数判断采样点是否在三角形内,利用其增量性质按瓦片分层遍历,用左上规则决定恰好落在边上的像素归属,用保护带避免大多数裁剪。边函数的值恰好是子三角形面积的两倍,因此遍历顺带得到重心坐标;透视投影下需要线性插值 a/w 与 1/w 再逐像素相除,得到透视校正插值。本页还介绍 2×2 quad 与辅助像素、保守光栅化。图形学并行图形架构与排序分类Parallel Graphics Architectures & Sort Taxonomy提升图形速度的最佳方式是并行:多个几何单元、光栅化单元和像素处理单元同时工作再合并结果。Amdahl 定律指出串行部分限制总加速比。由于 API 要求按提交顺序处理图元,并行单元之间必须在某处做"模型空间到屏幕空间"的排序,按排序位置分为 sort-first、sort-middle、sort-last fragment、sort-last image 四类,各有负载均衡与带宽取舍。本页还简述光线追踪硬件的共同特征。游戏开发 · UE5Chaos 物理与碰撞Chaos Physics & CollisionChaos 是 UE5 的物理与破碎系统。日常最常打交道的是碰撞模型:每个物理体有对象类型 (Object Type) 和对其他类型的 Block/Overlap/Ignore 响应,结果由双方共同决定;Hit 与 Overlap 事件都要显式开启。骨骼网格通过物理资产 (Physics Asset) 获得刚体与约束(布娃娃、物理动画);Chaos 破碎基于几何集合 (Geometry Collection) 的分级断裂、簇阈值、连接图与缓存回放,并能把事件交给 Niagara。物理体用盒/球/胶囊/凸包代理,原理对应游戏数学中的包围体与相交测试。游戏开发 · UE5硬件光线追踪与路径追踪器Hardware Ray Tracing & Path TracerUE5 的硬件光线追踪 (HWRT) 大部分功能都集成在 Lumen 里;也有光追阴影等独立功能。Lumen 在显卡、RHI 和操作系统支持时使用 HWRT,否则回退到软件光追;反射光线可以用表面缓存(快)或命中点光照(质量高)来着色;实例超过 10 万时,HWRT 的场景更新开销很大。路径追踪器 (Path Tracer) 是渐进式、硬件加速的无偏渲染模式,用作 ground truth 参考和影视级最终输出,与 Sequencer/Movie Render Queue 集成。游戏数学几何图元的表示Geometric Primitive Representations除点、向量、矩阵、四元数外,游戏引擎还天天用到直线/射线/线段、球、平面、AABB、OBB、视锥和凸多面体区域。本页按 GEA 整理它们在内存中如何表示以及最基本的「点在内部吗」测试;各种求交与重叠算法见 RTR4 来源的相交测试系列页面。图形学硬件光线追踪管线Hardware Ray Tracing Pipeline高端 GPU 提供硬件加速的光线追踪,它像 GPU 中独立于光栅管线和计算管线的另一条管线,但能与它们协调同步。场景几何要先组织成两层加速结构(TLAS 实例层与 BLAS 几何层),光线发射后由 any-hit、closest-hit、miss 等着色器处理结果。由于还不够快,GPU 光追通常与光栅化结合成混合渲染:先光栅化 G-buffer,再对镜面、反射和间接光发射光线。图形学随机光线追踪与路径追踪Stochastic Ray Tracing & Path Tracing光线追踪用投射光线同时解决可见性问题和光照问题。GEA 从最简单的"眼睛光线 + 着色方程"讲起,逐步加入阴影光线、透射光线、用蒙特卡洛估计渲染方程的随机光线追踪、递归间接光照,再到每次只走一条路径的路径追踪、双向路径追踪和 Metropolis 光传输,最后讨论降噪与光线投射效率(GEA4 卷 II 12.6.3–12.6.5)。游戏开发碰撞查询Collision Queries碰撞系统除了检测真实物体的接触,还要回答假设性问题:子弹从枪口朝某方向飞,先打中什么?车能否从 A 开到 B 不碰到东西?某半径内有哪些敌人?这类操作称为碰撞查询。最常见的是投射 (cast),也叫 trace 或 probe:沿射线或线段移动一个假想物体,看它会碰到什么;被投射的东西并不真正进入碰撞世界,不会影响其他物体(GEA4 卷 II 14.3.7)。游戏数学浮点误差与鲁棒光线求交Floating-Point Error & Robust Ray Intersection光线追踪中,交点的浮点误差会让次级光线(阴影、反射)从表面"下方"出发、错误地再次击中自身(自相交,俗称 shadow acne),或因偏移过大漏掉近处遮挡(漂浮的阴影)。PBRT 第 4 版 6.8 节不靠经验 "ray epsilon",而是用前向误差分析为每个交点算出保守的误差盒,再沿法线把光线原点推出误差盒,做到可证明不自相交、偏移又极小。图形学毛发渲染Hair & Fur Rendering毛发由角质层、皮质、髓质三层构成,可看作用曲线离散化的体积。几何上用沿引导曲线挤出的四边形条带并配合 alpha/顺序无关透明;着色用 BSDF(R、TT、TRT 分量),再加体积自阴影与多次散射近似;动物短毛可用壳与鳍或几何着色器挤出(RTR4 14.7 节)。图形学三角形带、扇与索引网格Triangle Strips, Fans & Indexed Meshes让共享顶点的三角形成组送入管线,可以减少顶点着色器调用。三角形扇和带把每三角形发送的顶点数降到接近 1;现代 GPU 的标准做法是带单一索引缓冲的三角形网格,理论上每三角形只需处理约 0.5 个顶点,实际效果取决于变换后顶点缓存,由三角形顺序优化(Forsyth、Tipsify 等)决定。游戏数学形状采样Shape Sampling把形状当作面光源时,需要在形状上采样点。最简单的是按面积均匀采样再把 PDF 换算成立体角;更好的是只在参考点看得到的立体角内均匀采样,消掉 1/r^2 和背面带来的方差。本页按 PBRT 第 4 版第 6 章整理各种形状的采样公式及其推导要点。图形学剔除技术Culling Techniques剔除 (culling) 是在渲染前尽快去掉对最终图像没有贡献的部分。本页讲几何类剔除:背面剔除(含成簇背面剔除与法线锥)、视锥剔除(层次化、平面掩码)、室内场景的入口剔除,以及牺牲质量换速度的细节剔除和小三角形剔除。更复杂的遮挡剔除见 遮挡剔除。图形学参数曲面与贝塞尔面片Parametric Surfaces & Bézier Patches参数曲面把参数曲线从一个参数推广到两个参数 (u,v),由少量控制点定义,运行时细分成任意多个三角形,是质量与速度之间的天然权衡:三角形多则着色和轮廓更好。矩形定义域的是贝塞尔面片(张量积曲面),三角形定义域的是贝塞尔三角形,后者是 PN 三角形和 Phong 细分的基础。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原