Code golfing a tiny demo using maths and a pinch of insanity
Этот код — минималистичная демка в 464 символах GLSL, созданная без текстур и мешей, чисто математикой. Она генерирует пейзаж с горами, туманом и облаками, используя накопление синусоидальных волн для шума вместо дорогих методов вроде градиентного или value noise. Каждый пиксель вычисляется процедурно через итеративный цикл, имитирующий лучи для объёма и глубины.
Ключевые приёмы: компактный шум через abs(sin(x) + sin(y)), матричные вращения для камеры и анимации, нелинейные преобразования для цвета и освещения. Практический вывод — даже сложную графику можно ужать в крошечный код, жертвуя читаемостью ради размера. Неожиданный эффект: демка "стареет" из-за накопления ошибок чисел с плавающей точкой, требуя периодической перезагрузки.
Комментарии (17)
- Обнаружена возможность сэкономить байты в шейдерном коде через математические преобразования.
- Предложена дальнейшая оптимизация кода с сохранением трёх байтов за счёт предварительного умножения переменной.
- Автор принял предложение и обновил код на Shadertoy с указанием авторства.
- Возникли проблемы с производительностью WebGL в браузерах Edge и Chrome на Windows из-за слишком большого количества контекстов.
- Демонстрация корректно работает в Firefox на Windows и получила высокую оценку за визуальный эффект.
Voronoi map generation in Civilization VII
В Civilization VII полностью переработали генерацию карт, чтобы сделать её разнообразнее и естественнее. Раньше использовался фрактальный шум, который создавал сбалансированные, но предсказуемые ландшафты — игроки жаловались на повторяемость и прямые береговые линии, нарушавшие immersion.
Теперь внедрена техника Вороного: алгоритм строит карты на основе ячеек, позволяя гибко управлять формой континентов и островов. Добавлены два новых типа — «Континенты и острова» и «Пангея и острова». Они сочетают органичность с балансом, особенно важным в мультиплеере. Это оживляет стадию исследования, ключевую для жанра 4X.
Комментарии (15)
- Участники высоко оценили статью о генерации карт с помощью диаграмм Вороного и выразили энтузиазм по поводу креативного программирования в этой области.
- Обсуждались технические детали, включая использование алгоритма Ллойда для улучшения форм регионов и JavaScript-библиотеки для работы с диаграммами Вороного.
- Были предложены идеи по комбинированию диаграмм Вороного с другими методами, такими как шум Перлина и GenAI, для большего контроля над процедурной генерацией.
- Упомянуты дополнительные ресурсы: блог о процедурной генерации, туториал по алгоритмам поиска пути и мнение о серии игр Civilization.
- Отмечено, что техника имеет потенциал не только для визуализации данных, но и для создания 3D-карт и игрового контента.
Procedural Island Generation (III)
Генерация процедурных островов (часть III)
Продолжаем с части II, где была создана основа карты высот и система горных хребтов. Теперь добавим детализированные шумовые слои, горные пики на основе расстояния и выполним смешивание для финального рельефа.
Карта высот (повтор)
Исходная карта высот из части I задаёт базовое распределение суши и воды:
Для визуализации используется палитра magma из matplotlib с искусственным затемнением океанских областей. Карта семплируется по центроидам треугольников Делоне.
Многоуровневые шумовые слои
Накладываем несколько октав шума Симплекса на разных частотах поверх базовой карты. Каждый слой добавляет детали разного масштаба.
Используется шесть слоёв с частотами: 1x, 2x, 4x, 16x, 32x, 64x. Отсутствует слой 8x (n₃).
Усиление прибрежного шума
Применяем высокочастотный шум specifically вдоль береговой линии:
\[e_{coast} = e + \alpha \cdot (1 - e^4) \cdot \left(n_4 + \frac{n_5}{2} + \frac{n_6}{4}\right)\]
Множитель \((1 - e^4)\) создает колоколообразную кривую, пикующуюся на береговой линии (e=0).
Поле расстояний до гор
Для горных пиков предварительно вычисляем поле расстояний через топологию триангуляции Делоне с использованием BFS:
- Начинаем от треугольников с горными точками (расстояние = 0)
- Посещаем соседние треугольники, увеличивая расстояние на рандомизированную величину
- Рандомизация создает естественные формы вместо идеальных конусов
Формула приращения расстояния: \[\Delta = s \cdot (1 + j \cdot r)\] где r использует треугольное распределение для естественного вида.
Порядок обработки соседей случайно перемешивается алгоритмом Фишера-Йейтса для избежания направленных смещений.
Смешивание высот
Финальная высота комбинирует все компоненты через взвешенное смешивание.
Комментарии (17)
- Автор выбрал подход на основе графа (Voronoi) и сетки (mesh), а не шума или фракталов, для большей структурной целостности и контроля над формами рельефа.
- Основная критика существующих методов (шум, фракталы) — их недостаточный реализм и неестественность, поскольку они не моделируют геологические процессы.
- Уникальность подхода в статье — комбинация Voronoi-диаграмм с добавлением шума к расстояниям и последующим моделированием эрозии.
- Обсуждается ценность альтернативных, телеологических (основанных на моделировании процессов) методов: тектоники, эрозии, климата для достижения максимального реализма.
- Отмечается, что физически-обусловленное моделирование — это сложно и вычислительно дорого, но используется в высокоточных профессиональных инструментах.
- Упомянуто разделение алгоритмов на онтогенетические (создающие конечную форму) и телеологические (симулирующие процесс формирования).
- Подчёркивается, что выбор метода отражает то, как автор концептуализирует процесс генерации, а не подход, основанный на данных.