OpenGL ES 2.0 渲染管线

最近学习《OpenGL ES 2.0 Prgramming Guide》,对 OpenGL ES 2.0 渲染管线有了一定的了解。

OpenGL ES 的目标之一就是去除多余:任何 Open GL 中多种方式可以实现的相同操作,都将保留其最有用的方式,去掉其他多余的方式。因此在 OpenGL ES 没有固定管线,必须通过 Vertex Shader 和 Fragment Shader 来实现自己的渲染程序。

整个渲染管线如下图所示:

OpenGL ES 中没有 glBegin() glEnd() 的方式来定义顶点数据。只能通过 Vertex Array 或者 Buffer Object 来传递数据给 Vertex Shader 。

Vertex Shader

Vertex shader 的输入包括如下部分:

  • Attributes — 由 vertex arrays 提供的 vertex 数据。
  • Uniforms — vertex shader 使用的常量数据。
  • Samplers — 特殊类型的 uniforms 用于表示给 vertex shader 使用的 textures。Samplers 在 vertex shader 是可选的。
  • Shader program — Vertex shader 程序代码或者可执行程序描述将对顶点执行的操作。

Vertex shader 的输出 Varing Variables 。

Primitive Assembly

主要包括:

  • Clipping - 根据 Primitive 和 View Frustum 的位置关系来裁剪或者完全舍弃。
  • Culling - 根据 Primitive 的朝向来决定是否舍弃。

Rasterization

OpenGL ES 支持 3 种类型的对象的栅格化:

  • 点(Point-Sprite)
  • 线(Line)
  • 三角形(Triangle)

栅格化输出片元(Fragment)供 Fragment Shader 处理。

Fragment Shader

Fragment Shader 包括如下输入部分:

  • Varying variables — Vertex Shader 的输出(多个),被光栅单元插值处理后供 Fragment 使用。
  • Uniforms — Fragment shader 使用的常量数据。
  • Samplers — 特殊类型的 uniforms 用于表示给 fragment shader 使用的 textures。
  • Shader program — Fragment shader 程序代码或者可执行程序描述将对片元执行的操作。

Fragment Shader 输出变量为 gl_FragColor

Pre-Fragment Operations

  1. Pixel ownership test
  2. Scissor test
  3. Stencil test
  4. Depth test
  5. Blending
  6. Dithering

经过以上操作后,片元被最终写入 Framebuffer 。