1、什么是OpenGL
OpenGL:open graphic library,即开发图形库。它被定义为“图形硬件的一种软件接口”。实质上是3D图形和模型库,它具有高度可移植性,并且具有非常快的速度。可以创建优雅漂亮的3D图形,具有出色的视觉质量。并且速度远快于光线追踪仪或软件渲染引擎。
1.1 OpenGL是编程语言吗?
OpenGL不是一种像C和C++这样的编程语言,它更像是一个C运行函数库,提供了一些预包装的功能。实际上,并不存在像OpenGL程序这类东西,而是我们开发人员所写的程序,恰好使用了OpenGL作为编程接口之一。举个例子,Windows是一种编程语言吗?并不是,所谓的Windows程序员也只是基于Windows提供的API开发软件的程序员而已。
1.2 OpenGL和谁打交道
一般来说,OpenGL是由那些专门用于显示和操纵3D图形的计算机硬件所使用的(显卡、GPU,后面我们逐步介绍到)。纯软件的通用OpenGL实现也是可以的。比如我们Android手机系统的硬件吗和硬编码,操作系统完全可以不实现这部分硬件,然后使用软件实现一套;还有我们的路由器,我们也完全可以不专门买路由器,而是搞一台主机,然后插两块网卡,用软件实现路由表,路由分发。微软实现方案类似于这种纯软件实现,性能表现并不是很好。
1.3 OpenGL应用场景
OpenGL使用非常广泛,比如CAD工业制图软件、PS图像设计软件、电影特效、游戏等。随着硬件加速以及高速的PC微处理器的普及,3D图形现已成为消费者和商业程序的典型组件,不在局限于游戏和科学应用。
1.4 OpenGL演进历史
OpenGL前身是SGI(Silicon Graphics,Inc)公司(SGI是一家久负盛名的公司,在计算机和动画方面处于领先的地位)的IRISGL,也是SGI对IRIS GL的移植性进行改进和提高的结果。这个新的API不仅具有GL的功能,而且是一个开放的标准。他的输入来自于其他图形厂商,并且更容易应用到其他平台和操作系统。从根本上讲,OpenGL就是为3D几何图形处理量身定做的。
SGI希望更多计算机能够运行OpenGL软件,因此诞生了ARB(OpenGL Architecture Reiview Board),尽管SGI控制OpenGL API,但ARB的创立者还包括SGI、 DEC、 IBM、 Intel、 Microsoft。ARB每隔4年召开一次会议,对规范进行维护和改善,并对OpenGL标准进行升级。2006年SGI公司已经破产,把OpenGL标准控制从ARB移交给了新的工作组:The Khronos Group(www.khronos.org)。Khronos是一个由它的成员提供资金的行业协会,专注于开放媒体标准的创建和维护。大多数ARB成员也成为了
Khronos成员,因此变动没有他打破。现在我们搜索OpenGL相关的知识结果都是Khronos小组的,Khronos升级了OpenGL以及姊妹API-OpenGL ES,并且推出了用于替换OpenGL的Vulkan。
2、 学OpenGL到底学什么?
OpenGL设计硬件、软件、接口、标准等一系列的知识,所以我们要真正深入了解OpenGL应该从以下几个方面入手:
- OpenGL标准接口;
- 数学方便知识(三角函数、矩阵等);
- 平台相关知识(EGL等);
- 可编程管线中Sharder编程知识;
- 硬件相关知识和概念(比如GPU设计原理等)
系统通过我们系列文章可以对OpenGL有深入理解。
3、OpenGL原理之变换
由上图,我们从(x,y)旋转到(x',y'),通过三角函数知识有:
x' = r * cos(a + b);
= r * (cos(a)*cos(b) - sin(a)*sin(b));
= x * cos(a) - y * sin(a);
y' = r * sin(a + b);
= r * [sin(a)cos(b) + cos(a)*sin(b)];
= x * sin(a) + y * cos(a);
近一步化简:
x' = x * cos(a) - y * sin(a);
y' = x * sin(a) + y * cos(a);
是不是我们的矩阵运算?
4、投影
我们一般有两种投影方式:
- 透视投影
- 正投影
我们日常生活就遵循透视投影规则:“远小近大”,《三体》里云天明将的故事中深水王子就是个“正投影”的怪物。体现在我们渲染中,如何做透视投影呢?
其实很像我们的小孔成像。有三个位置组成:人眼、远平面、近平面。最终两个平面形成的平截头体(棱台)中的物体被投射到二维平面的远平面中。
5、总结
本文介绍了OpenGL相关的知识:OpenGL历史、OpenGL发展、OpenGL应用等,并且介绍了OpenGL需要掌握的知识,OpenGL变换原理及投影成像原理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。