OpenGL
介绍
这是什么?
一套标准的程序接口,用于绘制二维或三维图形。
我会怎么用它
我们可以那它来做游戏,三维建模,地图绘制等
OpenGL ES是什么?
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
WebGL是什么
OpenGL在浏览器上的实现,可以为HTML Canvas提供硬件加速渲染。
主要功能
让我们以绘制桌子为例,要让一个三维的桌子在屏幕上显示出来,需要几个步骤:建模、着色、上纹理、光照、变换。下面我们介绍一下这几个步骤
- 建模,这一步主要是用来描述桌子形状的,比如说高宽,圆的还是放的,几个角的。OpenGL提供了大量点线面操作的函数,我们可以按照需要把点线面组合起来,最后呈现出我们想要桌子形状
- 着色,规定了桌子的形状之后,一个很重要的店就是给桌子上色,主要是对面进行操作
- 贴纹理,我们经常看到一些物体的表面,有的光滑,有点粗糙,有的是木纹,有的时大理石纹,这些都是纹理的一部分,而这些我们都可以在OpenGL里面完成
- 光照,光线对我们最后看到的物体有着非常大的影响,现实中也存在也各种各样的光照以及变换的角度,OpenGL里提供了管理4种光(射光、环境光、镜面光和漫射光)的方法,此外还可以指定物体模型表面的反射特性。
- 变换,完成了上面的步骤,基本上已经确定了一个物体的外观了,能够通过计算得出我在某一个角度观看,物体所呈现出来的最终效果。而这个计算过程一般就是变换
完成了上面的步骤,一个物体最后呈现在屏幕上的效果已经确定了,当然,为了更好的效果,OpenGL还提供一些其他功能,比如说:
- 动画,这个很好理解,想象一下屏幕上能动的和不能动的桌子之间的区别。
- 扩展:双缓存技术(Double Buffer),动画是通过这个技术来实现,即在前台缓存中显示图像的同时,在后台缓存中绘制下一幅图像;当后台缓存绘制完成后,就显示出该图像,与此同时前台缓存开始绘制第三幅图像,如此循环往复,便可提高图像的输出速率。
- 位图处理,假设你不喜欢纹理,你就想把自家猫咪的照片贴在桌子上,这个时候就需要用到位图处理技术了。
- 扩展:位图和矢量图的区别。位图是通过描述每一个像素点的颜色来决定最后呈现的内容的,常见的各种jpg图片就是这种。矢量图是通过数学的方式,在画面中定义点,线,面及其关系来决定最后内容的,比较常见的就是CAD。
优缺点
优点
- 跨平台,支持在多个平台运行,具有很好的可移植性
- 接口对开发者友好,简单易学
缺点
- 接口对开发者过于友好,给硬件厂商带来比较大的压力,导致渲染层越来越厚,性能遭遇瓶颈
- OpenGL内部被设计为一个庞大的状态机,所以不支持多线程。在CPU走向多核的时候,不支持多线程成了比较糟糕的点。
- 封装了很厚的一层,屏蔽了大量硬件信息,容易出现不可以预知的Bug
我的思考
接口到底怎么设计才合适?
其他图形接口
微软的DirectX3d
微软很早就搞出来了,只支持自家的系统。
苹果的Metal
苹果2014年推出的一套接口,只支持自家的系统。
OpenGL继任者Vulkan
和OpenGL是一个组织提出的,特点是
- 只是对显卡驱动层进行了非常薄的封装,并向外暴露了大量的细节,这样做带来了几个有意思的结果
- 干的事情少了,问题也就容易暴露出来,被上层开发者所感知
- 上层要做的事情多了
- 对开发人员的要求变高了
- 合入OpenCL,对多线程的支持更好了