ClutterShaderEffect с расширением gnome

Цель моего проекта — реализовать шейдер и прикрепить его на сцене. Я хочу деформировать весь экран, используя систему расширения 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


person Erwan Douaille    schedule 23.11.2015    source источник


Ответы (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;
}
person Erwan Douaille    schedule 30.11.2015