Javascript 带有gnome扩展的ClutterShaderEffect

Javascript 带有gnome扩展的ClutterShaderEffect,javascript,gnome,clutter,gnome-shell,gnome-shell-extensions,Javascript,Gnome,Clutter,Gnome Shell,Gnome Shell Extensions,我的项目的目的是实现一个着色器并将其附加到舞台上。我想要一个使用JS gnome扩展系统的全屏幕变形。(我是用C语言完成的,并重新编译了gnome,但我想使用一种不需要任何编译的技术) 然后,我正在寻找实现并将自定义ShaderEffect附加到stage。 我试图用以下代码来完成,但整个屏幕都冻结了: fx = new Clutter.ShaderEffect({ shader_type: Clutter.ShaderType.FRAGMENT_SHADER }); fx.se

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

然后,我正在寻找实现并将自定义ShaderEffect附加到stage。 我试图用以下代码来完成,但整个屏幕都冻结了:

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);
这一点。_actor=global.stage。这是工作,但屏幕冻结。因此,我阅读了文档,发现:

实现ClutterOffscreeneEffect 创建ClutterOffscreeneEffect的子类需要在覆盖ClutterEffect虚拟函数的情况下链接到ClutterOffscreeneEffect的实现。 除了ClutterEffect的虚拟函数外,ClutterOffScreeneEffect还提供了一个ClutterOffScreeneEffectClass.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文档没有帮助

我还尝试了其他与混乱。着色器:

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);
但着色器仅应用于儿童,而不是舞台这个。_actor=global.stage。下面是第二种方法使用结果的概述。我的着色器正在复制纹理,只是为了测试。但既然我在舞台上附加了它,为什么只在图标上而不在整个屏幕上呢


我使用以下源代码修复了我的非刷新问题:

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