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 . 2 番目の方法を使用した結果の概要を次に示します。私のシェーダーは、テストのためだけにテクスチャを複製しています。しかし、ステージにアタッチするのに、画面全体ではなくアイコンのみに複製するのはなぜですか?

Clutter.Shader を使用した 2 つ目の方法の概要

4

1 に答える 1