目录
- 概述
- fedora下安装
- 编写OpenGL应用程序
- 测试hello,world
概述
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
OpenGL的高效实现(利用了图形加速硬件)存在于Windows,部分UNIX平台和Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。
当今,OpenGL是视频行业领域中用于处理2D/3D图形的最为广泛接纳的API,在此基础上,为了用于计算机视觉技术的研究,从而催生了各种计算机平台上的应用功能以及设备上的许多应用程序。其是独立于视窗操作系统以及操作系统平台,可以进行多种不同领域的开发和内容创作,简而言之,其帮助研发人员能够实现PC、工作站、超级计算机以及各种工控机等硬件设备上实现高性能、对于视觉要求极高的高视觉图形处理软件的开发。
OpenGL最初是作为Iris GL的开放和可复制替代品创建的,Iris GL是Silicon graphics工作站上的专有图形API。尽管OpenGL最初在某些方面与IrisGL相似,但由于缺乏正式规范和一致性测试,IrisGL不适合广泛采用。Mark Segal和Kurt Akeley编写了OpenGL1.0规范,该规范试图正式定义有用的图形API,并使跨平台非SGI第三方实现和支持变得可行。API 1.0版本中的一个显著遗漏是纹理对象。IrisGL对所有类型的对象都有定义和绑定阶段,包括材质、灯光、纹理和纹理环境。OpenGL避开了这些对象,转而支持增量状态更改,认为可以将集体更改封装在显示列表中。这仍然是一种哲学,只是没有明确定义阶段的纹理对象(glBindTexture)是API的关键部分。
OpenGL经过了多次修订,主要是增量添加,核心API的扩展已逐渐纳入API主体。例如,OpenGL1.1向核心API添加了glBindTexture扩展。
OpenGL2.0包含了OpenGL着色语言(也称为GLSL)的显著增加,这是一种类似C的语言,可以用它编程管道的转换和片段着色阶段。
OpenGL3.0增加了弃用的概念:在以后的版本中将某些功能标记为要删除。GL 3.1删除了大多数不推荐的功能,GL 3.2创建了核心和兼容性OpenGL上下文的概念。
目前发布的OpenGL官方版本为1.0、1.1、1.2、1.2.1、1.3、1.4、1.5、2.0、2.1、3.0、3.1、3.2、3.3、4.0、4.1、4.2、4.3、4.4、4.5、4.6。
fedora下安装
$sudo dnf install mesa-libGL-devel mesa-libGLU-devel
$sudo dnf install freeglut-devel
编写OpenGL应用程序
第一步是选择你的语言。OpenGL的绑定存在于多种语言中,从C#和Java到Python和Lua。有些语言有多组OpenGL绑定,其中没有一个是官方的。所有这些最终都基于C/C++绑定。
如果未使用C/C++,则必须下载并安装所选语言的包或库,其中包含OpenGL绑定。有些是预装的,但有些是单独下载的。
如果您使用的是C/C++,则必须首先设置一个可以链接到OpenGL的构建环境(Visual Studio项目、GNU makefile、CMake文件等)。在Windows下,您需要静态链接到名为OpenGL32.lib的库(请注意,如果您正在构建64位可执行文件,则仍然链接到OpenGL32.lib.“32”部分没有意义)。Visual Studio和大多数Windows编译器都带有此库。
在Linux上,您需要链接到libGL。这是通过命令行参数“-lGL”完成的。
初始化
在程序中实际使用OpenGL之前,必须先初始化它。因为OpenGL是独立于平台的,所以没有标准的方法来初始化OpenGL;每个平台处理它的方式不同。非C/C++语言绑定也可以以不同的方式处理这些问题。
OpenGL初始化有两个阶段。第一阶段是创建OpenGL上下文;第二阶段是加载使用OpenGL所需的所有函数。一些非C/C++语言绑定将它们合并为一个。
OpenGL上下文创建
OpenGL上下文表示所有OpenGL。创建一个是非常特定于平台的,也是特定于语言绑定的。
如果您正在为OpenGL使用C/C++语言绑定,那么强烈建议您使用窗口工具包来管理此任务。这些库创建一个窗口,将OpenGL上下文附加到此窗口,并管理该窗口的基本输入。一旦您熟悉OpenGL,就可以开始学习如何手动执行此操作。
大多数非C/C++语言绑定将为您提供创建上下文的特定于语言的机制。
获取函数
为了使用OpenGL,您必须获得OpenGL API函数。对于您熟悉的大多数库,只需#包含一个头文件,确保库链接到您的项目或makefile中,它就可以正常工作。OpenGL不是这样工作的。
出于与本讨论最终无关的原因,您必须通过特定于平台的API调用手动加载函数。这个样板工作是用各种OpenGL加载库完成的;这些使这个过程变得顺畅。强烈建议您使用一个。
但是,如果您想手动加载,则有一个关于如何手动加载函数的指南。您仍然应该使用扩展加载器。
测试hello,world
#include <iostream>
#include <GL/freeglut.h>//freeGLUT窗口库
#include <GL/gl.h>
/**
* 渲染回调函数
*/
void RenderScenceCB(){
// 清空颜色缓存
glClear(GL_COLOR_BUFFER_BIT);
// 交换前后缓存
glutSwapBuffers();
}
/**
* 主函数
*/
int main(int argc, char ** argv) {
// 初始化GLUT
glutInit(&argc, argv);
// 显示模式:双缓冲、RGBA
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
// 窗口设置
glutInitWindowSize(480, 320); // 窗口尺寸
glutInitWindowPosition(100, 100); // 窗口位置
glutCreateWindow("Tutorial 01"); // 窗口标题
// 开始渲染
glutDisplayFunc(RenderScenceCB);
// 缓存清空后的颜色值
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// 通知开始GLUT的内部循环
glutMainLoop();
return 0;
}
我使用codelite,注意要在linker处设置路径
/usr/bin/make -j4 -e -f "learnopengl.mk" MakeIntermediateDirs && /usr/bin/make -j4 -e -f "learnopengl.mk" all
----------Building project:[ learnopengl - Debug ]----------
/usr/bin/g++ -c "/home/spx/learn/learnopengl/learnopengl/main.cpp" -g -O0 -Wall -o ../build-Debug/learnopengl/main.cpp.o -I. -I.
/usr/bin/g++ -o ../build-Debug/bin/learnopengl @../build-Debug/learnopengl/ObjectsList.txt -L. -lGL -lglut
=== build completed successfully (0 errors, 0 warnings) ===
否则 报错
undefined reference to `glClear’