2

我正在开发一个使用 Clutter (1.10) 和 COGL 将元素呈现到显示器的程序。

我创建了一组要渲染视频的 ClutterTextures,并且我希望视频纹理具有反射。

实现这一点的“标准”方式似乎是每次绘制纹理时的回调,代码类似于:

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 ();
}

然后将其连接到paintClutterTexture 上的信号。这里有一段类似的代码可以做类似的事情。(谷歌缓存,因为今天页面已经挂了

我遇到的问题是反射效果导致性能下降 - 当我启用它时会丢失 5~7 fps。部分问题可能是我正在使用的低功耗硬件(Raspberry Pi)。

通过设置纹理的克隆并使其有点透明,我设法做了类似于这段代码所做的事情。这不会对性能造成任何影响。但是,与绘制回调方法不同的是,反射具有硬边并且不会淡出。

我想在不影响性能的情况下获得更好看的反射效果。我想知道是否有某种方法可以获得类似的效果,每次绘画不需要太多工作......还有很多其他的杂波和 COGL 方法可以操纵材质、着色器等,但我几乎没有没有 OpenGL 专业知识,所以我不知道我是否可以按照这些思路来做我想做的事情,甚至不知道如何找到我可以解决的类似事情的例子。

是否可以通过 Clutter/COGL 获得更好看的高性能反射效果?

4

0 回答 0