学习OpenGL是学习计算机图形学的一个工具,由于计算机上图形的显示要依靠底层的软件和硬件,学习图形学除了学习基本的概念,线,曲面,图形生成,变换,渲染这些,作三维的图形图像显示时,从操做系统和驱动这一底层设计起显然费时不切实际,因此咱们须要一套高级的图形接口。编程
咱们能够认为 Opengl 就是这样的一个 API,OpenGL 有多种语言绑定,可是最终地最底层是一个 C 语言的 API接口。这组 API由一些 typedef,#define 和enumerator 值和函数(function)组成,typedef 定义了 GL 的基本类型,如 GLint,GLfloat。可是复杂的类型如结构没有直接在 OpenGL 显示出来。架构
在 C++中,若是一个对象包括一个整数,一个浮点数和一个字符串时,通常你会这样建立并读取它们:框架
struct Object{ int count; float opacity; char *name }; Object newObject; newObject.count = 5; newObject.opacity = 0.4f; newObject.name = "some string";
在 OpenGL 中,通常你会这样用 API:函数
GLuint objectName; glGenObject(1, &objectName); glBindObject(GL_MODIFY, objectName); glObjectParameteri(GL_MODIFY, GL_OBJECT_COUNT, 5); glObjectParameterf(GL_MODIFY, GL_OBJECT_OPACITY, 0.4f); glObjectParameters(GL_MODIFY, GL_OBJECT_NAME, "Some String");
注:以上只是一个例子说明API 的接口对象有什么不一样,不是真实的 OpenGL 函数。工具
OpenGL 规范post
从技术的意义上来讲,OpenGL 不是一个 API,而是一种规范,一个文件。咱们所说的 C API 只是它的一个实现。规范定义了 OpenGL 的初始状态,什么样的函数不改变他的状态,调用渲染的函数时会发生什么这些。学习
这个规范是 OpenGL Architectural Review Board(ARB)写的,这个组织由 Apple,Nvidia,AMD(ATI part)等公司的人员组成,这个组织,也是 Khronos Group 的一部分。这个是复杂并且十分技术性的,固然你也能够去阅读他,须要注意的是,这个规范只规定告终果,而不是实现过程,是面对用户来讲的,不论硬件的供应商如何实现 OpenGL,用户应该不能分辨出不一样。因此说,尽管 ARB 组织管理着 OpenGL 规范,但不控制 OpenGL 的代码,在一个硬件上如何用代码实现是由供应商的开发者决定的。OpenGL 在不一样的操做系统上实现也不相同,在 Windows 上,这些实现是由硬件制造商实际控制的,但在 Mac OSX 上大部分由 Apple实现,硬件供应商开发内部的驱动,Linux 上则更为复杂。。。(如 Mesa 3D 就是 OpenGL 的开源软件实现)总的来讲,OpenGL 实现由软件操做系统和硬件制造商共同协商实现。网站
OpenGL 版本ui
OpenGl 的实现有不少版本(最新的是4.4),咱们不须要对全部版本都熟悉,应该从尽量新的版本学起。OpenGL 的版本不像 Direct3D 版本,会更改大部分 API,OpenGL 大多向下兼容,可是到了 OpenGL 3.0之后,随着图形卡的架构发展,OpenGL的结构也发生了很大改变(可编程着色器),v3.1后移除了很大一部分函数,去除了大部分固定管线的内容,因此若是再有书上或教程上从固定管线讲起,那么它必定是过期的了。因此如今的 OpenGl分为两个部分(或者称为 profiles):core 和 compatibility,compatibility 部分仍让向后兼容。spa
OpenGL Framework
OpenGL 是比较底层的 API,有利于咱们学习计算机图形学,可是利用这些接口作出可与操做系统交互的程序,或者简化咱们编程时的工做量,咱们须要一些框架工具,固然以 OpenGL 为核心的框架不少,都包括基本的和不一样的操做系统窗口交互,建立上下文,加载 OpenGL 函数直至面向对象的框架。这些能够称为 OpenGL 的 SDK ,其中包括了不少的 Framework,详细资料能够查看 OpenGL 的官方网站。这些能够由简单或由底层到面向对象几个层次。
- OpenGL 初始化工具:创建 OpenGL 上下文常常须要平台相关的一些代码去建立窗口,而后加载 OpenGL 函数,这些工具大大简化了这些过程,并提供跨平台的解决方案
- 上下文/窗口工具
simple window | “multimedia library” | widget toolkits |
---|---|---|
freeglut | Allegro version 5 | FLTK |
GLFW | SDL | Qt |
GLUT | SFML | wxWigets |
- OpenGL 加载函数
GlEW和 gl3w(主要集中与 OpenGL3/4 Core )
- 实用工具:不很是依赖 OpenGL,可是在开发 OpenGL 工具时十分有用。
-
图像和纹理库
DevIL
FreeImage
SOIL
GLI
glraw -
数学库
GLM 和 TVMet
- 利用 OpenGL 开发的面向程序接口或者引擎,便于3D 图形绘制。
Open Inventor,Oger3D,ClanLib 等。
在初学 OpenGL 时,通常咱们会用到 freeglut(相对简单)、GLFW、GLEW 这几个框架,配合 QT 开发图形界面,或者用 SDL 作一些简单的应用
不少书上都把 OpenGL 的 API 接口定义为一种状态机模型,(不过我在比较新的 OpenGL 编程模型学习中以为这一个观点已通过时了,可是这一句话估计在有关 OpenGL 的书上很常见,并且 OpenGL 又是向后兼容了,称为状态机模型不能说错)。因此会常常见到 OpenGL context(上下文)这一术语,context 不能简单地归纳,从之后的学习咱们能够了解。
原文连接:http://foryo24.farbox.com/post/opengl