Эффективные отражения в 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?

0 ответов

Другие вопросы по тегам