中EN
概念页

线框与线条渲染

Wireframe & Line Rendering

更新于 2026-10-13 约 3 分钟线框隐藏线光晕线重心坐标深度偏移

实心"硬"线条看似简单,却在 CAD、选中高亮、技术插图中很重要。难点在于:线与三角形位于同一位置时如何保证线在前面;如何隐藏或淡化被遮挡的线;线交叉时如何用光晕表现前后关系。

在填充三角形上画边(15.4.1 节)

方法做法取舍
固定偏移所有线画得略靠近相机偏移太大,本该隐藏的边露出;太小,近乎侧对的三角形会挡住边
斜率偏移用 glPolygonOffset 之类的调用把线下方的表面按斜率推后效果不错但不完美
模板法 (Herrell 等)一系列步骤标记并清除模板缓冲,完全不用偏移每个三角形要单独绘制并清模板,只适合极小的三角形集合
重心坐标 (Bærentzen 等)像素着色器用三角形重心坐标求到最近边的距离,足够近就画边色适合 GPU,线宽可任意、可随距离变或保持恒定、可抗锯齿;轮廓边只有内部线一半粗(每个三角形只画半条线宽),实践中通常不明显
一维纹理坐标 (Celes & Abraham)每条边的两个端点纹理坐标为 1.0、对顶点为 0.0,利用纹理映射和 mip 链得到恒定线宽易于实现,可设最大密度,避免密集网格被边填满成实色

隐藏线与遮挡线(15.4.2 节)

  • 隐藏线:普通线框里所有边都可见。先把全部填充三角形只画进 z-buffer,再正常画边;若无法先画完所有表面,可用与背景同色的实色画表面,代价略高。
  • 遮挡线(被遮挡部分显示为浅灰而非完全隐藏):先按上面画一遍;再把深度测试反向,只画比当前像素深度更远的线,同时关闭深度写入,以遮挡样式再画一次线,于是只有本应隐藏的线以浅灰出现。
  • 风格化线条需要完整的隐藏线消除流程(见 轮廓边与几何描边)。

光晕线(15.4.3 节)

两线交叉时惯例是擦掉较远那条线的一部分,使前后关系一目了然。

flowchart LR
  A["每条线画成粗四边形, 只写 z-buffer: 光晕"] --> B["正常颜色画每条细线, 带偏移位于粗四边形之上"]
  B --> C["被前方光晕遮住的远处线段消失"]

如上图,每条线画两次:第一次以粗四边形(可用几何着色器生成)只写深度形成光晕,第二次正常绘制;需偏移保证细黑线位于自身粗四边形之上。

  • 坑:在顶点相交的线会被彼此的光晕部分遮住;缩短光晕四边形有帮助但会带来其他伪影。
  • 替代方案:Bærentzen 等的逐三角形重心坐标方法也可做光晕,没有相互干扰;或用图像后处理检测并绘制光晕。

四种常见风格:线框、隐藏线、遮挡线、光晕线。

  1. realtime_rendering_4ed.pdf 第 15 章 Non-Photorealistic Rendering

相关页面

图形学轮廓边与几何描边Contour Edges & Geometric Outlining卡通渲染的黑色描边可以按表面着色、过程几何、图像处理、几何边检测或混合方式生成。本页讲边的分类,以及在几何层面生成描边的三类方法:基于着色法线、背面过程几何(偏移、膨胀、外壳)、显式检测轮廓边并做隐藏线消除。图像空间方法见 图像空间边缘检测。图形学深度缓冲Z-Buffer深度缓冲是几乎所有图形硬件用来解决可见性的算法:为每个像素存一个当前最近图元的深度值,新片元更近才写入颜色和深度。它简单、和图元数量成线性关系、允许大多数图元以任意顺序绘制,但不能直接处理半透明。图形学合并阶段与帧缓冲Merging & Framebuffer合并阶段把像素着色算出的片元颜色和缓冲区里已有的颜色结合起来,同时负责深度测试、模板测试和混合。它通常不可编程但高度可配置,也叫 ROP(光栅操作或渲染输出单元)。帧缓冲是系统中所有缓冲区的总称。图形学像素着色器Pixel Shader像素着色器(OpenGL 里叫片元着色器)对光栅化产生的每个片元运行,用插值后的顶点数据算出颜色,也可以输出不透明度、修改深度或直接丢弃片元。多渲染目标让它一次输出多组数据,催生了延迟着色。它通常只能写自己所在的像素,但能通过 2×2 quad 拿到相邻像素的导数。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。

输入关键词开始搜索

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