Показать сообщение отдельно
Старый 26.12.2015, 20:30
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 16  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Опробуй, синусоидальный дисторшен:
Код 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();
		}
	}
}
__________________
Дети не должны знать о своих родителях