概念页
隐式曲面与有符号距离函数
Implicit Surfaces & Signed Distance Functions
隐式曲面用 定义:代入点结果为零即在曲面上。返回到最近表面有符号距离的 称为有符号距离函数 (SDF)。它们便于做光线求交、构造实体几何 (CSG)、混合与变形,通常用光线步进可视化,也可用移动立方体等方法转为三角形。
定义与基本图元(17.3 节)
相比参数曲面,隐式曲面往往更容易与光线求交,可直接做相减、与、或等 CSG 操作,也容易混合和变形。位于原点的例子:
| 图元 | SDF |
|---|---|
| 球 | |
| xz 平面 | |
| 圆角盒 |
球的值在内部为负、外部为正。圆角盒中绝对值和 max 逐分量计算, 是半边长向量: 把计算折到第一象限,减去 后某轴为负表示该轴方向在盒内,max 把负值夹到 0,所以长度即到盒面的最近距离,盒外多个分量为正时距离场自然变圆;减 把盒向各方向扩张 , 即普通盒。
法线
法线是梯度 ,要求 可微。实践中常用中心差分: y、z 同理, 为小数(结果再归一化即可得方向)。
组合场景
- 并集:取两个操作数中的最小值,因为要找离 最近的表面,例如 是球加地面。
- 变换:先对 施加逆变换再调用 SDF,如 为平移 的球。
- 无限重复:用 代替 作参数。
- 混合(blobby 建模、软物体、metaball):把球、椭球等简单"原子"平滑融合成"分子"。常用的两距离 、混合半径 的混合(书中式 17.57,按原书照录;末项符号见文末「原书问题」): 只混合两个距离,但可反复使用以混合更多物体。
光线步进可视化
flowchart TD
A["光线上当前点 p"] --> B["求场景 SDF 得最近距离 d"]
B --> C{"d 小于 epsilon?"}
C -- "是" --> H["命中表面, 用梯度求法线着色"]
C -- "否" --> D{"步数达到上限?"}
D -- "是" --> BG["视为击中背景"]
D -- "否" --> E["沿光线前进 d"] --> A如上图: 表示以 为中心半径 的球内没有任何物体,所以可以安全前进 。能光线步进场景后,阴影、反射、环境光遮蔽等效果也随之可得。Shadertoy 上 Iñigo Quilez 的雨林(椭球加程序噪声位移)和蜗牛完全由 SDF 与光线步进程序生成。
转为三角形
多边形化算法有多种,著名的是移动立方体(见 体素);Wyvill 与 Bloomenthal 的代码可在网上获得;Tatarchuk 与 Shopf 的 GPU 移动四面体可在三维数据中找等值面,也可用几何着色器提取等值面;Xiao 等的流体系统在 GPU 上计算 10 万粒子并以交互帧率显示其等值面。
取舍
- 优点:求交简单、CSG 与混合自然、表示极其紧凑,适合程序化内容。
- 代价:直接显示需光线步进,每像素多次求值整个场景函数;转换为三角形则要额外多边形化步骤。
原书问题
- 式 17.57 的最后一项印作 (已对照 PDF 页面图像,不是文字提取的问题),本页上文按原书照录。按混合的用途,这一项应当减去:两个表面在某点相交时 ,此时 ,加号给出 ,交界处反被判为在外面,两个形体之间会凹出一道槽;写成 才得到 ,把交界处填平,形成书中图 17.35 那样的平滑融合。当 时 取 0 或 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」等变体。