最简单的方法使用OpenGL ES API在Tizen应用程序依赖 Elm_GLView 组件。 的 Elm_GLView 组件是一个基本的UI组件,创建一个OpenGL ES(GL)目标表面和上下文。 的 Elm_GLView 组件可以嵌入到任何Tizen UI应用程序。 它基本上是一个包装器 Evas_GL EGL,GL /英语的抽象层。 通过使用Elm_GLView 组件,你不用考虑如何EGL环境加上本地窗口系统。 一些英语提供的宏也允许您直接使用GL api。 此外,UI框架可以访问GPU渲染输出结果的表面,使整个场景2 d和3 d组件的结合在一个单一的画布。 下面的例子展示了创建一个GL应用程序的步骤。 从现在开始, Elm_GLView组件是GLView缩短。 - 创建一个基本的应用程序,在HelloWorld示例(在 移动和 可穿戴应用程序)。
UI应用程序的框架使可用的窗口对象,它可以包含GLView组件。 - 启用硬件加速。
开发一个GL应用程序调用 elm_config_accel_preference_set () 在创建窗口函数。 它使应用程序使用GPU。 发展与基本的应用程序,创建一个窗口 elm_win_util_standard_add () 基本效用函数。 - Evas_Object *win;
- elm_config_accel_preference_set("opengl");
- win = elm_win_util_standard_add(name, "OpenGL example");
复制代码
你还必须设置硬件加速的清单文件。 有关更多信息,请参见 硬件加速。 - 初始化GLView。
在创建窗口中,您可以设置GLView模式的 elm_glview_mode_set () 功能启用alpha通道,深度缓冲,模板缓冲区,MSAA,客户端旋转功能。 支持以下模式:
- ELM_GLVIEW_ALPHA :使渲染的alpha通道。
- ELM_GLVIEW_DEPTH :呈现启用深度缓冲。
- ELM_GLVIEW_STENCIL :使模板缓冲区渲染。
- ELM_GLVIEW_MULTISAMPLE_LOW :使用MSAA最小数量的样本。
有关更多信息,请参见 _Elm_GLView_mode 枚举器(在 移动和 可穿戴应用程序)。 在接下来的例子中,alpha通道和启用深度缓冲。 - // Request a surface with alpha and a depth buffer elm_glview_mode_set(glview, ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH);
复制代码
另外,你可以选择政策调整和呈现。 下面的例子显示了如何决定如何处理GL表面当GLView组件的大小。 使用默认ELM_GLVIEW_RESIZE_POLICY_RECREATE 选项,GL表面被销毁并重新创建新的大小。 也可以设置为调整政策ELM_GLVIEW_RESIZE_POLICY_SCALE 。 在这种情况下,只有图像对象扩展,而不是底层的GL表面。 - // The resize policy tells GLView what to do with the surface when it
- // resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE tells it to
- // destroy the current surface and recreate it to the new size
- elm_glview_resize_policy_set(glview, ELM_GLVIEW_RESIZE_POLICY_RECREATE);
复制代码 - GL函数指针。
最初,应用程序必须调用GL api使用 Evas_GL 英语的抽象层。 这意味着你必须得到一组抽象GL函数的函数指针 Evas_GL对象和调用函数对象。 这可能是恼人的,尤其是当你想重用GL部分在其他平台上实现。 要解决这个问题,英语提供了方便的助手宏,中定义 Elementary_GL_Helpers 。 h 头文件。 下面的例子展示了如何使用宏。 - #include <Elementary_GL_Helpers.h>
- ELEMENTARY_GLVIEW_GLOBAL_DEFINE();
- static Evas_Object*
- add_glview(Evas_Object* parent, appdata_s *ad)
- {
- Evas_Object* glview;
- // Create and initialize GLView
- glview = elm_glview_add(parent);
- // Prepare to use OpenGL ES APIs directly
- ELEMENTARY_GLVIEW_GLOBAL_USE(glview);
- }
复制代码
ELEMENTARY_GLVIEW_GLOBAL_DEFINE () 和 ELEMENTARY_GLVIEW_GLOBAL_USE () 宏必须位于同一个源代码。 如果你有一个全球头文件在您的应用程序 ELEMENTARY_GLVIEW_GLOBAL_DECLARE () 宏可以在头文件。 然而,你必须非常小心当使用这些宏。 推荐的解决方案是使用 ELEMENTARY_GLVIEW_USE () 宏在每个客户端功能。 下面是一些情况你不能使用辅助宏:
- 当你使用一个以上的eva画布,如多个窗口。
- 如果您使用多个GL api,比如OpenGL ES 1.1,OpenGL ES 2.0,OpenGL ES 3.0。
- 如果你写或端口的库可以被其他应用程序使用。
辅助宏必须仅用于以下情况: - 当一个表面用于GL呈现。
- 当一个API集(OpenGL ES 1.1,OpenGL ES 2.0,或者OpenGL ES 3.0)使用。 在这种情况下,ELEMENTARY_GLVIEW_GLOBAL_DECLARE () 宏必须在全球使用标题为应用程序。
- 设置回调函数。
当你使用GLView组件,您可以设置必要的回调函数,在主循环称为渲染场景。 - // Initialization callback
- elm_glview_init_func_set(glview, init_glview);
- // Resizing callback
- elm_glview_resize_func_set(glview, resize_glview);
- // Drawing callback
- elm_glview_render_func_set(glview, draw_glview);
- // Deletion callback
- elm_glview_del_func_set(glview, del_glview);
复制代码
- 设置初始化的回调函数。
初始化的回调就是创建GLView时。 - // GL init callback
- static void
- init_glview(Evas_Object *glview)
- {
- // Set GL state color to pink
- glClearColor(1.0, 0.2, 0.6, 1.0);
- // Do any form of OpenGL ES initialization here
- // init_shaders();
- // init_vertices();
- }
复制代码
- 设置调整回调。
调整回调就是每当GLView组件的大小。 共同行动是重置视窗。 因为GLView大小可以改变父容器,必须设置调整回调与新GLView和重置视窗大小尺寸。 - // GLView resize callback
- static void
- resize_glview(Evas_Object *glview)
- {
- int w, h;
- elm_glview_size_get(glview, &w, &h);
- glViewport(0, 0, w, h);
- }
复制代码
- 设置回调。
画的回调被称为每当GLView必须更新。 GL画命令必须在这里。 - // GL draw callback
- static void
- draw_glview(Evas_Object *glview)
- {
- // Paint it pink
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // The usual OpenGL ES draw commands come here
- // draw_scene();
- }
复制代码
- 设置删除回调。
删除时触发回调GLView被摧毁。 没有其他可以呼吁同一个对象回调。 - // GLView deletion callback
- static void
- del_glview(Evas_Object *glview)
- {
- // Destroy all the OpenGL ES resources here
- // destroy_shaders();
- // destroy_objects();
- }
复制代码
注意:
如果4 GL函数被称为外GLView回调函数,您必须调用 evas_gl_make_current () 函数在GL函数被调用之前。 然而,这会导致性能下降由于上下文切换,只如果不使用直接呈现模式。
如果启用了直接呈现,都必须从4 GL函数GLView回调函数。 所有其他操作可以打破呈现秩序,导致意想不到的呈现。 |