恰逢要在公司做一次openGL的技术分享,所以弄个博客整理下。技术一般水平有限,仅供入门参考,如有错误,还望指正。此篇文档没有代码,都是些概念,对概念了解的童鞋可跳过。下一篇会进行简单的图形开发。
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)
OpenGL不仅语言无关,而且和平台也无关。OpenGL可以在不同的平台实现,他定义好了程序接口,不同的平台去实现。那我们Android平台怎么去实现,这就带出来了又一个概念 OpenGL ES
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计
两者的区别是
OpenGL ES 是从 OpenGL 裁剪的定制而来的,去除了glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性
以上内容来源百度百科,通俗点说OpenGL功能太过强大,以至于移动端等嵌入式设备在性能上无法实现OpenGL的全部功能,于是出现了仅供嵌入式使用的OpenGL ES。相当于OpenGL的阉割版。
在开发的时候,基本上都采用OpenGL ES2.0
从OpenGL ES 1.x到OpenGL ES 2.0,经历了比较大的变革。灵活性更高,功能更强大,效果也更好。具体变化如下图
看完后一脸懵逼。接下来说翻译成人话,在ES2.0中新增了两个概念,顶点着色器和片元着色器,用来取代1.0中变化、光照等,在功能上可以灵活。但是灵活的同时,也提升了代码的复杂度和开发门槛。
着色器(Shader)是在GPU上运行的小程序。从名称可以看出,可通过处理它们来处理顶点。此程序使用OpenGL ES SL语言来编写。它是一个描述顶点或像素特性的简单程序。
顾名思义,它是对顶点进行操作(位置、颜色、纹理坐标),但是不会创建新的顶点。
计算每个像素的颜色及属性。可通过应用光照值、贴图、阴影、镜面光、透明度等信息计算像素颜色值并输出。
如果说顶点着色器是描述物体轮廓的,那片元着色器就是给物体上颜色的。
着色器语言是一种高级的图形编程语言,仅适合于GPU编程,其源自应用广泛的C语言。对于顶点着色器和片元着色器的开发都需要用到着色器语言进行开发。它是面向过程的而非面向对象。
说白了,就是编写顶点和片元着色器的语言,后续博客会有简单的介绍。想详细了解着色器语言的,请移步大神博客GLSL基础语法
OpenGL ES采用的是右手坐标,选取屏幕中心为原点,从原点到屏幕边缘默认长度为1
OpenGL ES 的世界是3D的,但是我们的硬件屏幕都是平面的,通过投影的方式,让物体实现出立体的效果。
OpenGL ES有两种投影
除了利用投影之外,单一的颜色很难拥有较强的真实感,所以出现了光照的概念。用光照去模拟真实世界的光照。光照由三种元素组成,环境光、镜面光、散射光。
想用数学模型去模拟我们现实中的光照是非常困难的,OpenGL ES中也是尽可能的简化去模拟,关于光照的计算,请移步OpenGL的基础光照和计算
在现实世界中,物体并不一定都是单一颜色的,有的时候需要贴图。相当于游戏中你拥有了英雄,为了让英雄看起来更炫酷,你还需要一款流弊的皮肤,这就是纹理。
而纹理映射是将2D的纹理映射到3D场景中的立体物体上
总结下渲染过程为:
读取顶点数据——执行顶点着色器——图元装配——光栅化——执行片元着色器——逐个片元操作阶段并写入帧缓冲区——显示到屏幕上
想了解更为详细的过程,请移步OpenGL ES 2.0 渲染流程
以上为OpenGL的一些概念整理,在下一篇,会开始绘制简单的图形。
Android OpenGL ES2.0从放弃到入门(二)—— 绘制三角形
欢迎转载,转载请保留文章出处。有梦想的咸鱼9527的博客https://blog.csdn.net/weixin_39560693/article/details/95344667