顶点处理 (Vertex Processing)
顶点处理是 OpenGL 渲染管线中的一组阶段,其中一系列顶点通过一系列着色器进行处理。后续着色器阶段从前一阶段获取数据。这些着色器阶段大多是可选的,任何渲染操作中最后一个活动阶段向顶点后处理及后续阶段提供顶点数据。
顶点着色器 (Vertex Shader)
顶点着色器是渲染管线中处理单个顶点的可编程阶段。顶点着色器接收由一系列顶点属性组成的单个顶点。该输入顶点被任意处理以产生输出顶点。输入顶点到输出顶点必须是一对一映射。
必需阶段
顶点着色器必须提供才能执行有效的渲染操作。
顶点着色器的主要职责包括:
- 接收顶点属性(位置、法线、纹理坐标等)
- 执行顶点变换(模型-视图-投影变换)
- 传递数据到后续阶段
- 计算逐顶点光照
曲面细分 (Tessellation)
曲面细分阶段接收前一阶段输出的顶点,将它们收集成图元,并基于一对着色器阶段和固定功能曲面细分系统对这些图元进行细分。
曲面细分阶段是可选的;如果不存在曲面细分评估着色器,则顶点着色器的输出传递给下一个活动阶段。
曲面细分包含三个子阶段:
- 曲面细分控制着色器 (Tessellation Control Shader, TCS):确定图元应如何细分,输出细分级别和每个控制点的输出顶点
- 固定功能曲面细分器:根据细分级别生成新的顶点
- 曲面细分评估着色器 (Tessellation Evaluation Shader, TES):计算细分后顶点的位置和属性
几何着色器 (Geometry Shader)
几何着色器 (GS) 是管理图元处理的着色器程序。GS 接收单个基本图元,可以输出生成 0 个或多个图元的顶点序列。这与顶点着色器不同,顶点着色器限制为一对一的输入输出比。GS 还可以执行分层渲染,将不同的图元渲染到不同的附加分层图像。
几何着色器是可选的;如果不存在,从前一阶段传递的顶点直接传递给下一阶段。
几何着色器的主要用途包括:
- 图元生成(如将点扩展为粒子四边形)
- 图元变换(如将三角形转换为线框)
- 分层渲染(渲染到纹理数组的不同层)
- 法线可视化和其他调试渲染
处理顺序
顶点处理阶段的执行顺序为:
顶点着色器 → [曲面细分] → [几何着色器] → 顶点后处理方括号表示可选阶段。每个阶段从前一阶段接收数据并传递给下一阶段。
数据传递
各阶段之间的数据传递通过以下方式:
- 内置变量:如
gl_Position、gl_PointSize等 - 用户定义变量:使用
in和out关键字声明 - 接口块:使用接口块组织多个变量的传递