Dithering in Touch Designer Tutorial
APX.LaboratoryШаг 1: Добавление матрицы (Constant)
Задаём математическую основу паттерна - матрицу 4x4.
1. Добавьте ноду Constant в CHOP

2. В настройках ноды(нажав на ноду) добавьте еще 15 каналов (до chan16)

3. Для каждого канала введите следующие значения

Шаг 2: Обработка данных (Shuffle и Expression)
Теперь нужно выстроить эти данные в одну последовательность и нормализовать их.
1. Добавьте ноду Shuffle в CHOP и подключите её к Constant

2. В параметре Method выберите Sequence All Samples

3. Добавьте ноду Expression CHOP и подключите её к Shuffle

4. Нам нужно привести значения к диапазону от 0 до 1. В настройках Expression нажмите на нижнею Expression и напишите формулу: (me.inputVal + 0.5) / 16

Шаг 3: Визуализация паттерна (CHOP to и Resolution)
Превращаем цифровые данные в текстуру.
1. Добавьте CHOP to TOP

2. В настройках ноды в CHOP добавьте express1 (подключение к Expression CHOP). В Image Layout поменяйте на Fit to Square (это автоматически создаст квадрат 4x4 пикселя)

3. В разделе Common измените в Viewer Smoothness на Nearest Pixel

4. Добавьте Resolution TOP

5. В настройках ноды включите High Quality Resize

6. Поменяйте в Output Resolution на Custom Resolution. Установите разрешение, например, 1000 на 1000 пикселей. Поменяйте в Input Smoothness и Viewer Smoothness на Nearest Pixel

Шаг 4: Подготовка изображения (Movie File in)
Загрузим контент, к которому будем применять эффект
1. Добавьте Movie File In TOP (или Video Device In). Выберите любое изображение или видео

2. В параметрах ноды во вкладке Common измените в Viewer Smoothness на Nearest Pixel и в Pixel Format на 8-bit Fixed Mono (или просто сделайте изображение черно-белым с помощью ноды Monochrome TOP)

Шаг 5: Тайлинг (Transform)
Нам нужно, чтобы наш паттерн 1000x1000 (или меньше) повторялся по всему экрану, покрывая исходное изображение
1. После Resolution TOP добавьте Transform TOP и подключите к Resolution TOP

2. В настройках ноды во вкладке Transform нажмите на Scale в sx и sy введите следующие формулы: для ширины *4 / op('moviefilein1').width* и для высоты *4 / op('moviefilein1').height*

3. Во вкладке Tile в Extend выберите Repeat

4. Чтобы паттерн всегда идеально покрывал картинку подгоним по размерам. В о вкладке Common в поле Output Resolution выберите Custom Resolution, нажмите на Resolution и введите следующие формулы: для ширины *op('moviefilein1').width* и для высоты *op('moviefilein1').height*
5. В поле Input Smoothness и Viewer Smoothness выберите Nearest Pixel

Шаг 6: Смешивание и Порог (Composite и Threshold)
Самое интересное - объединяем слои
1. Добавьте Composite TOP

2. Подключите на вход 1: Ваше видео (Movie File In). На вход 2: Ваш паттерн (Transform TOP)

3. Во вкладке Composite в поле Operation выберите Overlay (Наложение). Во вкладке Common в поле Input Smoothness и Viewer Smoothness выберите Nearest Pixel

4. Добавьте Threshold TOP и подключите к Composite TOP

5. Покрутите ползунок Threshold, чтобы настроить баланс черного и белого
6. Softness: Установите в 0 для жесткого пиксельного края
7. Во вкладке Common в поле Input Smoothness и Viewer Smoothness выберите Nearest Pixel

Эксперименты: Анимация Разрешения
Теперь заставим картинку меняться. Чтобы картинка плавно меняла детализацию от крупной к мелкой и обратно, мы используем синусоиду
1. Выберите ноду Movie File In TOP, перейдите на вкладку Common, установите Output Resolution в режим Custom Resolution
2. Кликните на параметр Resolution, и вставьте эту формулу в Resolution W и Resolution H:
int(tdu.remap(math.sin(absTime.seconds), -1, 1, 200, 1280))
- math.sin(absTime.seconds) - генерирует синусоиду, значение которой плавно колеблется от -1 до 1 с течением времени
- tdu.remap(..., -1, 1, 200, 1280) - берет от -1 до 1 и пропорционально растягивает его от 200 до 1280.
- int(...) - отбрасывает дробную часть результата, так как разрешение может быть только целым числом
Также можем сделать чтобы картинка плавно меняла детализацию совершенно случайно, используя генератор случайных чисел
1. Снова в ноде Movie File In TOP, во вкладке Common, в поля Resolution W и Resolution H вставьте следующую формулу:
int(tdu.remap(tdu.rand(int(absTime.seconds)), 0, 1, 200, 1280)) - Resolution W
int(tdu.remap(tdu.rand(int(absTime.seconds) + 1), 0, 1, 200, 1280)) - Resolution H
- int(absTime.seconds) - берёт текущее время и округляет его до целого числа (1, 2, 3...)
- tdu.rand(...) - генерирует случайное число от 0 до 1
- tdu.remap(..., 0, 1, 200, 1280) - берет это случайное число и масштабирует его в нужный диапазон пикселей (от 200 до 1280)
- int(...) - превращает итоговый результат в целое число, так как разрешение экрана не может быть дробным
Этот же эффект в Photoshop
Оригинальное видео