目 录CONTENT

文章目录

图形渲染管线

hananww
2026-07-10 / 0 评论 / 0 点赞 / 19 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

[toc]


图形渲染管线

%%{init: {"flowchart": {"htmlLabels": true, "curve": "basis", "nodeSpacing": 32, "rankSpacing": 56}} }%%
graph LR
    F0([一帧开始<br/>Frame Begin])

    %% ========== 应用阶段 ==========
    subgraph Application["应用阶段 | CPU 主导"]
        direction TB
        A1[输入处理<br/>Input Handling]:::cpu
        A2[游戏逻辑与 AI<br/>Game Logic / AI]:::cpu
        A3[物理与碰撞<br/>Physics / Collision]:::cpu
        A4[动画更新<br/>Animation Update]:::cpu
        A5[场景图与 Transform 更新<br/>Scene Graph / Transform]:::cpu
        A6[可见性剔除与 LOD<br/>Culling / LOD]:::cpu
        A7[渲染数据收集<br/>Render Data Collection]:::cpu
        A8[绘制命令构建<br/>Draw Command Build]:::cpu

        A1 --> A2 --> A3 --> A4 --> A5 --> A6 --> A7 --> A8
    end

    %% ========== 渲染调度与资源阶段 ==========
    subgraph RenderSetup["渲染调度与资源准备 | CPU + Driver + GPU"]
        direction TB
        R1[Frame Graph / Render Graph<br/>决定 Pass 顺序与依赖]:::setup
        R2[Shader Variant / Material 选择<br/>Pipeline State Selection]:::setup
        R3[资源绑定<br/>Texture / Buffer / UBO / Descriptor]:::setup
        R4[Render Target / Depth Buffer 绑定<br/>Framebuffer Setup]:::setup
        R5[资源状态转换<br/>Barrier / Layout Transition]:::setup
        R6[Batching / Instancing / Sorting<br/>减少 Draw Call 与状态切换]:::setup
        R7[提交 Command Buffer<br/>Queue Submit]:::setup

        R1 --> R2 --> R3 --> R4 --> R5 --> R6 --> R7
    end

    %% ========== 一帧常见 Pass ==========
    subgraph Passes["一帧常见 Render Pass"]
        direction TB
        P1[Shadow Map Pass<br/>生成阴影贴图]:::pass
        P2[Depth Prepass<br/>提前写入深度]:::pass
        P3[Opaque Pass<br/>Forward 或 GBuffer]:::pass
        P4[Lighting Pass<br/>Deferred / Forward+ / Cluster]:::pass
        P5[Transparent Pass<br/>半透明排序与混合]:::pass
        P6[Post Process Pass<br/>后处理]:::pass
        P7[UI / Debug Pass<br/>界面与调试绘制]:::pass

        P1 --> P2 --> P3 --> P4 --> P5 --> P6 --> P7
    end

    %% ========== 现代 GPU 可选路径 ==========
    subgraph ModernGPU["现代 GPU 可选路径"]
        direction TB
        M1[Compute Shader<br/>计算着色器]:::modern
        M2[GPU Culling / GPU LOD<br/>GPU 剔除与 LOD]:::modern
        M3[Indirect Draw<br/>间接绘制]:::modern
        M4[Mesh Shader / Task Shader<br/>替代部分传统几何管线]:::modern
        M5[Tiled / Cluster Lighting<br/>屏幕分块或簇光照列表]:::modern

        M1 --> M2 --> M3 --> M4
        M1 --> M5
    end

    %% ========== 几何处理阶段 ==========
    subgraph Geometry["几何处理阶段 | GPU"]
        direction TB
        G1[输入装配 IA<br/>Input Assembler]:::gpu_fixed
        G2[顶点着色器 VS<br/>Vertex Shader]:::gpu_programmable
        G3[可选曲面细分<br/>HS/TCS -> Tessellator -> DS/TES]:::gpu_optional
        G4[可选几何着色器 GS<br/>Geometry Shader]:::gpu_optional_programmable
        G5[可选流式输出<br/>Stream Output / Transform Feedback]:::gpu_optional
        G6[图元装配<br/>Primitive Assembly]:::gpu_fixed
        G7[裁剪与剔除<br/>Clipping / Back-face Culling]:::gpu_configurable
        G8[透视除法<br/>Perspective Divide]:::gpu_fixed
        G9[视口变换<br/>Viewport Transform]:::gpu_fixed

        G1 --> G2 --> G3 --> G4 --> G5 --> G6 --> G7 --> G8 --> G9
    end

    %% ========== 光栅化阶段 ==========
    subgraph Rasterization["光栅化阶段 | GPU Fixed Function"]
        direction TB
        C1[三角形设置<br/>Triangle Setup]:::gpu_fixed
        C2[屏幕空间遍历<br/>Triangle Traversal]:::gpu_fixed
        C3[片元生成<br/>Fragment Generation]:::gpu_fixed
        C4[属性插值<br/>Varying / Attribute Interpolation]:::gpu_fixed
        C5[采样覆盖<br/>MSAA / Sample Coverage]:::gpu_fixed
        C6[Scissor / Viewport Test<br/>裁剪矩形与视口测试]:::gpu_configurable

        C1 --> C2 --> C3 --> C4 --> C5 --> C6
    end

    %% ========== 像素处理阶段 ==========
    subgraph Pixel["像素处理阶段 | GPU"]
        direction TB
        D1[Early-Z / Early-Stencil<br/>提前深度与模板测试]:::gpu_fixed_opt
        D2[片元/像素着色器<br/>Fragment / Pixel Shader]:::gpu_programmable
        D3[纹理采样与 BRDF<br/>Texture Sampling / Lighting]:::gpu_programmable
        D4[Alpha Test / discard<br/>可能导致 Early-Z 失效]:::gpu_programmable
        D5[Late-Z / Late-Stencil<br/>后置深度与模板测试]:::gpu_fixed
        D6[颜色混合<br/>Blending / Alpha Blend]:::gpu_configurable
        D7[输出合并 OM<br/>Render Target / Depth Write]:::gpu_configurable
        D8[ROV / UAV / Storage Image<br/>有序或随机写入]:::gpu_advanced

        D1 --> D2 --> D3 --> D4 --> D5 --> D6 --> D7 --> D8
    end

    %% ========== 后处理与显示 ==========
    subgraph PostPresent["后处理与最终显示"]
        direction TB
        E1[HDR Color Buffer<br/>高动态范围颜色缓冲]:::post
        E2[MSAA Resolve<br/>多重采样解析]:::post
        E3[TAA / FXAA / Bloom<br/>抗锯齿与泛光]:::post
        E4[Tone Mapping / Color Grading<br/>色调映射与调色]:::post
        E5[sRGB / Gamma Conversion<br/>颜色空间转换]:::post
        E6[Swapchain Present<br/>提交到屏幕]:::post

        E1 --> E2 --> E3 --> E4 --> E5 --> E6
    end

    %% ========== 主流程连接 ==========
    F0 --> A1
    A8 --> R1
    R7 --> P1
    P7 --> G1
    G9 --> C1
    C6 --> D1
    D8 --> E1

    %% ========== 可选现代路径连接 ==========
    R1 -.-> M1
    M3 -.-> G1
    M4 -.-> C1
    M5 -.-> D3

    %% ========== TA 关注点 ==========
    subgraph TANotes["TA 重点关注"]
        direction TB
        TA1[CPU 侧<br/>Draw Call 数量<br/>剔除有效性<br/>动画/物理成本]:::ta_note
        TA2[资源侧<br/>Shader Variant 爆炸<br/>材质切换<br/>纹理/Buffer 绑定成本]:::ta_note
        TA3[几何侧<br/>顶点带宽<br/>蒙皮成本<br/>小三角形<br/>Z-Fighting]:::ta_note
        TA4[光栅侧<br/>Overdraw<br/>Fillrate<br/>MSAA 成本<br/>Tile GPU 带宽]:::ta_note
        TA5[像素侧<br/>Texture 带宽<br/>Shader 分支<br/>discard<br/>半透明排序]:::ta_note
        TA6[后处理侧<br/>HDR 带宽<br/>Resolve 成本<br/>TAA/Bloom<br/>色彩空间正确性]:::ta_note
    end

    A6 -.-> TA1
    R6 -.-> TA2
    G2 -.-> TA3
    C3 -.-> TA4
    D2 -.-> TA5
    E3 -.-> TA6

    %% ========== 样式 ==========
    classDef cpu fill:#e6f7ff,stroke:#1890ff,color:#000,text-align:left;
    classDef setup fill:#eef6ff,stroke:#2f54eb,color:#000,text-align:left;
    classDef pass fill:#f0f5ff,stroke:#597ef7,color:#000,text-align:left;
    classDef modern fill:#f9f0ff,stroke:#722ed1,color:#000,text-align:left;
    classDef gpu_fixed fill:#f6ffed,stroke:#52c41a,color:#000,text-align:left;
    classDef gpu_programmable fill:#d9f7be,stroke:#52c41a,color:#000,text-align:left;
    classDef gpu_optional fill:#fff7e6,stroke:#fa8c16,color:#000,text-align:left;
    classDef gpu_optional_programmable fill:#fff7e6,stroke:#fa8c16,color:#000,text-align:left;
    classDef gpu_configurable fill:#fffbe6,stroke:#faad14,color:#000,text-align:left;
    classDef gpu_fixed_opt fill:#f9f0ff,stroke:#722ed1,color:#000,text-align:left;
    classDef gpu_advanced fill:#f0f0f0,stroke:#404040,color:#000,text-align:left;
    classDef post fill:#fff1f0,stroke:#f5222d,color:#000,text-align:left;
    classDef ta_note fill:#fafafa,stroke:#999,stroke-dasharray:5 5,color:#333,text-align:left;

    style Application fill:#f0f9ff,stroke:#1890ff;
    style RenderSetup fill:#f5f8ff,stroke:#2f54eb;
    style Passes fill:#f0f5ff,stroke:#597ef7;
    style ModernGPU fill:#fbf7ff,stroke:#722ed1;
    style Geometry fill:#f6ffed,stroke:#52c41a;
    style Rasterization fill:#fff7e6,stroke:#fa8c16;
    style Pixel fill:#fffbe6,stroke:#faad14;
    style PostPresent fill:#fff1f0,stroke:#f5222d;
    style TANotes fill:#fafafa,stroke:#999,stroke-dasharray:5 5;
  • 🔵 #e6f7ff:CPU阶段(应用层)
  • 🟢 #f6ffed:GPU固定功能(光栅化、裁剪等)
  • 🟢 深 #d9f7be完全可编程(VS/PS)
  • 🟠 #fff7e6可选阶段(Tessellation/GS/ROV)
  • 🟡 #fffbe6高度可配置(OM/Blend)

渲染管线架构总览

应用阶段(application)

🟢 世界的模拟器与调度中心

  • 执行位置:CPU(主导) + GPU Compute(辅助,如GPU物理/粒子)
  • 核心作用:驱动整个虚拟世界的状态更新,决定“这一帧要画什么、物体在哪、发生了什么交互”,并为GPU准备最终的数据和指令。
  • 完整子过程
    1. 输入处理 (Input Handling):采集键盘、鼠标、VR手柄、触觉反馈(力反馈)等用户输入。
    2. 游戏逻辑与AI (Game Logic & AI):执行行为树、状态机、NPC寻路(NavMesh)等规则计算。
    3. 物理模拟 (Physics Simulation)
      • 刚体动力学:计算重力、速度、加速度、关节约束。
      • 软体/流体模拟:布料解算、毛发动力学、流体粒子(部分可交由GPU Compute异步处理)。
    4. 碰撞检测 (Collision Detection)
      • 宽相 (Broad-phase):利用空间划分(BVH、八叉树、四叉树)快速筛选可能相交的物体对。
      • 窄相 (Narrow-phase):精确计算GJK/EPA算法,生成碰撞流形(Contact Manifold),触发物理响应或游戏事件(如射线检测 Raycast)。
    5. 动画系统 (Animation System)
      • 骨骼蒙皮 (Skeletal Animation):计算骨骼矩阵层级,更新顶点权重(也可在VS阶段做)。
      • 变形动画 (Morph Target / Blend Shape):计算面部表情或形变权重。
      • IK (反向动力学):计算脚部贴地、手部抓取等 IK 链。
    6. 场景图与空间结构更新 (Scene Graph Update):更新物体的世界矩阵,重建用于剔除和物理查询的加速结构(如 BVH)。
    7. 可见性剔除 (Culling)
      • 视锥体剔除 (Frustum Culling):剔除相机视野外的物体。
      • 遮挡剔除 (Occlusion Culling):利用 CPU 软件光栅化或 GPU 硬件遮挡查询(Hi-Z)剔除被挡住的物体。
      • 细节剔除 (Detail Culling):剔除过小、对画面无贡献的物体。
    8. 渲染状态与资源准备 (State & Resource Prep):材质排序、Draw Call 批处理(Instancing/SRP Batcher)、绑定纹理/Buffer。
    9. 提交绘制命令 (Command Submission):将最终的图元数据和状态打包成 Command Buffer,提交给 GPU。

[!note] TA关注点:CPU瓶颈分析(Profile)、物理/碰撞精度与性能的权衡、动画节点优化、剔除算法的有效性。

几何处理阶段(geometry processing)

“空间变换与几何重塑”

  • 执行位置:GPU(可编程着色器 + 固定功能硬件)
  • 核心作用:处理顶点、改变拓扑、计算空间位置,将3D模型从局部坐标系映射到屏幕2D坐标系。
  • 完整子过程
    1. 输入装配 (Input Assembler, IA):从显存读取顶点数据,组装成图元(点、线、三角形)。
    2. [顶点着色器 (Vertex Shader, VS)](###顶点着色器(vertex shading)):[必选/可编程] 空间变换(MVP矩阵)、顶点动画、传递属性。
    3. 曲面细分 (Tessellation):[可选]
      • Hull Shader (TCS):计算细分因子。
      • Tessellator:[固定功能] 生成网格拓扑和重心坐标。
      • Domain Shader (TES):计算细分后的顶点位置。
    4. 几何着色器 (Geometry Shader, GS) :[可选/可编程] 图元增删、法线生成、CubeMap多视口输出。
    5. 图元装配 (Primitive Assembly):将着色器输出的顶点重新组装成完整的三角形/线图元,为裁剪做准备。
    6. 裁剪 (Clipping):[固定功能] 将超出视锥体近/远/左/右/上/下平面的图元进行切割或丢弃。
    7. 透视除法 (Perspective Divide):[固定功能] 将裁剪空间(Clip Space)的 W 分量除到 XYZ 上,得到归一化设备坐标(NDC)。
    8. 视口变换 (Viewport Transform):[固定功能] 将 NDC 映射到屏幕像素坐标,并将深度 Z 映射到 [0, 1]。
    9. 背面剔除 (Back-face Culling):[可配置] 根据绕序丢弃背向相机的三角形。
    10. 流式输出 (Stream Output / Transform Feedback):[可选] 将几何阶段处理后的顶点数据捕获回显存 Buffer,用于 GPU 粒子或物理缓存。
  • TA关注点:顶点带宽、蒙皮性能、细分裂缝、GS导致的并行度下降、Z-Fighting(深度精度问题)。

光栅化阶段(rasterization)

“从连续几何到离散像素的桥梁”

  • 执行位置:GPU(纯固定功能硬件,高度并行)
  • 核心作用:确定三角形覆盖了屏幕上的哪些像素,并为这些像素(片元)生成初始的插值数据。
  • 完整子过程(无遗漏版)
    1. 三角形设置 (Triangle Setup):[固定功能] 计算三角形的边界框(Bounding Box)和边缘方程(Edge Equations),用于后续判断像素是否在三角形内。
    2. 三角形遍历 (Triangle Traversal):[固定功能] 扫描边界框内的像素/采样点,利用边缘方程判断哪些点被三角形覆盖。
    3. 片元生成 (Fragment Generation):为每个被覆盖的像素/采样点生成一个“片元(Fragment)”。
    4. 属性插值 (Attribute Interpolation):利用重心坐标(Barycentric Coordinates),对顶点着色器传来的数据(UV、法线、颜色、深度)进行透视正确插值(Perspective-Correct Interpolation)
    5. 多重采样处理 (MSAA Setup):如果开启了抗锯齿,此阶段会生成多个子采样点(Sub-samples)并记录覆盖率掩码(Coverage Mask)。
  • TA关注点:过绘制(Overdraw)、小三角形/细长三角形导致的遍历效率低下、透视插值失真(如非均匀缩放导致的法线错误)。

像素处理阶段(pixel processing)

“最终的着色与合成决策”

  • 执行位置:GPU(可编程着色器 + 固定功能合并单元)
  • 核心作用:计算每个片元的最终颜色,并通过一系列测试和混合操作,决定是否将其写入帧缓冲。
  • 完整子过程(无遗漏版)
    1. Early-Z / Early-Stencil 测试:[固定功能/优化] 在运行昂贵的 Pixel Shader 之前,先用当前深度/模板值进行测试,剔除被遮挡的片元(若 PS 修改深度或使用 discard 则失效)。
    2. 像素着色器 (Pixel/Fragment Shader, PS):[必选/可编程]
      • 纹理采样 (Texture Sampling):Mipmap 选择、各向异性过滤(Anisotropic Filtering)。
      • 光照计算 (Lighting):PBR、BRDF、法线映射、全局光照(GI)探针采样。
      • 材质逻辑:Alpha Test、溶解效果、自定义 UAV 写入。
    3. 模板测试 (Stencil Test):[固定功能] 将片元的模板值与缓冲区进行比较,决定去留(常用于轮廓线、镜像、延迟渲染的光源剔除)。
    4. 深度测试 (Depth/Z Test):[固定功能] 比较片元深度与深度缓冲区,决定可见性(Less, Equal, Always 等)。
    5. 颜色混合 (Blending):[固定功能] 将片元颜色与帧缓冲中已有的颜色进行混合(Alpha Blend, Additive, Multiply, Min/Max)。
    6. 双重源混合 (Dual Source Blending):[可选] PS 输出两个颜色源参与混合计算。
    7. 输出合并 (Output Merger, OM):将最终结果写入 Render Target(支持 MRT 多渲染目标)。
    8. 光栅器有序视图 (ROV / Rasterizer Ordered Views):[高级特性] 强制保证 PS 对特定资源的访问顺序,用于实现无排序的半透明渲染(OIT)。
  • TA关注点:Shader 指令数与分支优化、纹理带宽、Early-Z 失效排查、半透明排序队列(Render Queue)、混合模式导致的“黑边/白边”问题。

应用阶段

碰撞检测(collision detection)

  • 通常会在这个阶段中实现。当检测到两个物体之间的碰撞之后,会产生相应的响应,并返回给碰撞物体,同时也返回给力反馈设备(如果有的话)。
    处理用户输入
  • 例如键盘、鼠标或者头戴式显示器等,会根据不同的输入,从而采取不同的操作。
    加速算法
  • 例如特殊的剔除算法等,以及渲染管线剩余部分无法处理的一切问题,都会在应用阶段中完成。

几何处理阶段

运行在GPU上的几何处理阶段会负责大部分的 逐三角形(per-triangle)逐顶点(per-vertex) 操作。
将几何处理阶段再细分下去,可以划分为以下几个功能性阶段:

  • 顶点着色(vertex shading)
  • 投影(projection)
  • 裁剪(clipping)
  • 屏幕映射(screen mapping)

顶点着色器(vertex shading)

【顶点着色(vertex shading) 的任务主要有两个:

  1. 计算顶点位置(Position Transformation):
    这是顶点着色器最基本且必须完成的任务。它负责将顶点从模型空间(Model Space)经过世界变换、观察变换和投影变换,最终转换到裁剪空间(Clip Space)。在代码中通常表现为对 gl_Position(OpenGL)或 SV_Position(HLSL/DirectX)的赋值。如果没有这一步,GPU 就无法知道如何在屏幕上绘制图元。

  2. 计算并传递自定义顶点属性(Custom Vertex Attributes / Varyings):
    除了位置之外,开发人员确实需要在顶点着色器中处理其他数据,以便传递给后续阶段(如光栅化器、片段着色器等)。这些数据包括但不限于:

    • 法线(Normals): 通常需要变换到世界空间或视图空间以进行光照计算。
    • 纹理坐标(Texture Coordinates/UVs): 用于后续的纹理采样。
    • 切线/副切线(Tangents/Binormals): 用于法线贴图。
    • 颜色(Vertex Colors): 顶点本身的颜色信息。
    • 任意自定义参数: 如骨骼权重、实例ID、雾效因子等。

计算顶点位置

⚫️ 模型坐标:也称为局部坐标对象坐标。它是顶点在3D模型文件(如 .obj, .fbx)中被定义时的原始坐标系。

⚫️ 模型变换:将顶点从模型坐标转换到世界坐标的数学操作

⚫️ 观察变换

  • 观察变换是将顶点从 世界坐标 转换到 观察坐标(View Space / Camera Space / Eye Space)的数学操作。
    • 世界坐标: 物体在统一全局场景中的绝对位置。
    • 观察坐标: 以摄像机(观察者) 为原点的相对坐标系。在这个空间中,摄像机永远位于原点(0,0,0) ,通常看向 −Z 轴(或 +Z 轴,取决于API约定),Y轴朝上。

计算并传递自定义顶点属性

  • 外观建模:真实渲染需对材质光照效果进行建模,复杂度可从简单颜色到基于物理的描述。
  • 着色定义:计算光照作用于材质所产生的效果,即求解着色方程。
  • 计算阶段:着色计算分布于顶点处理(几何阶段)和逐像素处理两个阶段。
  • 顶点数据:顶点存储位置、法线、颜色等着色方程所需的各类数值信息。
  • 数据流转:顶点着色结果经光栅化阶段插值后,传递至像素处理阶段用于最终表面着色计算。

投影

|350
正交投影:平行线在投影后依然平行,物体大小不随距离改变(无近大远小)。常用于工程制图、CAD、UI 界面或某些特殊风格的游戏

透视投影:模拟人眼/相机成像,近大远小,平行线会汇聚于灭点。这是实时渲染和电影中最常用的投影方式。

Z-Buffer: 也叫Depth Buffer / 深度缓冲 是解决可见性问题的核心、最基础的算法与硬件机制。

  • 尽管这些投影变换矩阵会将模型从⼀个空间变换到另⼀个空间,但是它们仍然被叫做投影,这是因为在显
    示之后,坐标的 z 分量并不会被存储在⽣成的图像中,⽽是存储在⼀个叫做 z-buffer 的地⽅

可选顶点处理

可选顶点处理:还有⼏个可以在 GPU 上执⾏的可选操作,它们的执⾏顺序如下:曲⾯细分(tessellation)、⼏何着⾊(geometry shading)和流式输出(stream out)。

  • 曲面细分
    • 曲面细分内部的核心组件:壳着色器、曲面细分器、域着色器
    • 壳着色器决定“怎么切”,曲面细分器负责“切出来”,域着色器算出 “切出来的点在哪”
  • 几何着色器
    • 几何着色器赋予了管线 “运行时改变拓扑” 的能力;但由于其与 GPU 并行架构的天然矛盾,在现代引擎中已逐渐退居调试工具和特定轻量级任务的角色,大规模几何生成应转向 Mesh Shader 或计算着色器。
  • 流式输出
    • 流式输出是GPU管线的 “数据出口”,它将原本单向流向屏幕的顶点流变为可循环复用的GPU驻留数据,是实现全GPU几何处理闭环(模拟→生成→缓存→渲染)的关键基础设施。

剪裁

剪裁(Clipping) 是光栅化前的最后一道几何关卡,核心目的是剔除视锥体外的无效图元,并将跨边界图元切割为合法形状,防止光栅化器处理非法坐标。

  1. 图元的三种处理状态
    根据图元与可视空间的位置关系,分为三类处理:

    • 完全在内:原样传递至下一阶段。
    • 完全在外:直接丢弃,不渲染。
    • 部分相交:执行裁剪操作,生成新顶点替代外部旧顶点(新顶点位于图元与可视空间边界的交点处)。
  2. 标准化裁剪空间
    通过观察变换 + 投影变换,将任意形状的可视空间统一转换为标准立方体。这保证了裁剪逻辑的一致性——所有图元只需针对这一个固定立方体进行裁剪即可。

  3. 用户自定义裁剪(切片)
    除标准立方体的6个裁剪平面外,支持用户定义额外裁剪平面对物体进行切割,该操作称为切片

  4. 齐次坐标与透视除法

  • 为何用齐次坐标:裁剪在四维齐次坐标下完成,因为透视空间中三角形属性的插值是非线性的,必须依赖第四个分量(w)才能保证裁剪和插值的正确性。
  • 透视除法:裁剪完成后,通过透视除法将四维坐标转为三维标准化设备坐标。NDC空间范围通常为 [-1, 1],是几何处理阶段的最终输出,后续将转换为窗口坐标系。
屏幕映射

屏幕映射是图形渲染管线中几何处理阶段的最后一步。它的核心任务是将经过投影变换后、仍处于抽象数学空间中的图元坐标,转换为显示器上实际的像素坐标

为了让你简单易懂地掌握,可以将其理解为 “从数学世界到物理屏幕的翻译官”

  1. 它在做什么?

    • 输入标准化设备坐标。这是一个与具体屏幕分辨率无关的、标准化的3D立方体空间(通常 x, y, z 范围都在 -1 到 1 之间)。
    • 输出窗口坐标。即你的屏幕上真实的像素位置 (x, y) 以及用于深度测试的深度值 (z)。
  2. 三个关键知识点

    • Z轴不丢弃:虽然屏幕是2D的,但映射后的 z 值会被保留并重新缩放(例如映射到 [0, 1]),供后续的深度缓冲判断遮挡关系使用。
    • 像素中心对齐:屏幕是由一个个离散的方块(像素)组成的。为了避免渲染模糊或偏移,映射公式会将连续坐标精确对齐到像素的中心点(通常是整数坐标 + 0.5)。
    • API原点差异:不同图形API对屏幕原点的定义不同,这是跨平台开发时必须注意的坑:
      • OpenGL / Vulkan:原点在屏幕 左下角
      • DirectX / Metal:原点在屏幕 左上角

光栅化阶段

  • 核心定义:光栅化(又称扫描变换)是将屏幕空间中的二维顶点转换为离散像素的过程。它是连接几何处理像素处理的关键同步点。
  • 两大子阶段
    • 三角形设置:也称图元装配,负责准备图元数据。
      • 三⻆形的微分(differential)、边界⽅程(edge equation)和其他数据,都会在这个阶段进⾏计算,这些数据可以⽤于三⻆形遍历,以及对⼏何处理阶段产⽣的各种着⾊数据进⾏插值。这个功能⼀般会使⽤固定功能的硬件实现。
    • 三角形遍历:判定哪些像素被图元覆盖。
      • 会对每个被三⻆形覆盖的像素(中⼼点或者样本点在三⻆形内部的像素)进⾏逐个检查,并⽣成⼀个对应的⽚元(fragment)

💡 注:虽然名称含“三角形”,但这两个子阶段同样适用于点和线。

  • 输出内容:每个生成的像素不仅包含位置信息,还携带 z值(用于深度缓冲)及各类着色数据。
  • 像素覆盖判定策略
    • 点采样:最基础方法,仅当像素中心点位于三角形内部时,才认为该像素被覆盖。
    • 超采样 / 多重采样抗锯齿:对单个像素进行多次采样以提升边缘质量。
    • 保守光栅化:只要像素与三角形有任意重叠即视为覆盖,适用于特殊渲染需求。

像素处理阶段

1. 像素着色

  • 核心任务:利用插值后的数据,对每个片段进行逐像素计算,输出颜色值。
  • 执行方式:由可编程GPU核心执行(区别于前序阶段的固定硬件)。程序员需编写像素着色器(OpenGL中称片元着色器)来定义计算逻辑。
  • 关键技术——纹理化:将2D/1D/3D图像“粘贴”到模型表面,是实现材质细节的核心手段(详见第6章)。
    • |350
  • 输出:每个片段的颜色值,传递给合并阶段。

💡 术语解释片段是光栅化输出的“候选像素”,包含位置、深度、纹理坐标等属性;只有通过后续测试的片段才会成为最终像素。

2. 合并

该阶段将片段颜色写入帧缓冲,并解决可见性与特效问题。它由高度可配置但非完全可编程的硬件单元执行(称为ROP或渲染输出单元)。

核心缓冲区与作用
缓冲区 作用 通俗理解
颜色缓冲 存储每个像素的RGB颜色 最终显示的“画布”
Z缓冲 存储每个像素的深度值(z值) “遮挡判断尺”:新片段z值更小(更近)才更新颜色和深度
模板缓冲 8bit离屏缓冲,记录图元位置信息 “蒙版”:控制哪些区域允许/禁止渲染(如只渲染圆形区域内)
Alpha通道 存储不透明度 “透明开关”:可用于透明测试或混合计算

关键机制详解

  • Z缓冲算法
    • 原理:比较新片段z值与缓冲中当前z值,仅当新值更小(更近)时更新。
    • 优势:时间复杂度O(n),支持任意顺序渲染不透明物体。
    • ⚠️ 致命弱点:每个像素仅存一个深度值,无法直接处理透明物体。透明体必须在不透明体之后、按从后往前顺序渲染,或使用顺序无关透明算法。
  • 片段丢弃:现代GPU可在像素着色器中根据任意条件(如alpha=0)主动丢弃片段,避免无效写入Z缓冲。
  • 混合操作:将新片段颜色与颜色缓冲中已有颜色混合,实现透明、累积等效果。通常通过API配置,部分高级API支持光栅顺序视图实现可编程混合。
  • 双缓冲机制
    • 问题:直接渲染到屏幕会导致画面撕裂/闪烁。
    • 方案:渲染在后置缓冲完成,再在垂直回扫期间与前置缓冲交换,确保显示完整帧。

💡 术语解释帧缓冲是所有缓冲区(颜色/Z/模板等)的统称;垂直回扫是显示器刷新间隙,此时交换缓冲可避免视觉瑕疵。

0

评论区