OpenGL ES2.0 基本编程

1. EGL

OpenGL ES命令需要一个rendering context和一个drawing surface。

Rendering Context: 保存当前的OpenGL ES状态。

Drawing Surface: 是原语(primitive)画图的Surface。它指定了渲染的buffer类型,如:color buffer,depth buffer和stencil buffer;同时它也指定了每个需要的buffer的位深度(bit depth)。

EGL是OpenGL ES API与Native Window System之间的接口。在OpenGL ES执行render之前,需要EGL做以下工作:

? 查询设备上可得到的显示设备,并初始化它们。

?  创建一个Rendering Surface(渲染表面)。EGL可以创建屏幕上的表面(on-srceen surface)或离线屏幕表面off-screen surface,屏幕上的表面连接到本地窗口系统;而离线屏幕表面不显示,但可以用于渲染表面(rendering surface)的像素缓冲区。

? 创建一个rendering context(渲染环境)。在真正开始画图之前,需要把渲染环境连接到渲染表面。

1.1 EGL 数据类型


Data Type


C-Language Type


EGL Type

32-bit integer int EGLint
32-bit unsigned integer unsigned int EGLBoolean, EGLenum
32-bit pointer void * EGLConfig, EGLContext,
EGLDisplay, EGLSurface,
EGLClientBuffer

2.  OpengGL ES命令后缀和参数数据类型

Data Type Suffix Data Type C-Language Type GL Type
b 8-bit signed integer signed char GLbyte
ub 8-bit unsigned integer unsigned char GLubyte,
GLboolean
s 16-bit signed integer short GLshort
us 16-bit unsigned integer unsigned short GLushort
i 32-bit signed integer int GLint
ui 32-bit unsigned integer unsigned int GLuint,
GLbitfield,
GLenum
x 16.16 fixed point int GLfixed
f 32-bit floating point float GLfloat,
GLclampf

GLvoid是OpenGL ES命令可接受的指针。

2.1 OpenGL ES基本错误码

错误码可通过GLenum glGetError(void)函数获取,如果当前错误码的值不为GL_NO_ERROR,则新产生的错误码不能被保存。

Error Code Description
GL_NO_ERROR No error has been generated since the last call to glGetError.
GL_INVALID_ENUM A GLenum argument is out of range. The command that generated the error is ignored.
GL_INVALID_VALUE A numeric argument is out of range. The command that generated the error is ignored.
GL_INVALID_OPERATION The specific command cannot be performed in the current OpenGL ES state. The command that generated the error is ignored.
GL_OUT_OF_MEMORY There is insufficient memory to execute this command. The state of the OpenGL ES pipeline is considered to be undefined if this error is encountered except for the current error code.

 3. Flush和Finish

OpenGL ES2.0 API继承了OpenGL的C-S(客户端-服务器)模式。应用程序(客户端)发布命令,则Server负责执行处理。且不是应用程序每发一个命令都被及时地发送给Server。在设备中CPU负责运行游戏的逻辑,并向GPU(硬件显卡或是软件模拟的显卡)发送绘图指令。在这种架构下,CPU和GPU分别充当客户端与服务器端的角色。

glFlush命令把当前OpenGL ES环境中的命令进行刷新,然后发送给Server。glFlush只是把命令发送给Server,但并不等待执行完成。如果需要等到Server执行完成时才返回,则需要调用glFinish,但它严重影响性能。

eglSwapBuffers中调用了glFlush。

4. 基本的状态管理

管道的每个阶段都有自己的一些状态,且每个状态有对应的值,这些状态值可以通过以下两个函数进行修改:

void glEnable(GLenum cap)
void glDisable(GLenum cap)

在初始状态时,除GL_DITHER(初始值为GL_TRUE)之外,其它每个状态的初始值都为GL_FALSE。这些状态值被保存在EGLcontext中。其状态值可通过glIsEnabled(GLboolean glIsEnabled(GLenum cap))来进行查询。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 10:28:28

OpenGL ES2.0 基本编程的相关文章

iOS开发——图形编程OC篇&OpenGL ES2.0编程步骤

OpenGL ES2.0编程步骤 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. 1. 保存全局变量的数据结构 以下例子程序均基于Linux平台. 1 typedef struct _escontext 2 { 3 void* userData; // P

OpenGL ES2.0 入门经典例子

原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! ps:非常感谢skingTree为我们提供的这篇翻译教程,感谢yy.小狼.北方加入我的教程翻译团队,谢谢你们! 教程截图: OpenGL ES 是

iOS OpenGL ES2.0 开发实例

本教程源码地址下载:https://github.com/wanglixin1999/HelloGL OpenGL ES 是可以在iphone上实现2D和3D图形编程的低级API. 如果你之前接触过 cocos2d,sparrow,corona,unity 这些框架,你会发现其实它们都是基于OpenGL上创建的. 多数程序员选择使用这些框架,而不是直接调用OpenGL,因为OpenGL实在是太难用了. 而这篇教程,就是为了让大家更好地入门而写的. 在这个系列的文章中,你可以通过一些实用又容易上手

Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fengbingchun/article/details/11192189   1.  先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2.  打开Eclipse,-->Window-->

Android用OpenGL ES2.0显示YUV数据,在手机上需要两种坐标系的解决方案

如题 ,不知道大家看懂了这个题目没有,给个链接:http://blog.csdn.net/wangchenggggdn/article/details/8896453(下称链接①), 里面评论有很多人提到了这个问题,我也是其中一员,但是问遍了所有人,自己也发帖(http://bbs.csdn.net/topics/390769358) 寻求解决方案,却终究没能得到一个可用的方案. 从2014年4月中旬遇到这个问题,纠结了两个多星期,终于在看了好多好多资料之后,于4月的最后一个周一,暂时解决了这么

Android +NDK+eclipse+opengl ES2.0 开启深度测试

参考:https://www.opengl.org/discussion_boards/showthread.php/172736-OpenGL-ES-Depth-Buffer-Problem 环境:eclipse,ndkr8,opengl es2.0,android 最近使用eclipse和NDK进行android opengl es2.0的开发,发现了绘制的物体显示与深度无关,而与绘制的前后顺序有关.想了一下,应该是深度测试没有开启,开启了glEnable(GL_DEPTH_TEST),但是

cocos2d Shader系列1:cocos2d-js Shader和OpenGL ES2.0

cocos2d的Shader也就是差不多直接跟GPU打交道了,跟Flash的Stage3D(AGAL)类似,不过没有AGAL这么恶心,不需要直接编写汇编语言.而Fragment Shader又跟Flash的pixelbender类似. 本文以cocos2d-js为例,但cocos2dx其他版本也是同理的,只是函数名略有不同而已. 当然还是得先复习或者学习一下GPU的原理,至少得知道vertex shader和fragment shader的作用和区别. 详细可以看看大神的说明: http://w

OpenGL ES2.0 shader内部return语句返回失败和数据精度丢失,花屏问题

最近客户反映遇到我们的产品一个很奇怪的问题,字体花屏现象 shader使用两张纹理贴图(图标和文字纹理)做多重纹理映射时,部分手机出现花屏现象,dicard后不起作用,后面的语句继续执行 添加了return语句同样问题 纠结了两三天,今天终于查出原因,如题 shader内部return语句返回失败和数据精度丢失,大部分手机一切正常. 问题机器型号ID: HM2013022 ANDROID.VERSION.RELEASE: 4.2.1 GL_VERSION: OpenGL ES 2.0 build

OpenGL es2.0 之照相机

API:    GLES20.setLookAtM(eyeX,eyeY,eyeZ ,centerX,centerY,centerZ ,upX,upY,upZ) 主要是三个参数,(照相机坐标,照相机的焦点,照相机向上的方向) ,下面主要讨论这三个参数的意思. 1.照相机坐标:照相机的位置 2.照相机焦点:焦点就是选择城乡最清晰的点,比如一个场景有的物体离镜头远,有的物体离镜头近,选择焦点就是在照相机的可视范围选择要拍的最清晰的点 3.照相机向上的方向:照相机放置在水平平台上的时候照相机向上的方向为