找回密码
 立即注册
查看: 3551|回复: 0

创建OpenGL ES应用程序

[复制链接]
发表于 2016-3-16 23:20:24 | 显示全部楼层 |阅读模式
最简单的方法使用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 () 基本效用函数。
    1. Evas_Object *win;
    2. elm_config_accel_preference_set("opengl");
    3. 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通道和启用深度缓冲。
    1. // 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表面。
    1. // The resize policy tells GLView what to do with the surface when it
    2. // resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE tells it to
    3. // destroy the current surface and recreate it to the new size
    4. elm_glview_resize_policy_set(glview, ELM_GLVIEW_RESIZE_POLICY_RECREATE);
    复制代码
  • GL函数指针。
    最初,应用程序必须调用GL api使用 Evas_GL 英语的抽象层。 这意味着你必须得到一组抽象GL函数的函数指针 Evas_GL对象和调用函数对象。 这可能是恼人的,尤其是当你想重用GL部分在其他平台上实现。 要解决这个问题,英语提供了方便的助手宏,中定义 Elementary_GL_Helpers 。 h 头文件。 下面的例子展示了如何使用宏。
    1. #include <Elementary_GL_Helpers.h>
    2. ELEMENTARY_GLVIEW_GLOBAL_DEFINE();

    3. static Evas_Object*
    4. add_glview(Evas_Object* parent, appdata_s *ad)
    5. {
    6.    Evas_Object* glview;

    7.    // Create and initialize GLView
    8.    glview = elm_glview_add(parent);

    9.    // Prepare to use OpenGL ES APIs directly
    10.    ELEMENTARY_GLVIEW_GLOBAL_USE(glview);
    11. }
    复制代码

    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组件,您可以设置必要的回调函数,在主循环称为渲染场景。
    1. // Initialization callback
    2. elm_glview_init_func_set(glview, init_glview);
    3. // Resizing callback
    4. elm_glview_resize_func_set(glview, resize_glview);
    5. // Drawing callback
    6. elm_glview_render_func_set(glview, draw_glview);
    7. // Deletion callback
    8. elm_glview_del_func_set(glview, del_glview);
    复制代码

    • 设置初始化的回调函数。
      初始化的回调就是创建GLView时。
      1. // GL init callback
      2. static void
      3. init_glview(Evas_Object *glview)
      4. {
      5.    // Set GL state color to pink
      6.    glClearColor(1.0, 0.2, 0.6, 1.0);

      7.    // Do any form of OpenGL ES initialization here
      8.    // init_shaders();
      9.    // init_vertices();
      10. }
      复制代码

    • 设置调整回调。
      调整回调就是每当GLView组件的大小。 共同行动是重置视窗。 因为GLView大小可以改变父容器,必须设置调整回调与新GLView和重置视窗大小尺寸。
      1. // GLView resize callback
      2. static void
      3. resize_glview(Evas_Object *glview)
      4. {
      5.    int w, h;
      6.    elm_glview_size_get(glview, &w, &h);
      7.    glViewport(0, 0, w, h);
      8. }
      复制代码

    • 设置回调。
      画的回调被称为每当GLView必须更新。 GL画命令必须在这里。
      1. // GL draw callback
      2. static void
      3. draw_glview(Evas_Object *glview)
      4. {
      5.    // Paint it pink
      6.    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      7.    // The usual OpenGL ES draw commands come here
      8.    // draw_scene();
      9. }
      复制代码

    • 设置删除回调。
      删除时触发回调GLView被摧毁。 没有其他可以呼吁同一个对象回调。
      1. // GLView deletion callback
      2. static void
      3. del_glview(Evas_Object *glview)
      4. {
      5.    // Destroy all the OpenGL ES resources here
      6.    // destroy_shaders();
      7.    // destroy_objects();
      8. }
      复制代码


注意:
如果4 GL函数被称为外GLView回调函数,您必须调用 evas_gl_make_current () 函数在GL函数被调用之前。 然而,这会导致性能下降由于上下文切换,只如果不使用直接呈现模式。
如果启用了直接呈现,都必须从4 GL函数GLView回调函数。 所有其他操作可以打破呈现秩序,导致意想不到的呈现。
欢迎来到泰泽网:http://www.tizennet.com/ 泰泽论坛:http://bbs.tizennet.com/ 好没有内涵哦,快到设置中更改这个无聊的签名吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|泰泽应用|泰泽论坛|泰泽网|小黑屋|Archiver|手机版|泰泽邮箱|泰泽网 ( 蜀ICP备13024062号-1 )

GMT+8, 2024-11-24 19:42 , Processed in 0.056881 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表