OpenGL ES 2.0学习之路-----2.EGL

OpenGL ES要求一个渲染上下文环境和绘图窗口,渲染上下文存储着OpenGL ES状态的属性,绘图窗口决定那个窗口将被绘制并指出将要绘制的图形对颜色缓冲区、深度缓冲区、模板缓冲区的要求、还有每个缓冲区位数。
OpenGL ES API 没有提及如何创造一个渲染上下文或者渲染上下文如何联系操作系统的窗口,EGL是渲染API(OpenGL ES)和操作系统窗口之间的接口。
任何OpenGL ES在使用EGL渲染前要做以下的事情:

  1. 查询设备上可用的显示初始化它,例如一个翻盖手机有两个LCD屏,可以渲染其中的一个或者两个。
  2. 创造一个渲染屏幕,EGL能够创造隐藏平面或显示屏平面,显示屏平面联系着操作系统,隐藏平面联系着像素缓冲区,虽然不用于显示,但被用于贴图渲染,能被对重 API使用。
  3. 创造渲染上下文,EGL需要创造渲染上下文,这个渲染上下文在实际使用前需要联系上适合的平面。
  4. EGL API也有另外的功能,例如电力管理,支持多种渲染上下文,分享贴图或缓冲区等等,OpenGL ES扩展行为能够通过工具查询获得。
    OpenGL ES 2.0编程
    编程开始前你需要知道包含哪些头文件和你的应用链接所用的库文件位置,懂得使用EGL语法和GL命令名和命令参数。
    库和包含文件
    应用程序需要的链接库包括OpenGL ES 2.0库——libGLESv2.lib和EGL库libEGL.lib。
    需要包含的头文件至少有:
   #include <EGL/egl.g>
   #include <GLES2/gl2.h>
   #include <GLES2/gl2ext.h>

Egl.h是EGL头文件,gl2.h是OpenGL ES 2.0头文件,gl2ext.h是OpenGL ES批准的扩展
头文件和库文件的命名和平台有关,OpenGL ES 2.0的库文件和头文件名肯尼没有包括所有的平台,所以开发者可以参照供应商的文档说明,确定库文件和头文件的命名和组织。
EGL 命名语法
所有的EGL函数以egl前缀开始(如eglCreateWindowSurface),EGL数据类型前缀如EGLint和EGLenum。
下表给出了EGL数据类型的简明描述:
数据类型 、C—类型 、 EGL 类型
在这里插入图片描述

OpenGL 命令语法
所有的EGL命令以前缀gl开始,组成命令名的每个单词的首个字母大写,(例如glBlendEquation),同样OpenGL ES数据类型也以前缀GL开始。
一些命令能够接受不同类型的参数,数据类型(byte[b],unsinged byte[ub],short[s],unsigned short[us],int[i].fixed[x],and float[f])可能含有1到4种,部分函数也接受矢量类型。
下面两个命令是相同的,只是输入参数一个是浮点数,另一个是整型数。

glUniform2f(location,1.0f,0.0f);
glUniform2i(location,1,0);

下面的命令也是相同的,只是输入参数一个是矢量,另一个不是:

GLfloat    coord[4]={1.0f,0.75f,0.25f,0.0f};
glUniform4fv(location,coord);
glUniform4f(location,coord[0],coord[1],coord[2],coord[3]);

给出OpenGL ES命令后缀和输入参数类型的描述:
在这里插入图片描述
此外,OpenGL ES定义了Glvoid数据类型,作为OpenGL ES接受的指针类型。
glUniform*() 可使用所有指定的变量,glUniform*v()能使用命令的矢量版本。
OpenGL ES命令出错会产生一个错误码,能够使用glGetError函数查询。

GLenum    glGetError(void)

返回当前错误码,并将错误码复位成GL_NO_ERROR,如果返回GL_NO_ERROR,说明上次查询没有错误产生。
OpenGL ES基本错误码:
在这里插入图片描述
Flush和Finish
OpenGL ES 2.0 API 继承自OpenGL的客户机-服务器模式。客户机发出指令,命令在服务器上执行。OpenGL中,客户机和服务器可以说一个网络中的不同机器,但OpenGL ES适用于嵌入式及便携平台,一般情况下客户机和服务器是同一个设备。
客户机-服务器模式下,被客户机发出的命令不需要服务器立刻回复,如果客户机和服务器在一个网络中,一次 发送一个命令会显得效率低下,因此命令在客户机缓存,再一起发送,因此客户机需要一个机制确认服务器已经完成了命令的执行
OpenGL ES 是多线程的,为了同步各个线程的执行,如线程B的执行依靠线程A的执行结果,线程A的执行很重要。
Flush命令对服务器发出执行指令,但不需要等待指令执行完成,如果需要等待指令完成,使用Finish命令。
一般不赞成使用Finish命令,除非必须;Finish会等待客户机将命令执行完成再返回,强迫了客户机和服务器之间同步执行。
void glEnable(GLenum cap)
void glDisable(GLenum cap)
glEnable和glDisable做到了开启或者关闭某种功能,初始化时除了GL_DITHER功能设置为GL_TRUE外,其他功能都设置为GL_FALSE,如果输入法非法参数,产生GL_INVALID_ENUM错误码。
可以使用glIsEnabled函数查询某个状态当前是否能使用。

 GLboolean     glIsEnabled(GLenum cap)
  • 能使用时返回:GL_TRUE
  • 不能使用时返回:GL_FALSE
  • 输入非法参数时返回:GL_INVALID_ENUM错误码

另外,想要通过学习算法来提高面试/笔试竞争力的同学可以关注一下我的公众号:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值