[9].专属Mobile的OpenGL-OpenGL-ES

跳去目录


OpenGL-ES (OpenGL for Embedded Systems)

作为OpenGL的子集,OpenGL-ES专为移动端的图像显示而生,其针对于手机等嵌入式设备所进行了定制与优化,使移动端的设备图像加载更高效,3D图像的渲染更快速,质量更高


渲染模块

同桌面端设备一样,移动端OpenGL-ES的渲染也是由CPUGPU协同完成的,CPU负责调动OpenGL模块,并将顶点数据由内存中取出并传入GPU中,GPU负责将顶点数据进行处理,并执行渲染操作。


渲染流程

OpenGL-ES渲染流程

顶点着色器

- 通过`attribute通道`负责接收`CPU`传递来的顶点信息(在iOS中,为了稳定性,默认将attribute通道关闭)
- 通过`uniform通道`统一变量,并进行后续处理
- 通过`采集器`来对`纹理`进行处理
- 通过GLSL内建变量,将顶点数据处理成需要的形式(`gl_Position`),并使用
- 通过特定语法,修改点的大小
- 通过矩阵变换,获取真正坐标
- 计算光照信息
- 生成纹理坐标并传递给片元着色器

图元装配

计算顶点信息,将`顶点数据`计算为多个`图元`

光栅化

将`图元`转换为`片段`,为后续`片元着色器`的工作做准备

片元着色器

- 通过uniform通道统一变量,以便于后续处理
- 接收顶点着色器传递来的`纹理坐标`,计算纹理坐标的填充颜色,并对纹理坐标的像素点进行颜色填充

逐片段操作

逐片段操作

​ 逐片段操作是由OpenGL-ES内部所完成的,其最终将图像数据放到帧缓冲区,显示于屏幕上


EGL(Embedded Graphics Library)

EGL

针对于移动端,OpenGL-ES需要设定新的命令来链接窗口,因此需要一个新的库来执行这个操作,这个库就是EGL, EGL 是OpenGL-ES 和原⽣窗⼝系统之间的接口

EAGL

​ 出于Apple一贯精益求精的精神,apple当然不满足EGL的效率,因此apple自己研发了一个库用于替代EGL,这个库就是EAGL


GLSL(OpenGL着色器语言)

着色器

着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。

着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。

向量

GLSL中的向量是一个可以包含有1、2、3或者4个分量的容器,分量的类型可以是前面默认基础类型的任意一个。它们可以是下面的形式(n代表分量的数量):

类型 含义
vec n 包含nfloat分量的默认向量
bvec n 包含nbool分量的向量
ivec n 包含nint分量的向量
uvec n 包含nunsigned int分量的向量
dvec n 包含ndouble分量的向量

向量重组

一个向量的分量可以通过vec.x这种方式获取,这里x是指这个向量的第一个分量。你可以分别使用.x、.y、.z和.w来获取它们的第1、2、3、4个分量。GLSL也允许你对颜色使用rgba,或是对纹理坐标使用stpq访问相同的分量。

vec2 someVec;
vec4 differentVec = someVec.xyxx;
vec3 anotherVec = differentVec.zyw;
vec4 otherVec = someVec.xxxx + anotherVec.yxzy;

输入输出 in out

着色器是各自独立的小程序, 它们都是一个整体的一部分,每个着色器都有特定的输入和输出,这样使它们可以进行数据交流及传递。GLSL定义了in和out关键字专门来实现这个目的。每个着色器使用这两个关键字设定输入和输出,只要一个输出变量与下一个着色器阶段的输入匹配,它就会传递下去。

如果我们需要从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。

varying uniform attribute

varying变量是 vertex shaderfragment shader 之间做数据传递用的。一般 vertex shader 修改 varying 变量的值,然后 fragment shader 使用该 varying 变量的值。因此 varying 变量在 vertex shaderfragment shader 二者之间的声明必须是一致的。

uniform 变量是外部程序传递给 vertex shader fragment shader 的变量。

attribute变量是只能在 vertex shader中使用的变量。


跳去目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342