2

我的项目的目的是实现一个着色器并将其附加到舞台上。我想要一个使用 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。这是有效的,但屏幕冻结。所以我阅读了文档并找到了这个文档链接

实现 ClutterOffscreenEffect 创建 ClutterOffscreenEffect 的子类需要在重写 ClutterEffect 虚函数的情况下链接到 ClutterOffscreenEffect 的实现。在 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 的第二种方法概述

4

1 回答 1

1

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

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;
}
于 2015-11-30T10:16:06.940 回答