中EN
概念页

隐式曲面与有符号距离函数

Implicit Surfaces & Signed Distance Functions

隐式曲面用 f(p)=0f(\mathbf{p})=0 定义:代入点结果为零即在曲面上。返回到最近表面有符号距离的 ff 称为有符号距离函数 (SDF)。它们便于做光线求交、构造实体几何 (CSG)、混合与变形,通常用光线步进可视化,也可用移动立方体等方法转为三角形。

定义与基本图元(17.3 节)

f(x,y,z)=f(p)=0f(x,y,z)=f(\mathbf{p})=0 相比参数曲面,隐式曲面往往更容易与光线求交,可直接做相减、与、或等 CSG 操作,也容易混合和变形。位于原点的例子:

图元SDF
球fs(p,r)=∥p∥−rf_s(\mathbf{p},r)=\lVert\mathbf{p}\rVert-r
xz 平面fxz(p)=pyf_{xz}(\mathbf{p})=p_y
圆角盒frb(p,d,r)=∥max⁡(∣p∣−d,0)∥−rf_{rb}(\mathbf{p},\mathbf{d},r)=\lVert\max(\lvert\mathbf{p}\rvert-\mathbf{d},0)\rVert-r

球的值在内部为负、外部为正。圆角盒中绝对值和 max 逐分量计算,d\mathbf{d} 是半边长向量:∣p∣\lvert\mathbf{p}\rvert 把计算折到第一象限,减去 d\mathbf{d} 后某轴为负表示该轴方向在盒内,max 把负值夹到 0,所以长度即到盒面的最近距离,盒外多个分量为正时距离场自然变圆;减 rr 把盒向各方向扩张 rr,r=0r=0 即普通盒。

法线

法线是梯度 ∇f=(∂f/∂x,∂f/∂y,∂f/∂z)\nabla f=(\partial f/\partial x,\partial f/\partial y,\partial f/\partial z),要求 ff 可微。实践中常用中心差分: ∇fx≈f(p+ϵex)−f(p−ϵex)\nabla f_x\approx f(\mathbf{p}+\epsilon\mathbf{e}_x)-f(\mathbf{p}-\epsilon\mathbf{e}_x) y、z 同理,ϵ\epsilon 为小数(结果再归一化即可得方向)。

组合场景

  • 并集:取两个操作数中的最小值,因为要找离 p\mathbf{p} 最近的表面,例如 fs(p,1)∪fxz(p)f_s(\mathbf{p},1)\cup f_{xz}(\mathbf{p}) 是球加地面。
  • 变换:先对 p\mathbf{p} 施加逆变换再调用 SDF,如 fs(p−t,1)f_s(\mathbf{p}-\mathbf{t},1) 为平移 t\mathbf{t} 的球。
  • 无限重复:用 r=mod⁡(p,c)−0.5c\mathbf{r}=\operatorname{mod}(\mathbf{p},\mathbf{c})-0.5\mathbf{c} 代替 p\mathbf{p} 作参数。
  • 混合(blobby 建模、软物体、metaball):把球、椭球等简单"原子"平滑融合成"分子"。常用的两距离 d1,d2d_1,d_2、混合半径 rbr_b 的混合(书中式 17.57,按原书照录;末项符号见文末「原书问题」): h=min⁡(max⁡(0.5+0.5(d2−d1)/rb, 0), 1),d=(1−h)d2+hd1+rbh(1−h)h=\min\big(\max(0.5+0.5(d_2-d_1)/r_b,\,0),\,1\big),\qquad d=(1-h)d_2+hd_1+r_bh(1-h) 只混合两个距离,但可反复使用以混合更多物体。

光线步进可视化

flowchart TD
  A["光线上当前点 p"] --> B["求场景 SDF 得最近距离 d"]
  B --> C{"d 小于 epsilon?"}
  C -- "是" --> H["命中表面, 用梯度求法线着色"]
  C -- "否" --> D{"步数达到上限?"}
  D -- "是" --> BG["视为击中背景"]
  D -- "否" --> E["沿光线前进 d"] --> A

如上图:dd 表示以 p\mathbf{p} 为中心半径 dd 的球内没有任何物体,所以可以安全前进 dd。能光线步进场景后,阴影、反射、环境光遮蔽等效果也随之可得。Shadertoy 上 Iñigo Quilez 的雨林(椭球加程序噪声位移)和蜗牛完全由 SDF 与光线步进程序生成。

转为三角形

多边形化算法有多种,著名的是移动立方体(见 体素);Wyvill 与 Bloomenthal 的代码可在网上获得;Tatarchuk 与 Shopf 的 GPU 移动四面体可在三维数据中找等值面,也可用几何着色器提取等值面;Xiao 等的流体系统在 GPU 上计算 10 万粒子并以交互帧率显示其等值面。

取舍

  • 优点:求交简单、CSG 与混合自然、表示极其紧凑,适合程序化内容。
  • 代价:直接显示需光线步进,每像素多次求值整个场景函数;转换为三角形则要额外多边形化步骤。

原书问题

  • 式 17.57 的最后一项印作 +rbh(1−h)+r_b h(1-h)(已对照 PDF 页面图像,不是文字提取的问题),本页上文按原书照录。按混合的用途,这一项应当减去:两个表面在某点相交时 d1=d2=0d_1=d_2=0,此时 h=0.5h=0.5,加号给出 d=rb/4>0d=r_b/4>0,交界处反被判为在外面,两个形体之间会凹出一道槽;写成 d=(1−h)d2+hd1−rbh(1−h)d=(1-h)d_2+hd_1-r_bh(1-h) 才得到 −rb/4-r_b/4,把交界处填平,形成书中图 17.35 那样的平滑融合。当 ∣d2−d1∣≥rb\lvert d_2-d_1\rvert\ge r_b 时 hh 取 0 或 1,两种写法都退化为 min⁡(d1,d2)\min(d_1,d_2),差别只在混合区内。
  1. realtime_rendering_4ed.pdf 第 17 章 Curves and Curved Surfaces

相关页面

图形学体素Voxels体素是"体积元素",表示均匀三维网格中的一块空间,位置由网格索引隐含。体素是存储体积数据的传统方式,可存占用位、密度、颜色、法线、有向距离等。数据量按分辨率立方增长,常用稀疏体素八叉树 (SVO) 等结构压缩;可由 GPU 体素化生成,并通过光线投射、转多边形、移动立方体或等值面/水平集光线追踪来渲染(RTR4 13.10 节)。图形学参数曲面与贝塞尔面片Parametric Surfaces & Bézier Patches参数曲面把参数曲线从一个参数推广到两个参数 (u,v),由少量控制点定义,运行时细分成任意多个三角形,是质量与速度之间的天然权衡:三角形多则着色和轮廓更好。矩形定义域的是贝塞尔面片(张量积曲面),三角形定义域的是贝塞尔三角形,后者是 PN 三角形和 Phong 细分的基础。图形学参与介质与体积散射Participating Media & Volumetric Scattering参与介质是充满粒子、通过吸收和散射参与光传输的体积,如空气、水、雾、烟、云;皮肤、蜡等致密材质也有强烈散射——"一切都是散射"。实时渲染主要考虑单次散射:沿视线积分透射率衰减后的内散射光,内散射由相位函数和对光源的可见性(不透明阴影 × 体积阴影)决定。通用实时方案把介质材质和散射结果体素化到相机视锥体素 (froxel) 中逐片累积(RTR4 14.1、14.3、14.8 节)。图形学文本渲染Text Rendering文本中一个像素的变化就可能把 "l" 变成 "1",因此字形渲染格外讲究。主要路线有:按字号预生成字形位图纹理(配合微调和子像素渲染)、有符号距离场纹理(可在三维表面任意缩放旋转)、以及在 GPU 上直接求值字形曲线。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。图形学贴花渲染Decal Rendering贴花 (decal) 是叠加在表面上的图案或纹理,如轮胎印、弹孔、玩家喷漆、标志。贴花可只改颜色(纹身)、只改凹凸(压印标志)或换成完全不同的材质(车窗贴纸),可多个叠在同一几何上,也可横跨多个模型。主流做法是用有向盒做正交投影的投影贴花;延迟着色把贴花效果直接写进 G-buffer,分簇前向着色则把贴花像光源一样放进簇列表。游戏开发 · UE5Lumen 全局光照与反射Lumen Global Illumination & ReflectionsLumen 是 UE5 默认的全动态全局光照 (Global Illumination, GI) 与反射系统:先做屏幕空间追踪,未命中再对"Lumen 场景"做软件光追(有符号距离场)或硬件光追,命中点的光照从按网格离线放置的卡片 (Card) 构成的表面缓存 (Surface Cache) 中查询,表面缓存的直接与间接光照分摊到多帧更新,从而得到无限次漫反射弹射和全粗糙度范围的反射。图形学可微渲染与神经渲染Differentiable & Neural Rendering逆向渲染 (inverse rendering) 要从图像反推场景参数 \mathbf x(形状、材质、光照……),通常写成优化问题 \mathbf x^=\arg\min{\mathbf x}g(f(\mathbf x)),其中 f 是渲染器,g 是损失函数。参数维度可达数百万,只能用梯度下降,因此需要可微渲染 (differentiable rendering):不构造巨大的雅可比矩阵,直接计算"图像空间梯度 × 雅可比"这一向量-矩阵乘积。难点是可见性造成的不连续、反向模式的内存开销和导数积分的采样。机器学习与渲染的结合可分三类:用学习得到的数据结构替换传统数据结构、用神经网络改进传统渲图形学二维 SDF 形状2D SDF Shapes在片元着色器里画形,不是发三角形图元,而是对每个像素问「我在形的里面还是外面」。矩形用 step/smoothstep 做轴对齐边界;圆与更复杂形用距离场 (distance field)——到特征点的距离再阈值。这是 2D SDF 程序化造型的入门路径。图形学细胞噪声Cellular NoiseSteven Worley(1996)《A Cellular Texture Basis Function》——书中注明约在 Perlin 原始噪声发表十六年之后、其 Simplex Noise(2001)五年之前——把程序纹理建立在「到最近特征点的距离」上,即细胞噪声 / Worley 噪声。GPU 上用格子 + 邻域搜索代替「对全体点求最小距离」;再多存最近特征点身份即可得到 Voronoi 图。后续有 2×2 邻域加速、精确边界与「voro-noise」等变体。

输入关键词开始搜索

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