带有gnome扩展的ClutterShaderEffect

Erwan Douaille

我项目的目的是实现一个着色器并将其附加在舞台上。我希望使用JS gnome扩展系统使整个屏幕变形。(我是用C语言完成的,然后重新编译gnome,但我想使用一种无​​需任何编译的技术)。

然后,我正在寻找实现并将一个自定义的ShaderEffect附加到舞台上。我尝试使用以下代码进行操作,但整个屏幕都死机了:

fx = new Clutter.ShaderEffect({
        shader_type: Clutter.ShaderType.FRAGMENT_SHADER });
fx.set_shader_source(shader);
fx.set_uniform_value('height', this._actor.get_height());
fx.set_uniform_value('width', this._actor.get_width());
this._actor.add_effect_with_name('shader', fx);

this._actor = global.stage这可以正常工作,但屏幕冻结。因此,我阅读了文档并找到了此Doc链接

实现ClutterOffscreenEffect创建ClutterOffscreenEffect的子类需要重写ClutterOffscreenEffect的实现,以覆盖ClutterEffect虚拟函数。除了ClutterEffect的虚拟函数外,ClutterOffscreenEffect还提供了ClutterOffscreenEffectClass.paint_target()函数,该函数封装了包含屏幕外重定向结果的纹理的有效绘制。

但是我想怎么用JS做呢?

const ClutterShaderEffectCustom = new Lang.Class({
  Name : 'ClutterShaderEffectCustom',
  Extends : Clutter.ShaderEffect,

  _init : function(shader_type, actor, shaderSource) {
      // some stuff 
  },

  paint_target : function() {
     // TODO but how ? :/
  }
});

因为我有一些C文件在做,但是我不知道如何在JS中实现它。非官方的JS文档无济于事。

我还用Clutter.Shader尝试了其他方法:

fx = new Clutter.Shader();
fx.set_fragment_source(shader, shader.lenght);
fx.set_uniform('height', this._actor.get_height());
fx.set_uniform('width', this._actor.get_width());
this._actor.set_shader(fx);

但是着色器仅适用于儿童,而不适用于舞台。this._actor = global.stage这是使用第二种方法的结果的概述。我的着色器只是为了测试而复制纹理,但是为什么要在图标上而不是整个屏幕上复制纹理,因为我将其附加在舞台上了?

使用Clutter.Shader的第二种方法概述

Erwan Douaille

我通过使用以下源代码解决了我的非刷新问题:

myFunction : function() {
    fx = new Clutter.ShaderEffect({
        shader_type: Clutter.ShaderType.FRAGMENT_SHADER });
    fx.set_shader_source(shader);
    fx.set_uniform_value('height', this._actor.get_height());
    fx.set_uniform_value('width', this._actor.get_width());
    this._actor.add_effect_with_name('shader', fx); 
    this._timeline = new Clutter.Timeline({ duration: 1, repeat_count: -1 });
    this._timeline.connect('new-frame', Lang.bind(this, this._newFrame));
    this._timeline.start();
}

_newFrame: function() {
    this._actor.scale_y = 1.0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章