渲染

前言

上一个章节中,我们成功创建天蓝色窗口。本章节中,我们将添加一个鲜艳的三角形。

理论

如图 3.2-1 所示,OpenGL 使用右手坐标系,其中y轴向上,每个图元Primitive)的各个顶点按照逆时针排序(也可自行设置)。

Coordinate-system and triangle vertices
图 3.2-1

灰色矩形为无投影矩阵(Projection Matrix)时的默认顶点范围。

渲染管线

如图 3.2-2 所示,OpenGL 渲染时经过顶点着色、曲面细分、几何着色、光栅化、片段着色等步骤。我们着重关注顶点、片段着色以及左上角的顶点数据。

OpenGL Rendering Pipeline
图 3.2-2

着色器

任何一个 OpenGL 程序都离不开着色器Shader)。着色器是渲染的基本程序。一个着色器类似于 C 程序,编译后由显卡驱动执行。

#version 330
in vec3 in_position;

void main() {
    gl_Position = vec4(in_position, 1.0);
}

这是一段着色器的示例代码。它和普通的 C 代码相似,都含有宏、变量、函数等,只是主函数的返回值为void

顶点数据

有了着色器,当然还要有顶点数据。顶点数据Vertex Data)定义了一个或多个图元的顶点位置、颜色等,并传递到着色器进行进一步处理。

float[] vertexData = {
    -0.5f, 0.5f, 0.0f,
    -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
    0.5f, 0.5f, 0.0f,
};

上面的数组定义了一个四边形。然而,OpenGL 不能直接绘制四边形。我们必须手动将其细分为多个三角形,或是使用元素缓冲对象Element Buffer Object,简称 EBO)。

EBO 定义了绘制图元时使用的顶点。索引从 0 开始。

int[] indexData = {
    0, 1, 2, 2, 3, 0,
};

如图 3.2-4 所示,该四边形会分为两个三角形进行绘制。

Quad tess into 2 triangles
图 3.2-4

实践

了解以上概念后,我们就能开始编写了。