1 OpenGL引入GLSL的前世今生

OpenGL着色语言 GLSL- OpenGL Shading Language是一种专门二维三维图形开发设计的编程语言,现代OpenGL如果不使用GLSL,那么我们唯一可以做的事情就是使用glClear不断地清除窗口颜色了,由此可见,现代OpenGL的核心就是学会如何使用GLSL着色语言。

GLSL在OpenGL2.0版本左右开始发布,在2.0版本之前,GLSL属于OpenGL的扩展功能,但是在OpenGL3.0开始,OpenGL官方开始使用GLSL作为主要的图形开发API,摒弃了之前的固定渲染管线即使用glVertex和显示列表的那个版本。OpenGL3.0版本或者之前的版本仍然可以使用固定渲染管线,但是在3.1版本之后,固定渲染管线被移除,所以我们只能使用可编程的渲染管线,其本质就是使用着色器进行图形渲染工作。

2 OpenGL3.1版本开始的可编程渲染管线

从OpenGL3.1版本开始,OpenGL开始推行可编程渲染管线。可编程渲染管线包括4个处理阶段,1个通用处理阶段,每一个处理阶段都需要一个专门的着色器进行控制。
1. 顶点着色器阶段 :vertex shading state,从顶点缓存对象中接受顶点数据,并独立的处理每一个顶点。所有的OpenGL程序都需要对顶点信息进行处理。所以顶点着色阶段是必需的。
2. 细分着色阶段:tessellation shading state,这个着色阶段是可选的,一般来说,如果对原始的几何结构有新的需求,需要对图形几何构成信息进行再次处理的可以使用这一阶段进行处理,它一般会在OpenGL管线内部生成一个新的几何体。这个阶段会接收从顶点着色器的输出数据,并对接收到的顶点信息进行进一步的处理。
3. 几何着色阶段:geometry shading state,这个着色阶段与细分着色阶段一样也是可选的。一般使用在OpenGL管线内部对所有的几何图元进行修改。这个阶段既可以接受来自顶点着色器的输出数据也可以接受细分着色阶段的输出的图元数据。这个着色阶段的主要作用在于可以从输入的图元生成更加多的几何图元,也可以改变几何图元类型,比如从三角形到线段,从线段到点等,或者丢弃所有的输入几何图元等等。
4. 片段着色阶段:fragment shading state,与顶点着色器一样,这个阶段也是必须的。在这个阶段中,会计算所有输入图元的深度值和颜色值,然后传递给OpenGL内部管线的模块测试和混合测试的着色模块。这也是OpenGL可编程渲染管线的核心部分,因为它很大程度上决定了在屏幕上输出的帧画面的效果。
5. 计算着色阶段:compute shading state。这一阶段属于通用处理阶段,实际上这一阶段并不属于图形渲染管线的一部分,计算着色阶段并不是处理顶点或者几何图元这一类型的图形数据,而是处理用户特定的数据内容。它可以处理片段着色器所创建和使用的图形缓存数据,包括所有帧缓存的后期处理,比如说黑白化,锐化等等。

3 简单的GLSL着色语言示例

一般在实际上shader的日常编程过程中,顶点着色器和片段着色器是使用最多的。

  • 顶点着色器示例
#version 330 core
layout (location = 0) in vec3 vPosition;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * vec4(vPosition, 1.0);
}

上述简单的顶点着色器先将顶点三维坐标按照先后顺序与模型矩阵,视图矩阵与投影矩阵相乘,得到屏幕中的图元显示坐标。

  • 片段着色器示例
#version 330 core
out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0); // set alle 4 vector values to 1.0
}

上述简单的片段着色器将当前片段的颜色置为RGB(1.0,1.0,1.0,1.0)

从上面的顶点着色器和片段着色器可以看出这是一个标准的basecolor渲染管线的shader。

好了,本节的GLSL语言简介和OpenGL的几何渲染阶段先介绍到这里,后面将详细介绍GLSL的基础语法和用法。