Как передать вывод ShaderEffect обратно в тот же ShaderEffect в QML/QtQuick2

Вопрос

Я хочу передать вывод ShaderEffect самому себе, эффективно создавая петлю обратной связи.

Мои наивные попытки заключались в простом связывании ShaderEffectSource и ShaderEffect следующим образом:

    ShaderEffectSource {
        id:buf1;
        sourceItem:  effect;
    }

    ShaderEffect {
        id:effect;
        property variant src: buf1;
        //fragment shader then uses src as texture
    }

Мой следующий наивный подход заключался в том, чтобы добавить в микс второй ShaderEffectSource:

    ShaderEffectSource {
        id:buf1;
        sourceItem:  effect;
    }

    ShaderEffectSource {
        id:buf2;
        sourceItem:  buf1;
    }

    ShaderEffect {
        id:effect;
        property variant src: buf2;
        //fragment shader then uses src as texture
    }

Однако ни один из этих подходов не работает. Кажется, что это работает за один шаг, но никогда не возвращается в конце.

У меня есть ощущение, что это возможно, но я довольно новичок в QML, и, возможно, очень логичное и простое решение ускользнуло от меня. Любые подсказки приветствуются!

Ответить

Предпочтительны ответы с короткими работающими копируемыми фрагментами :-)


person Lennart Rolland    schedule 24.03.2014    source источник


Ответы (2)


Это решилось легко. Из документации я нашел что есть recursive property, который делает возможным использование рекурсивных шейдеров (да)! Так, например, код:

ShaderEffectSource {
    id:buf1;
    recursive:true;
    sourceItem:  effect;
}

ShaderEffect {
    id:effect;
    property variant src: buf1;
    //fragment shader then uses src as texture
}
person Lennart Rolland    schedule 02.04.2014

Несколько примеров использования рекурсивного ShaderEffectSource для создания эффектов реакции-диффузии и гидродинамики в пользовательском интерфейсе связаны с здесь.

person timday    schedule 07.07.2014
comment
На самом деле я некоторое время искал этот код гидродинамики, но вы как бы не ответили на вопрос, поэтому я не мог принять ваш ответ. Но все равно большое спасибо! - person Lennart Rolland; 24.09.2014
comment
Нет проблем, это уже было отмечено галочкой, когда я опубликовал это; просто подумал, что это может вдохновить других людей, наткнувшихся на этот вопрос, что можно сделать с рекурсивными шейдерами. - person timday; 24.09.2014