
Код AS3:
package game.view.filters
{
import starling.textures.Texture;
import flash.display3D.Context3D;
import flash.display3D.Program3D;
import starling.animation.IAnimatable;
import starling.filters.FragmentFilter;
import flash.display3D.Context3DProgramType;
/**
* Шейдер волнового деформирования изображения.
* @author Tails
*/
public class Wave extends FragmentFilter{
// Приват
private var _programWave:Program3D; // Шейдер отрисовки
private var _programNormal:Program3D; // Обычный шейдер
private var _parameters:Vector.<Number>; // Вектор для передачи параметров фильтра
/**
* Создать фильтр волнового деформирования.
*/
public function Wave() {
/**
* [0] - Количество волн.
* [1] - Ширина волны по горизонтали.
* [2] - Y смещение
* [3] - 0
*/
_parameters = new <Number>[50, .1, 3.14, 0];
_parameters.fixed = true;
}
// ГЕТТЕР-СЕТТЕРЫ
/// Количество волн.
public function get waveNum():Number {
return _parameters[0];
}
public function set waveNum(value:Number):void {
_parameters[0] = value;
}
/// Ширина волны по горизонтали.
public function get waveSize():Number {
return _parameters[1];
}
public function set waveSize(value:Number):void {
_parameters[1] = value;
}
/// Отступ волны сверху, где полный цикл = 2PI
public function get waveStep():Number {
return _parameters[2];
}
public function set waveStep(value:Number):void {
_parameters[2] = value;
}
// ОПРЕДЕЛЕНИЕ
override protected function activate(pass:int, context:Context3D, texture:Texture):void {
if(_parameters[1] > 0){
context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, _parameters);
context.setProgram(_programWave);
}else {
context.setProgram(_programNormal);
}
}
protected override function createPrograms():void {
var fragmentProgramCode:String =
// Перенос координат в переменную + смещение для синуса
"mov ft0, v0 \n" +
// Количество волн по вертикали:
"mul ft0.x, ft0.y, fc.x \n" +
"add ft0.x, ft0.x, fc.z \n" +
"sin ft0.x, ft0.x \n" +
// Уменьшаем велечину волны по горизонтали:
"mul ft0.x, ft0.x, fc0.y \n" +
"add ft0.x, v0.x, ft0.x \n" +
"tex ft0, ft0, fs0 <2d, clamp, linear, mipnone> \n" +
"mov oc, ft0 \n";
_programWave = assembleAgal(fragmentProgramCode, STD_VERTEX_SHADER);
_programNormal = assembleAgal(STD_FRAGMENT_SHADER, STD_VERTEX_SHADER);
}
// УДАЛЕНИЕ
public override function dispose():void{
_programNormal.dispose();
_programWave.dispose();
super.dispose();
}
}
}