OpenGL学习笔记

良心教程 LearnOpenGL

什么是OpenGL

一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。但OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。没有定义实现,具体实现取决于不同厂商。

核心模式与立即渲染模式

早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线): 简单但缺少灵活性,OpenGL3.2开始不鼓励使用
核心模式(Core-profile):更高的灵活性和效率,然而也更难于学习,要求使用者真正理解OpenGL和图形编程。

扩展

OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了,只需要简单地检查一下显卡是否支持此扩展。通常,当一个扩展非常流行或者非常有用的时候,它将最终成为未来的OpenGL规范的一部分。

状态机

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

开始之前

在画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有目的地从这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义OpenGL上下文以及处理用户输入。

幸运的是,有一些库已经提供了我们所需的功能,其中一部分是特别针对OpenGL的。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和上下文用来渲染。最流行的几个库有GLUT,SDL,SFML和GLFW。在教程里我们将使用GLFW。

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入

环境搭建

环境我使用的是 windows(mingw-w64)/linux(gcc) + vscode ide
库的安装过程都差不多,vscode 在linux下也能用
下载GLFW源码包
使用win下的图形化cmake编译,BUILD_SHARED_LIBS打钩,打开build目录用mingw32-cmake编译

$ # linux 手动
$ mkdir build && cd build
$ cmake path/to/src  -DBUILD_SHARED_LIBS=ON
$ make
$ sudo make install

因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针*以后使用。取得地址的方法因平台而异,运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。
glad在线服务
gl版本选3.3或以上 profilecore 选中Generate a loader
生成,下载压缩包,里面有includesrc目录,需要在项目中使用
glad.c弄成静态库更方便操作

$ cd src
$ gcc -c -I../include glad.c
$ ar -rc glad.a glad.o
上一篇:OpenGL 简明教程(一) 开篇


下一篇:c-由于非Ascii字符,顶点着色器无法编译?