2

Le but de mon projet est de mettre en place un shader et de l'attacher sur scène. Je veux une déformation entière de l'écran en utilisant le système d'extension JS gnome. (Je l'ai fait en C et recompile gnome mais je voudrais utiliser une technologie sans aucune compilation nécessaire). Ensuite, je cherche un outil et j'attache un effet ShaderEffect personnalisé à la scène. J'ai essayé de le faire avec le code suivant, mais tout le gel de l'écran:ClutterShaderEffect avec l'extension gnome

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. Cela fonctionne mais le gel de l'écran. Donc, je l'ai lu la documentation et trouvé ce Doc link:

La mise en œuvre d'un ClutterOffscreenEffect Création d'une sous-classe de ClutterOffscreenEffect exige, en cas de passer outre les fonctions virtuelles ClutterEffect, à la chaîne jusqu'à la mise en œuvre du ClutterOffscreenEffect. En plus des fonctions virtuelles de ClutterEffect, ClutterOffscreenEffect fournit également une fonction ClutterOffscreenEffectClass.paint_target(), qui encapsule la peinture efficace de la texture qui contient le résultat de la redirection hors écran.

Mais comment dois-je le faire dans 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 ? :/ 
    } 
}); 

Parce que j'ai eu quelques fichiers C le faire, mais je n'ai pas la moindre idée comment mettre en œuvre dans JS. La documentation JS non officielle n'aide pas.

J'ai aussi essayé quelque chose d'autre avec 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); 

Mais le shader a été appliqué seulement sur Childs, pas sur scène. this._actor = global.stage. Voici un aperçu du résultat de l'utilisation de la seconde méthode. Mon shader duplique les textures, juste pour le test. Mais pourquoi seulement sur les icônes et pas sur l'ensemble des écrans puisque je l'attache sur scène?

Overview of the second method using Clutter.Shader

Répondre

1

Je fixe mon problème non de rafraîchissement en utilisant le code source suivant:

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