Upload
tech-talks-nsu
View
68
Download
1
Embed Size (px)
Citation preview
1Очень быстрое, краткое и поверхностное
введение в технологии сайзкодинга
Иван Авдеев, http://w23.ru, 2013-10-07 @ TechTalksNSUИван Авдеев, http://w23.ru, 2013-07-20 @ UnigineOpenAir
Типичные размеры интр
● 64Кб● 4Кб● 1Кб● 256 байт
64k
● C/C++– Не злоупотреблять STL, шаблонами и т.п.
● Графические тулзы (на С/С++)– Плеер + данные– Артисты (не-программисты) могут рисовать– Пример: Werkkzeug
● Паковка: kkrunchy
64k, графика
● Генераторы геометрии и текстур● Хардкод● Очень простые данные в виде инструкций
(«создай куб здесь; выдави из него такую-то грань; subdivide»)
64k, музыка
● (раньше) трекерная – простые семплы, лёгкие паттерны
● (ныне) софтсинты– Пример: V2– Простые данные, богатый звук, midi-поток
хорошо жмётся
4k
● C или ассемблер– Нельзя crt– Статическая память– Гипероптимизм
● Паковка – crinkler– Линкер-паковщик (много знает, много может)– Арифметическое кодирование с контекстным
моделированием– Кастомный PE-заголовок на грани валидности
4k, графика
● Традиционная геометрия (редко)– «Демка одного эффекта»
● Два треугольника на весь экран + шейдер– Цвет = f(x, y, t)– Простой сетап (500-800 байт)– Шейдер = текст = хорошо жмётся + shaderminifier– Трассировка лучей!
4k, музыка
● (раньше) midi + gm.dls– Очень лёгкий– MIDI :(
● Софтсинты– Есть готовые: Sonant, 4klang
● Есть даже в виде VST
– Заметный размер – 1..2кб
1k
● То же самое, что и 4k, но специализированные паковщики
● 200 байт для творчества
256
● DOS! com! Assembler!● Mode 13h (320x200, 8bit)● Просто пишем в память
– f(x, y, t)– Feedback/клеточные автоматы– Да что угодно!
У матросов нет вопросов
2Двух треугольников хватит всем
Как-то так
Шейдер
Цвет = f(x, y, t)
Трассировка лучей
● Аналитическая трассировка– vec3 pos = intersect_geometry(ray);
● Аналитическое решение уравнения пересечения линии с фигурой
– Скучно– Мало возможностей– Сложные объекты сложно
● Пересечение с параллелепипедом!
Функции расстояния
● Функция расстояния: float D(vec3 at) = расстояние до ближайшей геометрии
Функции расстояния = няк
● Одна функция нормали для всего: normalize(grad(D()))
● Тривиальные операции CSG– Объединение: min(f(), g())
– Пересечение: max(f(), g())
– Вычитание: max(f(), -g())
– Повторение: D(mod(at,rep) - .5*rep)
Функции расстояния = няк
● Просто делать сложные деформации– D(at)-.001*noise(at)
– D(deform(at))
● (строго говоря это больше не функции расстояния, нужно быть внимательным)
Сферическая трассировка
Фигуры
● Шар: length(at)-R● Параллелепипед: length(max(abs(at)-size,0.)) ● Цилиндр: length(at.xz)-R● Тор: length(vec2(length(at.xy)-R, at.z)) — r● «Облака»: fnoise(at)
Освещение
● Диффузное: color = material.color * diffuse.color * max(0., dot(normal(at), dir_to_light));
● Тени– Честно: пускаем ещё один луч из точки
пересечения в источник света– Быстро (и мягко): замеряем N точек на пути
между точкой пересечения и источником
Освещение
● Scene space ambient occlusion– Делаем N замеров по нормали, сравниваем
расстояния и определяем затенение– Можно делать local illumination!
Можно
● GPU всё стерпит– Отражения– Преломления– Path tracing