bada开发:OpenGL ES 2.0程序 创建简单3D图形
2012-08-05 12:01
746 查看
我们期待消费者积极关注bada这个全新的移动游戏平台,因为强大的图形API可以实现2D和3D图形。从3D图形API中获益的程序包括游戏,地图可视化,用户界面,动漫,屏保等。为了满足广大需求,bada API包括OpenGL® ES,用于高级嵌入式图形,具有明确定义的OpenGL的subset profile的规格,支持高级和低级图形功能。
如何使用bada基于OpenGL ES 2.0创建简单的3D图形应用程序
我们看看如何创建一个OpenGL ES 2.0应用程序。为了介绍基于bada平台开发OpenGL ES 2.0程序的基本概念,我们首先开始介绍一个简单的范例。我们要处理的一个程序就是基本的OpenGL ES 2.0程序,画出简单的3D立方。这个范例说明许多重要的概念。
初始化
• 初始化,并且处理EGL和GL;
• 使用EGL,创建一个屏幕上的渲染面
• 创建安装和上载遮影及程序
图画
• 设置viewport.
• 绘制简单的图元
图:bada 3D Graphics API
初始化
1. 初始化和处理EGL和GL
bada GlesCube样例程序遵循的基本步骤使用特定的API以完成EGLand GL初始化(通过 GlesCube::InitEGL() 和 InitGL() 方法)。
1.1. 检索缺省设备屏幕
__eglDisplay变量代表设备显示。OpenGL ES配置被存储在 __eglConfig里。
__eglContext 变量代表OpenGL ES context。最后, __eglSurface 代表绘图表面。
EGL_DEFAULT_DISPLAY 常量指的是缺省设备屏幕(在大多数情况下,只有一个)。如果操作失败,函数会返回EGL_NO_DISPLAY.
1.2.初始化 OpenGL ES
函数中的最后两个参数与EGL执行版对应。如果不需要指定,则取值为零。
1.3. 选择OpenGL ES配置
下一步,必须指定程序要求的最小配置。
eglConfigList参数代表程序要求的属性列表。函数在__eglConfig参数中返回所有可得配置(符合eglConfigList参数)列表。列表的大小受到第四个参数(在本例中,我们只要一个配置)限制。在函数返回之后,numConfigs参数告知相匹配参数的数量。eglConfigList定义了 [attribute, value] 对的次序(作为数列)。EGL规格定义了所有受支持的属性的常量。列表最后是EGL_NONE常量。
1.4. 创建OpenGL ES context
第三个参数显示 context 要分享纹理对象。这里,EGL_NO_CONTEXT被用来说明没有这样的 context 。最后一个参数代表要映射到下一个context的属性列表。
1.5. 激活context
如果要OpenGL ES 指令产生效果,必须激活context, 让它成为现在式。在OpenGL ES中,一次只有一个context可以成为现在式。
1.6 关闭OpenGL ES: 在使用OpenGL ES,必须释放所有资源
2. 使用EGL,创建一个屏幕上的渲染面
3. 创建,安装和上载 遮影及程序
要求采取下面的步骤设置OpenGL环境,上载并且编辑遮影。
3.1. 创建片元(fragment)和vertex shaders,及程序目标
3.2. 将shader的对象依附在程序对象上
程序对象提供一个机制,可以确定需要连接起来的事物的列表。
将被连接在一起,放入程序对象中的Shaders必须首先与该程序对象连接起来。在源代码被上载到shader的对象之前或在shader的对象被编译之前,你可以向程序对象粘贴一个shader的对象。
3.3. 上载shader的二元
函数glShaderBinary上载预先编辑的shader的二元。第一个参数指定fragShader中shader object handle的数量。fragShader包含一个shader object handle。每个handle指示一个独特的遮影类型( vertex shader 或片元shader).。(GLenum)0指定shader的二元格式。fragmentFragment 或 vertexVertex 向客户端内存里的shader二元数据指定一个指针。最后一个参数指定字节中shader二元数据的长度。
3.4. 为遮影对象提供源代码
这个方法将遮影中的源代码设定到字符串列(fragmentFragmentText 和vertexVertexText参数)中的源代码上。任何之前存储在遮影对象中的源代码被完全取代。
3.5. 编辑shaders
glCompileShader编辑存储在fragShader 和vertShader参数指定的shader object中的源字符串。编辑状态作为shader object状态的一部分被储存。
注意,glCompileShader仅在GL version 2.0 或更高版本中可获得。
3.6. 链接程序对象
glLinkProgram链接程序指定的程序对象。如果任何GL_VERTEX_SHADER 类型的shader object被粘贴到程序上,它们被用来创建一个可执行文件,在可编程vertex处理器上运行。如果任何GL_FRAGMENT_SHADER类型的shader object被粘贴到程序上,它们创建一个可执行文件,在可编程片元处理器上运行。
3.7. 使用程序对象,而不是固定的函数OpenGL
这个方法安装程序指定的程序对象,做为现在的渲染状态。一个或多个可执行文件在程序对象中创建,使用glAttachShader将shader object成功地粘贴到它上面,使用glAttachShader成功编译shader object,并且使用glLinkProgram连接程序对象。
程序对象包含运行在vertex(片元)处理器上的可执行文件,如果它们包含一个或多个被成功编译和链接的GL_VERTEX_SHADER (typeGL_FRAGMENT_SHADER)类型的shader object。
3.8你可以使用:
删除shader object.
在GlesCube::InitGL()方法里,所有的初始化步骤完成。如果所有的shaders被成功编译,并且程序对象被成功链接,glUseProgram之后使用shader完成所有的渲染。现在,有个准备好的GL表面进行处理。
我们来看看包含了OpenGL绘图函数的GlesCube::Draw()方法。
绘图
4.设定viewport
glViewport 函数向窗口坐标指定被常规化的设备坐标的X和Y的仿射转换。第一批两个参数在viewport 长方形的左下角(以像素为单位)。缺省值为 (0,0).。当OpenGL context 首先被附加窗口,宽度和高度被设定到窗口的尺度上。
让 (xnd , ynd ) 成为常规化设备坐标。窗口坐标(xw , yw)然后如下所示进行计算:
Viewport宽度和高度被堆放,其范围根据执行情况确定。这个范围通过使用argument GL_MAX_VIEWPORT_DIMS 调用glGet进行查询。
5. 绘制简单的图元
OpenGL ES渲染所有的来自vertex数列的集合。不用调用GL函数以传递每个
vertex, 常规项,纹理,坐标,边标志或颜色,你可以分开vertex, 常规项,和其它参数的数列,使用它们构建一个图元的次序(单独调用glDrawElements),并渲染来自数据列的图元。
例如,这显示了如何渲染OpenGL ES中的三角形。
glDrawElements使用较少的次常式调用,指定多个子程序图元。
当glDrawElements被调用,它使用被启用的数列中次序元素,首先从标记体开始,构建一系列集合图元。第一个参数指定构建何种图元,并且如何构建这些图元。
GlesCube样例程序位于\<BADA_SDK_HOME>\Samples\GlesCube\
要求的文件:SDK已经有了所有要求的文件,以创建OpenGL ES程序。OpenGL ES的页眉文件包括:
• FGraphicsOpegngl2.h
• FGraphicsEgl
• FGraphicsOpengl
如何使用bada基于OpenGL ES 2.0创建简单的3D图形应用程序
我们看看如何创建一个OpenGL ES 2.0应用程序。为了介绍基于bada平台开发OpenGL ES 2.0程序的基本概念,我们首先开始介绍一个简单的范例。我们要处理的一个程序就是基本的OpenGL ES 2.0程序,画出简单的3D立方。这个范例说明许多重要的概念。
初始化
• 初始化,并且处理EGL和GL;
• 使用EGL,创建一个屏幕上的渲染面
• 创建安装和上载遮影及程序
图画
• 设置viewport.
• 绘制简单的图元
图:bada 3D Graphics API
初始化
1. 初始化和处理EGL和GL
bada GlesCube样例程序遵循的基本步骤使用特定的API以完成EGLand GL初始化(通过 GlesCube::InitEGL() 和 InitGL() 方法)。
1.1. 检索缺省设备屏幕
__eglDisplay变量代表设备显示。OpenGL ES配置被存储在 __eglConfig里。
__eglContext 变量代表OpenGL ES context。最后, __eglSurface 代表绘图表面。
__eglDisplay = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY);
EGL_DEFAULT_DISPLAY 常量指的是缺省设备屏幕(在大多数情况下,只有一个)。如果操作失败,函数会返回EGL_NO_DISPLAY.
1.2.初始化 OpenGL ES
函数中的最后两个参数与EGL执行版对应。如果不需要指定,则取值为零。
if (EGL_FALSE == eglInitialize(__eglDisplay, null, null) || EGL_SUCCESS != eglGetError())
1.3. 选择OpenGL ES配置
下一步,必须指定程序要求的最小配置。
if (EGL_FALSE == eglChooseConfig(__eglDisplay, eglConfigList, &__eglConfig, 1, &numConfigs) || EGL_SUCCESS != eglGetError()) { AppLog("[GlesCube] eglChooseConfig() has been failed. [0x%x]\n",eglGetError()) goto CATCH; }
eglConfigList参数代表程序要求的属性列表。函数在__eglConfig参数中返回所有可得配置(符合eglConfigList参数)列表。列表的大小受到第四个参数(在本例中,我们只要一个配置)限制。在函数返回之后,numConfigs参数告知相匹配参数的数量。eglConfigList定义了 [attribute, value] 对的次序(作为数列)。EGL规格定义了所有受支持的属性的常量。列表最后是EGL_NONE常量。
EGLint eglConfigList[] = { EGL_RED_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_BLUE_SIZE, 5, EGL_ALPHA_SIZE, 0, EGL_DEPTH_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE };
1.4. 创建OpenGL ES context
__eglContext = eglCreateContext(__eglDisplay, __eglConfig, EGL_NO_CONTEXT, eglContextList); if (EGL_NO_CONTEXT == __eglContext || EGL_SUCCESS != eglGetError()) { AppLog("[GlesCube] eglCreateContext()has been failed.[0x%x]\n", eglGetError()); goto CATCH; }
第三个参数显示 context 要分享纹理对象。这里,EGL_NO_CONTEXT被用来说明没有这样的 context 。最后一个参数代表要映射到下一个context的属性列表。
1.5. 激活context
如果要OpenGL ES 指令产生效果,必须激活context, 让它成为现在式。在OpenGL ES中,一次只有一个context可以成为现在式。
if (EGL_FALSE == eglMakeCurrent(__eglDisplay, __eglSurface, __eglSurface, __eglContext) || EGL_SUCCESS != eglGetError()) { AppLog("[GlesCube] eglMakeCurrent() has been failed. [0x%x]\n", eglGetError()); goto CATCH; }
1.6 关闭OpenGL ES: 在使用OpenGL ES,必须释放所有资源
void GlesCube::DestroyGL() { glDeleteProgram(__programObject); if (__eglDisplay) { eglMakeCurrent(__eglDisplay, null, null, null); if (__eglContext) { eglDestroyContext(__eglDisplay, __eglContext); __eglContext = EGL_NO_CONTEXT; } if (__eglSurface) { eglDestroySurface(__eglDisplay, __eglSurface); __eglSurface = EGL_NO_SURFACE; } eglTerminate(__eglDisplay); __eglDisplay = EGL_NO_DISPLAY; } return; }
2. 使用EGL,创建一个屏幕上的渲染面
__eglSurface = eglCreateWindowSurface(__eglDisplay, __eglConfig, (EGLNativeWindowType)__pForm, null); if (EGL_NO_SURFACE == __eglSurface || EGL_SUCCESS != eglGetError()) { AppLog("[GlesCube] eglCreateWindowSurface() has been failed. EGL_NO_SURFACE [0x%x]\n", eglGetError()); goto CATCH; }
3. 创建,安装和上载 遮影及程序
要求采取下面的步骤设置OpenGL环境,上载并且编辑遮影。
3.1. 创建片元(fragment)和vertex shaders,及程序目标
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); __programObject = glCreateProgram();
3.2. 将shader的对象依附在程序对象上
程序对象提供一个机制,可以确定需要连接起来的事物的列表。
将被连接在一起,放入程序对象中的Shaders必须首先与该程序对象连接起来。在源代码被上载到shader的对象之前或在shader的对象被编译之前,你可以向程序对象粘贴一个shader的对象。
glAttachShader(__programObject, fragShader); glAttachShader(__programObject, vertShader);
3.3. 上载shader的二元
函数glShaderBinary上载预先编辑的shader的二元。第一个参数指定fragShader中shader object handle的数量。fragShader包含一个shader object handle。每个handle指示一个独特的遮影类型( vertex shader 或片元shader).。(GLenum)0指定shader的二元格式。fragmentFragment 或 vertexVertex 向客户端内存里的shader二元数据指定一个指针。最后一个参数指定字节中shader二元数据的长度。
glShaderBinary(1, &fragShader, (GLenum)0, fragmentFragment, fragmentFragmentLength * sizeof(int)); glShaderBinary(1, &vertShader, (GLenum)0, vertexVertex, vertexVertexLength * sizeof(int));
3.4. 为遮影对象提供源代码
这个方法将遮影中的源代码设定到字符串列(fragmentFragmentText 和vertexVertexText参数)中的源代码上。任何之前存储在遮影对象中的源代码被完全取代。
glShaderSource(fragShader, 1, (const char**)&fragmentFragmentText, null); glShaderSource(vertShader, 1, (const char**)&vertexVertexText, null);
3.5. 编辑shaders
glCompileShader编辑存储在fragShader 和vertShader参数指定的shader object中的源字符串。编辑状态作为shader object状态的一部分被储存。
glCompileShader(fragShader); glCompileShader(vertShader);
注意,glCompileShader仅在GL version 2.0 或更高版本中可获得。
3.6. 链接程序对象
glLinkProgram链接程序指定的程序对象。如果任何GL_VERTEX_SHADER 类型的shader object被粘贴到程序上,它们被用来创建一个可执行文件,在可编程vertex处理器上运行。如果任何GL_FRAGMENT_SHADER类型的shader object被粘贴到程序上,它们创建一个可执行文件,在可编程片元处理器上运行。
glLinkProgram(__programObject);
3.7. 使用程序对象,而不是固定的函数OpenGL
这个方法安装程序指定的程序对象,做为现在的渲染状态。一个或多个可执行文件在程序对象中创建,使用glAttachShader将shader object成功地粘贴到它上面,使用glAttachShader成功编译shader object,并且使用glLinkProgram连接程序对象。
glUseProgram(__programObject);
程序对象包含运行在vertex(片元)处理器上的可执行文件,如果它们包含一个或多个被成功编译和链接的GL_VERTEX_SHADER (typeGL_FRAGMENT_SHADER)类型的shader object。
3.8你可以使用:
glDeleteShader(vertShader); glDeleteShader(fragShader);
删除shader object.
在GlesCube::InitGL()方法里,所有的初始化步骤完成。如果所有的shaders被成功编译,并且程序对象被成功链接,glUseProgram之后使用shader完成所有的渲染。现在,有个准备好的GL表面进行处理。
我们来看看包含了OpenGL绘图函数的GlesCube::Draw()方法。
绘图
4.设定viewport
glViewport 函数向窗口坐标指定被常规化的设备坐标的X和Y的仿射转换。第一批两个参数在viewport 长方形的左下角(以像素为单位)。缺省值为 (0,0).。当OpenGL context 首先被附加窗口,宽度和高度被设定到窗口的尺度上。
int x, y, width, height; GetAppFrame()->GetFrame()->GetBounds(x, y, width, height); glViewport(0, 0, width, height);
让 (xnd , ynd ) 成为常规化设备坐标。窗口坐标(xw , yw)然后如下所示进行计算:
xw = (xnd + 1) * (width / 2) + x; yw = (ynd + 1) * (height / 2) + y; |
5. 绘制简单的图元
OpenGL ES渲染所有的来自vertex数列的集合。不用调用GL函数以传递每个
vertex, 常规项,纹理,坐标,边标志或颜色,你可以分开vertex, 常规项,和其它参数的数列,使用它们构建一个图元的次序(单独调用glDrawElements),并渲染来自数据列的图元。
例如,这显示了如何渲染OpenGL ES中的三角形。
const GLfloat vertices[] = { -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, …………………. 0.5f, 0.5f, -0.5f }; glVertexAttribPointer(__idxPosition, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), vertices); glVertexAttribPointer(__idxColor, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), colors); glEnableVertexAttribArray(__idxPosition); glEnableVertexAttribArray(__idxColor); glUniformMatrix4fv(__idxMVP, 1, GL_FALSE, (GLfloat*) &__matMVP.m[0][0]); glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, indices);
glDrawElements使用较少的次常式调用,指定多个子程序图元。
当glDrawElements被调用,它使用被启用的数列中次序元素,首先从标记体开始,构建一系列集合图元。第一个参数指定构建何种图元,并且如何构建这些图元。
GlesCube样例程序位于\<BADA_SDK_HOME>\Samples\GlesCube\
要求的文件:SDK已经有了所有要求的文件,以创建OpenGL ES程序。OpenGL ES的页眉文件包括:
• FGraphicsOpegngl2.h
• FGraphicsEgl
• FGraphicsOpengl
相关文章推荐
- [Bada开发]OpenGL ES 2.0程序 创建简单3D图形
- 大钟的ios开发之旅(4)————简单谈谈ios程序界面实现的三种方式(代码创建,xib和storyboard)
- 手机3D图形标准 OpenGL ES 2.0定稿
- 使用structs2.0开发一个简单的用户登录程序
- Android开发 OpenGL ES绘制3D 图形实例详解
- Android OpenGL ES 简明开发教程六: 真正的3D图形
- android studio | openGL es 3.0增强现实(AR)开发 (4) 绘制简单的2D图形、显示、旋转
- Revit二次开发入门--创建一个简单的程序
- 《Android 3D游戏开发技术宝典:OpenGL ES 2.0》
- Android OpenGL ES 简明开发教程六: 真正的3D图形
- Android OpenGL ES 简明开发教程六: 真正的3D图形
- Android OpenGL ES 简明开发教程六: 真正的3D图形
- Android OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程序框架
- 【Iphone 游戏开发之一】创建视图并绘制简单图形 推荐
- 【Iphone 游戏开发之一】创建视图并绘制简单图形
- Android OpenGL(二) 学习《Android 3D 游戏开发技术宝典 -openGL ES 2.0》
- Android OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程序框架
- Android OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程序框架
- 【Iphone 游戏开发之一】创建视图并绘制简单图形
- Android OpenGL ES 简明开发教程_真正的3D图形