中EN
概念页

轮廓边与几何描边

Contour Edges & Geometric Outlining

卡通渲染的黑色描边可以按表面着色、过程几何、图像处理、几何边检测或混合方式生成。本页讲边的分类,以及在几何层面生成描边的三类方法:基于着色法线、背面过程几何(偏移、膨胀、外壳)、显式检测轮廓边并做隐藏线消除。图像空间方法见 图像空间边缘检测。

边的分类(15.2 节)

类型定义是否与视角相关
边界边 (boundary / border)不被两个三角形共享,如纸张边缘;实心物体通常没有否
折痕边 (crease / hard / feature)两个三角形的二面角大于阈值(默认可取 60°),可再分为脊 (ridge) 和谷 (valley)否
材质边 (material)两侧材质或着色不同,或美术希望始终显示(如额头皱纹、同色衣裤分界)否
轮廓边 (contour)相邻两三角形相对某方向(通常是视线)一正一背是
剪影边 (silhouette)轮廓边中把物体与背景或其他物体分开的那部分是

剪影边是轮廓边的子集:侧面看头部时,耳朵形成的是轮廓边,但位于剪影之内。早期文献常把轮廓边称为 silhouette;也不要和地形图的等高线混淆。暗示轮廓 (suggestive contours) 是从当前视点"几乎是轮廓"的位置,能额外传达形状。

方法一:着色法线轮廓(15.2.1 节)

  • 用着色法线与视线方向的点积:接近 0 说明表面几乎侧对视线,涂黑,随点积增大渐变到白。可在像素着色器中直接实现(可编程着色器出现前用带黑环的球面环境贴图或把 mipmap 顶层涂黑)。
  • 可看作从眼睛位置照明并夸大衰减的"反边缘光",或图像处理中的阈值滤波。
  • 线宽随表面曲率变化(既是特点也是缺点);只适合无折痕的曲面模型,立方体上失效;远处物体法线采样不足时线条会断裂。Goodwin 等讨论用光照、曲率和距离共同决定笔画粗细。

方法二:背面过程几何(15.2.2 节)

共同流程:先正常绘制正面,再开启正面剔除、关闭背面剔除,只渲染背面,让背面的轮廓露出来。

flowchart LR
  A["正常绘制正面"] --> B["切换为只绘制背面"]
  B --> C1["只画背面的边 + 偏移"]
  B --> C2["背面涂黑并向前 z 偏移"]
  B --> C3["背面三角形沿平面膨胀"]
  B --> C4["背面沿顶点法线外推: 外壳/光晕"]

上图四个分支是同一框架下的不同背面绘制方式,取舍如下:

  • 画背面边:配合偏移让部分线画在正面之前,只有正背面相接处可见;线条连接差,小特征处因偏移问题宽度不均。
  • z 偏移背面:固定量平移、补偿 z 非线性的平移或 glPolygonOffset 之类的斜率偏移,Lengyel 讨论通过修改透视矩阵精细控制深度。问题是线宽还取决于相邻正面的角度,无法均匀。
  • 三角形膨胀 (Raskar & Cohen):按三角形斜率和到观察者的距离,把每个背面三角形沿自身平面向外扩张,使屏幕上线宽一致;扩张三个顶点对细长三角形会拉出尖角,更安全的做法是把每条边外移再接成斜接角。无需偏移,可控、一致,用于《波斯王子》《Afro Samurai》的角色描边。
  • 外壳 / 光晕法 (shell / halo,也叫 shell mapping):把背面顶点沿共享顶点法线外推,外推量与到眼睛的 z 距离成正比,形成包围物体的外壳;例如若球心移动一个像素相当于世界空间 3 mm,要 5 像素宽的描边就把半径增加 15 mm,只画扩张后的背面。顶点着色器即可实现,简单、高效、稳健、性能稳定(《Cel Damage》);进一步扩张并按角度着色可做力场或光晕效果。
    • 坑:正对立方体时,四个背面沿各自面法线移动,角上出现缝隙,因为同一位置的角顶点有不同法线。解决办法是让同位置顶点共享平均法线,或在折痕处加入退化几何,扩张后变成有面积的三角形;Lira 等用阈值纹理控制每个顶点的外推量。

这类方法的共同优缺点:渲染时不需要连接信息或边表,每个三角形独立处理,很适合 GPU;但所有背面都进入管线,浪费填充率;对描边外观几乎无控制;半透明表面视透明算法而定难以正确处理。它们只生成轮廓边。Raskar 给出无需边连接结构即可在变形模型上绘制脊折痕的方法:沿三角形每条边生成一个按临界二面角向外弯折的小"鳍"多边形,相邻三角形夹角超过阈值时鳍露出、涂黑即为脊线;谷边需要模板缓冲和多遍渲染。

方法三:几何轮廓边检测(15.2.4 节)

想要虚线、手绘、笔刷等风格化描边,必须显式找到轮廓边。轮廓边判定为 (n0⋅v)(n1⋅v)<0(\mathbf{n}_0\cdot\mathbf{v})(\mathbf{n}_1\cdot\mathbf{v}) < 0 其中 n0,n1\mathbf{n}_0,\mathbf{n}_1 是两个相邻三角形法线,v\mathbf{v} 是从眼睛到边(任一端点)的方向;表面必须朝向一致。

  • 暴力遍历所有边;Lander 指出可剔除共面三角形之间的边(一个时钟模型从 444 条降到 256 条),实心物体的凹边也永远不会是轮廓边;Buchanan 与 Sousa 复用逐面点积结果,避免逐边重复计算。
  • 帧间连贯:Aila 与 Miettinen 为每条边记录"有效距离";Markosian 等用随机搜索更新轮廓环集合;Kalnins 等用像素搜索与"投票"保持连贯,处理两个环合并时的跳变。这类方法快但不精确。
  • 层次方法:Gooch 等用高斯图层次(正交视图、非动画模型),Sander 等用法线锥 n 叉树,Hertzmann 与 Zorin 用对偶空间表示。
  • 实心模型的每条轮廓都是一个闭合的轮廓环,因此每个顶点连接偶数条轮廓边;沿网格边的环在三维中常常很锯齿,需要更平滑曲线时可在三角形内插值法线近似真实轮廓。
  • GPU 方案:以上 CPU 方法缓存一致性差。可把每条边作为退化四边形送入管线,顶点附带两侧三角形法线,顶点着色器判定为轮廓时把四边形撑开成细"鳍"(与阴影体找轮廓的思路相同,见 阴影基础与阴影体);有几何着色器时可即时生成,朴素实现会在鳍之间留缝,需要修改鳍的形状。

隐藏线消除与风格化笔画(15.2.5 节)

  • 笔画可以是简单线、带纹理的替身、一组图元等。并非所有几何边都可见:先渲染表面建立 z-buffer 可遮掉隐藏边,对虚线这类简单风格够用;Cole 与 Finkelstein 沿线的"脊"采样深度。但这样每个点独立渲染,不知道笔画的起止点。
  • 隐藏线渲染:处理一组线段的可见性,返回更少的(可能被裁剪的)线段。Northrup 与 Markosian 给三角形和轮廓边分配 ID,读回 ID 缓冲确定可见边,再连接成平滑笔画路径,可加锥化、外扩、抖动、过冲、淡出及深度距离提示;适用于屏幕上线段较短的情况,不裁剪线段本身。Cole 与 Finkelstein 的 GPU 方法用多遍像素着色器裁剪、计算像素长度、建立图集判定可见性,得到有明确起止点的可见笔画。
  • Rougier 用纹理存储所有虚线模式(含端头与连接类型的命令),在着色器中程序化渲染虚线。
  • 难点:找轮廓、连成链、判可见性难以完全并行;下一帧笔画长度变化或首次出现时的时间连贯性仍是未解决的问题。
  1. realtime_rendering_4ed.pdf 第 15 章 Non-Photorealistic Rendering

相关页面

图形学卡通着色Toon Shading非真实感渲染 (NPR,也称风格化渲染) 不追求照片般逼真,而是追求特定目的或画风。卡通 / cel 渲染是其中最受关注的一种:用实线分隔大块纯色区域。表面着色常用纯色填充、两色"硬着色"、或对最终图像做色调分离 (posterization);描边见 轮廓边与几何描边。图形学图像空间边缘检测Image-Space Edge Detection不碰场景几何,只对渲染出的深度、法线、物体 ID 等缓冲(G-buffer)做图像处理来找出描边位置,再用形态学算子加粗、与着色结果合成。它对任何表面都适用、不要求网格连通,是游戏中最常见的描边方式之一;缺点是边的判定需要按内容调参,可能漏检或误检。图形学笔触与表面风格化Stroke Surface Stylization除卡通外,表面还可以呈现素描、炭笔、铅笔等笔触风格。核心问题是:按明暗选择笔触纹理,并在物体远近变化、运动时保持屏幕上笔触粗细和密度稳定。屏幕空间纹理会产生"浴室门效应",贴在表面上的纹理又要用色调艺术贴图 (TAM) 解决缩放问题。图形学线框与线条渲染Wireframe & Line Rendering实心"硬"线条看似简单,却在 CAD、选中高亮、技术插图中很重要。难点在于:线与三角形位于同一位置时如何保证线在前面;如何隐藏或淡化被遮挡的线;线交叉时如何用光晕表现前后关系。图形学阴影基础与阴影体Shadow Basics & Shadow Volumes阴影帮助玩家判断物体的位置。精确光源只产生硬阴影,面光源产生带本影和半影的软阴影。最简单的情况是投射到平面上的投影阴影;投影纹理可把阴影扩展到曲面;阴影体用模板缓冲计数,能在任意表面得到精确硬阴影,但开销极不稳定,如今很少使用。图形学顶点着色器Vertex Shader顶点着色器是程序员直接控制的第一个管线阶段,逐个处理输入顶点,至少要输出顶点在齐次裁剪空间里的位置。它不能创建或删除顶点,顶点之间也不能传递结果,正因如此可以大规模并行。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。图形学网格整合与顶点法线Mesh Consolidation & Vertex Normals整合 (consolidation) 指把零散多边形合并成共享顶点的网格、让所有面朝向一致、判断是否为实体,并生成平滑的顶点法线与折痕边。这些步骤是背面剔除、折痕检测、阴影体、碰撞检测、3D 打印等的前提。

输入关键词开始搜索

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