系统性学习OpenGL(一)

博客资料来源:

1.b站EA小哥的教程(https://www.bilibili.com/video/BV1MJ411u7Bc?p=2&vd_source=1e7ee9e0d04db204fc1a61f8fb97487f)

2.LearnOpenGL CN(https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/)

 

一:OpenGL的前世今生

 

OpenGL本质山是一种API(应用编程接口),也是一种规范。是专门的图形处理api,包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。

OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。

实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。

由于OpenGL的大多数实现都是由显卡厂商编写的,当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL,这也是为什么总是建议你偶尔更新一下显卡驱动。

 

核心模式与立即渲染模式:

 

立即渲染模式:早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少有控制OpenGL如何进行计算的自由。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式。

 

核心模式:当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。立即渲染模式从OpenGL实际运作中抽象掉了很多细节,因此它在易于学习的同时,也很难让人去把握OpenGL具体是如何运作的。现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。

 

当使用新版本的OpenGL特性时,只有新一代的显卡能够支持你的应用程序。这也是为什么大多数开发者基于较低版本的OpenGL编写程序,并只提供选项启用新版本的特性。

 

OpenGL的各种库:

GLUT:GLUT(OpenGL Utility Toolkit)是一个处理OpenGL程式的工具库,负责处理和底层操作系统的呼叫以及I/O。GLUT的两个主要目的是建立一个跨平台的函式库(事实上GLUT就是跨平台的),以及简化学习OpenGL的条件。透过GLUT编写OpenGL通常只需要增加几行额外GLUT的程式码,而且不需要知道每个不同操作系统处理视窗的API。

freeGLUT:是GLUT的一个完全开源替代库。事件处理函数。

GLFW:是一个用于台式机上的OpenGL,Op​​enGL ES和Vulkan开发的开源,多平台库。它提供了一个简单的API,用于创建窗口,上下文和表面,接收输入和事件。功能雷同freeGLUT,但是据说freeGLUTbug比较多(可能最新版本较为稳定),所以GLFW应运而生,可替代freeGLUT,GLUT。

GLEW:(The OpenGL Extension Wrangler Library),GLUT或者FREEGLUT主要是1.0的基本函数功能;GLEW是使用OPENGL2.0之后的一个工具函数。

GLAD:简单说glad是glew的升级版。用哪个都行。就是glew比较老,glad比较新。

GL3W:(来自网页)是获得OpenGL核心配置文件规范所提供功能的最简单方法。它的主要部分是一个简单的gl3w_gen.py Python脚本,该脚本下载了 Khronos支持的glcorearb.h标头,并从中生成gl3w.h和gl3w.c。然后可以将这些文件添加并链接(静态或动态)到您的项目中。gl3w_gen.py需要Python 2.7或更高版本。它还与Python 3.x兼容。
(库资料来源:CSDN博主「watersevenmmfx」文章,原文链接:https://blog.csdn.net/watersevenmmfx/article/details/106250323)

扩展:

OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。

状态机:

OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。

假设当我们想告诉OpenGL去画线段而不是三角形的时候,我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段,下一个绘制命令就会画出线段而不是三角形。

当使用OpenGL的时候,我们会遇到一些状态设置函数(State-changing Function),这类函数将会改变上下文。以及状态使用函数(State-using Function),这类函数会根据当前OpenGL的状态执行一些操作。只要你记住OpenGL本质上是个大状态机,就能更容易理解它的大部分特性。

对象:

OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。由于C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL开发的时候引入了一些抽象层。“对象(Object)”就是其中一个。

在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。比如,我们可以用一个对象来代表绘图窗口的设置,之后我们就可以设置它的大小、支持的颜色位数等等。可以把对象看做一个C风格的结构体(Struct):

struct object_name 
{
    float  option1;
    int    option2;
    char[] name;
};
posted @ 2023-05-06 16:12  穿西装的Tom  阅读(40)  评论(0)    收藏  举报