OpenGL简介

233 阅读8分钟

Introduction to OpenGL

在这篇文章中,我们介绍并探索了OpenGL的世界以及与之相关的一些话题。

  1. 什么是OpenGL?
  2. 什么是GLEW?
  3. 什么是GLFW?
  4. OpenGL中的着色器
  5. 渲染管线
  6. 渲染管线的阶段
  7. OpenGL的优势

1.什么是OpenGL?

OpenGL(开放图形库)是一个跨语言、跨平台的应用编程接口(API),可用于渲染2D和3D矢量图形,具有大量的功能和定制。该API可以直接与系统的硬件,特别是图形处理单元(GPU)进行交互,以实现硬件加速渲染。
OpenGL主要用于游戏行业,尽管它不仅仅局限于此,因为它也可以用于可视化目的,如医疗成像、广播、虚拟现实
等。

2.什么是GLEW?

  • GLEW是OpenGL Extension Wrangler Library(GLEW)的缩写,它是一个跨平台的开源C/C++扩展加载库。
  • GLEW是一个非常重要的OpenGL库,因为它提供了高效的运行时机制来确定特定平台上支持哪些OpenGL扩展。
  • 虽然GLEW有不少替代品,如GL3W、glLoadGen、glad等,但由于GLEW拥有庞大的社区和定期的更新,所以仍然被推荐使用。OpenGL社区中的大多数用户都使用GLEW。

3.什么是GLFW?

  • 尽管GLFW没有任何官方的全称或别名,但在OpenGL社区中,GLFW代表OpenGL FrameWork,这是一个共识。
  • GLFW是一个开源的、多平台的桌面OpenGL库,为创建和控制窗口、上下文和表面提供了一个API。
  • 它还可以用来检测、处理和处理来自各种I/O设备的输入,如键盘、鼠标、操纵杆等。GLFW还支持多显示器/显示。

4.OpenGL中的着色器

  • 着色器是一个用户定义的程序,它被设计为在图形处理器的某个阶段运行。
  • 它们是用GLSL(OpenGL着色语言)编写的。
  • GLSL本身是基于C语言的,所以着色器通常也是用C语言编写的。
  • 一个着色器通常有以下结构。
#version version_number

in data_type in_variable_name;

out data_type out_variable_name;
  
uniform data_type uniform_name;
  
void main()
{
  // process data and perform functionality here
}
  • 下面是一个实际工作中的着色器的代码样本。
#version 330

layout (location = 0) in vec3 pos;

out vec3 texCoords;

uniform mat4 projection;
uniform mat4 view;

void main()
{
	texCoords = pos;
	gl_Position = projection * view * vec4(pos, 1.0);
}
  • 如果你不明白上面发布的着色器中发生了什么,请不要担心。这篇文章的目的是向你介绍OpenGL的世界以及理论知识和背景,以便你在决定自己开始工作时能够相当快地熟悉它。
    该着色器只是将顶点的位置作为输入(vec3 pos),并将位置(vec3 texCoords)输出或分享到更远的地方(也许是给其他着色器,或者干脆给父程序)。在这个过程中,gl_position变量(由当前顶点的位置组成的内建变量)也被确定。

5.渲染管线

  • 渲染管线是为了将物体或图像渲染到屏幕上而进行的一系列步骤或阶段。
  • 每个顶点、形状或物体都可以通过一系列的步骤,将它们以所需的属性渲染到屏幕上。
  • 这些步骤或阶段中有四个是可以通过着色器编程的。

6.渲染管线的阶段

OpenGL的渲染管线的阶段如下。

  1. 顶点规范
  2. 顶点着色器_(可编程的_
  3. 镶嵌_(_可编程)
  4. 几何图形着色器_(_可编程
  5. 顶点后处理
  6. 原始组装
  7. 栅格化
  8. 片段着色器_(_可编程
  9. 每个样本的操作

6.1 顶点规范

  • 顶点规范是为要渲染的基元设置顶点数据。
  • 顶点是空间中的一个点,通常用x、y和z坐标定义。
  • 基元是使用一个或多个顶点定义的简单形状。
  • 这个过程是在应用程序本身中进行的。
  • 它使用顶点阵列对象(VAO)和顶点缓冲对象(VBO)。
    顶点阵列对象定义了一个顶点有哪些数据,如位置、纹理、颜色等,而顶点缓冲对象则定义了数据本身。
    Introduction to OpenGL

6.2 顶点着色器

  • 顶点着色器处理每个单独的顶点,然后单独处理它们。
  • 它们接收来自顶点渲染的属性输入,然后根据用户定义的程序(着色器)将每个输入顶点转换成一个输出顶点。
  • 还可以指定额外的输出,这些输出可以被流水线上的某个地方的其他用户定义的着色器所接收和利用。
  • 下面是一个顶点着色器的例子。
#version 330

layout (location=0) in vec3 pos;

void main()
{
    gl_position = vec4(pos, 1.0);
}

6.3 镶嵌法

  • 镶嵌法允许人们将数据分割成更小的基元。
  • 它可以被用来以动态的方式添加更高层次的细节。
  • 许多游戏,如《古墓丽影》(Rise of the Tomb Raider)、《孤岛惊魂2》(Crysis 2)等,都使用了嵌片技术来动态地增加极端的细节。
    Introduction to OpenGL

6.4 几何着色器

  • 就像顶点着色器单独处理顶点一样,几何着色器也是用来单独处理基元(顶点组)的。
  • 它将基元作为输入,并输出其顶点以渲染和创建给定的基元。它还能够输出一个以上的基元。
  • 它还可以改变或修改给定基元的数据,甚至它们的类型(线条、三角形等),以产生新的基元。

6.5 顶点后处理

一旦顶点根据用户驱动的着色器进行了处理,它们将进一步经历一些固定功能的处理步骤。
**变换反馈。**如果启用,它可以用来将顶点和几何着色器的输出和结果存储到专门为此目的而设置的缓冲区对象上。这允许用户在以后的阶段使用保存在缓冲区的数据。
**剪切。**通过剪裁,可以确保用户看不到的基元被移除,以防止不必要地使用资源。
**面部剪裁。**在你可能玩过的任何游戏中,当你看某些物体时,它们总是看起来好像有完整的深度,并被完全渲染,从上到下,从后到前。
脸部剔除允许人们避免渲染那些远离用户或观众的基元。它们可能在画面中,但不完全在用户的视角前面。例如,如果你从前面看一辆车,你将无法看到它后面的东西,那么不必要地渲染那部分有什么意义呢?这也可以节省资源。

6.6 基元组装

  • 来自先前阶段的顶点数据被组成一连串的基元。这个过程被称为 "基元组装"。
  • 例如,如果正在渲染三角形,那么9个顶点将被输出为3个三角形,每个三角形有3个顶点。

6.7 栅格化

  • 在这个阶段,基元被转换为_片段。_
  • 片段是每个像素的数据片段,从栅格化过程中获得。它们可以被用来计算输出帧缓冲区中像素的最终数据。
  • 碎片数据是根据其相对于每个顶点的位置来插值的。
    Introduction to OpenGL

6.8 片段着色器

  • 顾名思义,片段着色器分别处理每个片段的数据。
  • 涵盖了一些重要的方面,如片段所覆盖的像素的颜色等。
  • 下面是一个片段着色器的例子。
#version 330

out vec4 colour;

void main()
{
    colour = vec4(0.3, 0.5, 0.7, 1.0);
}

6.9 每个样本的操作

  • 在Per-Sample Operations阶段,片段被单独地通过一系列的操作或测试来检查它们是否应该被绘制到屏幕上。
  • 它也有一个深度测试,确定是否有东西在正在绘制的点的前面。
  • 它也有_颜色混合_,通过它(利用定义的操作)将片段的颜色与任何重叠的片段混合在一起。它最常用于处理透明物体。

7.7.OpenGL的优点

  1. 行业标准。OpenGL规范是由一个独立的联盟,即OpenGL架构审查委员会指导的,因此它得到了广泛的工业支持。
  2. **稳定性。**OpenGL提供的所有功能都得到很好的控制。向后兼容性也确保了现有的应用程序和功能在任何时候都不会被淘汰。
  3. 可靠性和可移植性。所有的OpenGL应用程序在任何符合OpenGL API的硬件上都能产生一致的视觉显示效果,无论操作系统或窗口系统如何。
  4. **巨大的社区。**OpenGL背后也有一个巨大的社区,这也有它自己的好处。
  5. 文档。OpenGL的文档非常正确,它的所有功能,从单个函数到着色器,都是现成的,可以很容易地获得。

通过OpenGenus的这篇文章,你一定有关于OpenGL的完整介绍。