Эффективные отражения в Clutter/COGL?
Я работаю над программой, которая использует Clutter (1.10) и COGL для визуализации элементов на дисплее.
Я создал набор текстур ClutterTexture, для которых я рендеринг видео, и я хотел бы, чтобы текстуры видео имели отражения.
"Стандартный" способ реализовать это, по-видимому, - обратный вызов каждый раз, когда рисуется текстура, с кодом, похожим на:
static void texture_paint_cb (ClutterActor *actor ) {
ClutterGeometry geom;
CoglHandle cmaterial;
CoglHandle ctexture;
gfloat squish = 1.5;
cogl_push_matrix ();
clutter_actor_get_allocation_geometry (actor, &geom);
guint8 opacity = clutter_actor_get_paint_opacity (actor);
opacity /= 2;
CoglTextureVertex vertices[] =
{
{ geom.width, geom.height, 0, 1, 1 },
{ 0, geom.height, 0, 0, 1 },
{ 0, geom.height*squish, 0, 0, 0 },
{ geom.width, geom.height*squish, 0, 1, 0 }
};
cogl_color_set_from_4ub (&vertices[0].color, opacity, opacity, opacity, opacity);
cogl_color_set_from_4ub (&vertices[1].color, opacity, opacity, opacity, opacity);
cogl_color_set_from_4ub (&vertices[2].color, 0, 0, 0, 0);
cogl_color_set_from_4ub (&vertices[3].color, 0, 0, 0, 0);
cmaterial = clutter_texture_get_cogl_material (CLUTTER_TEXTURE (actor));
ctexture = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (actor));
cogl_material_set_layer (cmaterial, 0, ctexture);
cogl_set_source(cmaterial);
cogl_set_source_texture(ctexture);
cogl_polygon (vertices, G_N_ELEMENTS (vertices), TRUE);
cogl_pop_matrix ();
}
Затем он подключен к paint
сигнал на ClutterTexture. Здесь есть похожий фрагмент кода, который делает что-то похожее. ( Google кеш, так как страница была закрыта сегодня)
Проблема, с которой я столкнулся, заключается в том, что эффект отражения вызывает снижение производительности - при включении я теряю 5-7 кадров в секунду. Частично проблема, вероятно, связана с аппаратным обеспечением с низким энергопотреблением, которое я использую (Raspberry Pi).
Мне удалось сделать нечто подобное тому, что делает этот код, настроив клон текстуры и сделав его несколько прозрачным. Это не влияет на производительность. Однако, в отличие от метода обратного вызова рисования, отражение имеет жесткие края и не исчезает.
Я хотел бы получить эффект отражения лучше без снижения производительности. Мне интересно, есть ли какой-нибудь способ получить подобный эффект, который не требует так много работы для краски... Есть множество других методов Clutter и COGL, которые манипулируют материалами, шейдерами и так далее, но у меня мало без опыта OpenGL, так что я понятия не имею, смогу ли я найти что-то в этом роде, чтобы делать то, что я хочу, или даже как найти примеры чего-то подобного, над чем я мог бы поработать.
Можно ли получить эффектный эффект отражения с помощью Clutter/COGL?