OpenGl计算机图形学入门
前言
当今,图形编程时基于着色器的,也就是说,许多程序是用着色器语言编写的,并运行于显卡(GPU) 上。实现计算机图形的编程,需要我们借助一系列的语言平台(目前最流行的语言为C++),同时需要提供能对底层图形进行操作支持的Opengl Graphics Library(开放图形库),也需要的一系列错综复杂的步骤,将图形从“管线”中传递下去。更多详细内容请参阅
《
计
算
机
图
形
学
编
程
》
{\color{Green} 《计算机图形学编程》}
《计算机图形学编程》
一、OpenGl及GLSL
OpenGl是一种对供应商特定的计算机图形应用编程接口(API)的开放性替代,也就是说OpenGl并不是一种语言或是一个库 ,即仅仅是一种相应的规范(更确切的说是一种语言规范)。
相应的,在此语言规范下,引入OpenGl着色器语言 (GLSL)编写相应的着色器程序,并运行于GPU上。需要说明的这些所谓的着色器语言及程序是由程序员已经写好并植入GPU内部的。
二、语言
1.C++及C++应用程序
(1)C++
C++ 是一门通用编程语言,如前言所述着色器语言API是由C语言规范编写的,因此这种规范面向于C和C++,选用C++ 语言不失为一种明智之选。这里需要说明的是,采用其他语言如Java、Python、Visual Basic、Delphi等等语言进行编写也是可以的(需要调用相应语言的库)。这里,我们仅仅讨论C++作为编程语言。
(2)C++应用程序
采用C++进行编写调试部署生成的为C++应用程序,c++应用程序并非仅仅在CPU层面上对图形进行操作,而往往C++应用程序发挥的作用如下:
1.获取GLSL着色器代码 (点火)
2.安装GLSL至GPU。(驾驶)
不同于GLSL,这一部分操作恰恰为我们来执行,我们通过运行C++应用程序,直接对CPU进行操控,间接地运行GPU,而GPU的整个运行过程不为我们所操控,但其仍在稳定顺畅地运行着。
为更好地理解这些概念,我们将
图形编程比作是人驾驶行为,
C++应用程序比作是汽车架构中的方向盘、油门、离合器等为人所直接控制部分,
GPU比作是汽车内部我们所不能控制的驱动装置等。
他们的关系如下:
这里,我们可以将不为我们所操控的操作成为底层操控。
三、库
1.GLFW 窗口管理库
OpenGl实际上并不是把图形直接绘制到计算机屏幕上,而是渲染到一个帧缓冲区,然后需要这台机器负责把帧缓冲去的内容绘制到屏幕上的一个窗口上。目前有很多库可以完成这一工作,如CPW、GLOW、GLUT。
GLFW是最流行的选择之一。可以通过此链接下载到最新的GLFW
2.GLEW 扩展库
OpenGl围绕一组基本功能和扩展机制进行组织。OpenGl核心中有一些内置的命令来支持这些,但是为了使用每个现代命令,需要借助一些扩展库来完成,比如Glee、GLLoader、GL3W和GLAD,常用的是GLEW。最新版OpenGl扩展牧马人最新版OpenGl扩展牧马人
3.GLM 数学库
3D图形编程大量使用向量和矩阵代数(如对世界空间中的物体进行视觉变换以及投影放缩)
GLM提供了与图形概念相关的类和基本数学函数,例如矢量、矩阵、四元数,以及各种透视和视角矩阵。
4.SOIL2 纹理管理库
当我们创建好3D图形后,往往需要对其进行纹理管理和操作。从零开始写一个纹理加载器是可能的,但是考虑到各种各样的图形文件格式,使用一个纹理加载库通常是更好的。
SOIL2兼容各种平台。
四、OpenGl管线
前面提到,我们使用C++应用程序将GLSL运行于GPU上之后,将进行所谓的底层操控,即GPU内部是如何识别这些着色器代码,以及将如何对这些信息处理并最终呈现在显示器上,这将得益于OpenGl管线。
整个管线流程如下:
每个部分的内容将后续进行讨论。