创建OpenGL ES应用程序
最简单的方法使用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回调函数。 所有其他操作可以打破呈现秩序,导致意想不到的呈现。
页:
[1]