Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Введение в демосцену (Иван Авдеев)

Введение в демосцену (Иван Авдеев)

Иван Авдеев (2ГИС) рассказывает о технологиях создания интро и демо в форматах 64kb, 4kb, 1kb и 256 bytes.

http://techtalks.nsu.ru

E51d363aa46f4d059d54a15e0bcd8e6f?s=128

Tech Talks @NSU

October 07, 2013
Tweet

Transcript

  1. 1 Очень быстрое, краткое и поверхностное введение в технологии сайзкодинга

    Иван Авдеев, http://w23.ru, 2013-10-07 @ TechTalksNSU Иван Авдеев, http://w23.ru, 2013-07-20 @ UnigineOpenAir
  2. Типичные размеры интр • 64Кб • 4Кб • 1Кб •

    256 байт
  3. 64k • C/C++ – Не злоупотреблять STL, шаблонами и т.п.

    • Графические тулзы (на С/С++) – Плеер + данные – Артисты (не-программисты) могут рисовать – Пример: Werkkzeug • Паковка: kkrunchy
  4. 64k, графика • Генераторы геометрии и текстур • Хардкод •

    Очень простые данные в виде инструкций («создай куб здесь; выдави из него такую-то грань; subdivide»)
  5. 64k, музыка • (раньше) трекерная – простые семплы, лёгкие паттерны

    • (ныне) софтсинты – Пример: V2 – Простые данные, богатый звук, midi-поток хорошо жмётся
  6. 4k • C или ассемблер – Нельзя crt – Статическая

    память – Гипероптимизм • Паковка – crinkler – Линкер-паковщик (много знает, много может) – Арифметическое кодирование с контекстным моделированием – Кастомный PE-заголовок на грани валидности
  7. 4k, графика • Традиционная геометрия (редко) – «Демка одного эффекта»

    • Два треугольника на весь экран + шейдер – Цвет = f(x, y, t) – Простой сетап (500-800 байт) – Шейдер = текст = хорошо жмётся + shaderminifier – Трассировка лучей!
  8. 4k, музыка • (раньше) midi + gm.dls – Очень лёгкий

    – MIDI :( • Софтсинты – Есть готовые: Sonant, 4klang • Есть даже в виде VST – Заметный размер – 1..2кб
  9. 1k • То же самое, что и 4k, но специализированные

    паковщики • 200 байт для творчества
  10. 256 • DOS! com! Assembler! • Mode 13h (320x200, 8bit)

    • Просто пишем в память – f(x, y, t) – Feedback/клеточные автоматы – Да что угодно!
  11. У матросов нет вопросов

  12. 2 Двух треугольников хватит всем

  13. Как-то так Шейдер Цвет = f(x, y, t)

  14. Трассировка лучей • Аналитическая трассировка – vec3 pos = intersect_geometry(ray);

    • Аналитическое решение уравнения пересечения линии с фигурой – Скучно – Мало возможностей – Сложные объекты сложно • Пересечение с параллелепипедом!
  15. Функции расстояния • Функция расстояния: float D(vec3 at) = расстояние

    до ближайшей геометрии
  16. Функции расстояния = няк • Одна функция нормали для всего:

    normalize(grad(D())) • Тривиальные операции CSG – Объединение: min(f(), g()) – Пересечение: max(f(), g()) – Вычитание: max(f(), -g()) – Повторение: D(mod(at,rep) - .5*rep)
  17. Функции расстояния = няк • Просто делать сложные деформации –

    D(at)-.001*noise(at) – D(deform(at)) • (строго говоря это больше не функции расстояния, нужно быть внимательным)
  18. Сферическая трассировка

  19. Фигуры • Шар: length(at)-R • Параллелепипед: length(max(abs(at)-size,0.)) • Цилиндр: length(at.xz)-R

    • Тор: length(vec2(length(at.xy)-R, at.z)) — r • «Облака»: fnoise(at)
  20. Освещение • Диффузное: color = material.color * diffuse.color * max(0.,

    dot(normal(at), dir_to_light)); • Тени – Честно: пускаем ещё один луч из точки пересечения в источник света – Быстро (и мягко): замеряем N точек на пути между точкой пересечения и источником
  21. Освещение • Scene space ambient occlusion – Делаем N замеров

    по нормали, сравниваем расстояния и определяем затенение – Можно делать local illumination!
  22. Можно • GPU всё стерпит – Отражения – Преломления –

    Path tracing