Генерация облаков это весело! Я расскажу как офлайн, так и во время выполнения.
Предварительно визуализированные облака
Если вы хотите предварительно визуализировать ваши облачные текстуры в автономном режиме, смотрите не дальше, чем в Photoshop (или Gimp , если хотите). Обе программы могут легко генерировать шаблоны облаков. Пункты меню имеют тенденцию перемещаться между выпусками, но в Gimp 2.8.2 основная команда, которую вы ищете, это Filters -> Render -> Clouds -> Solid Noise
. Вам нужно будет создать новое пустое изображение, прежде чем команда будет включена. Я рекомендую вам поэкспериментировать с параметрами шума, но в качестве одного примера, вот что происходит, если вы установите «Случайное семя» на 1, «Детализация» на 4, «Размер X» на 4.0, «Размер Y» на 8.0, отключите «Randomize» и «Turbulent» и включите «Tilable»:
Еще один шаг, который я определенно рекомендую, - это редактирование уровней изображения ( Colors -> Levels...
в Gimp). Перетаскивая конечные точки вокруг, вы можете эффективно изменить уровень облачного покрова с «полностью облачного» на «не облачное небо».
Другие интересные возможности:
- Используйте инструменты «Dodge» и «Burn», чтобы вручную осветлить / затемнить части изображения.
- Деформируйте изображение облака, чтобы предложить модели ветра. Попробуйте
Filters -> Distorts -> Whirl and Pinch...
команду Gimp или для большего контроля используйте Filters -> Distorts -> IWarp...
режим деформации, установленный на «Swirl». Тем не менее, сохраняйте это тонким - слишком сильное искажение приводит к размытию высокочастотных деталей изображения.
- Добавьте несколько независимых облачных слоев для имитации различных типов облаков, от тонких и тонких до больших и коротких (я уверен, что у них правильные научные названия, но, черт возьми, Джим, я программист, а не метеоролог!). В этом случае вы, вероятно, захотите сохранить каждый слой как отдельное изображение, чтобы вы могли анимировать их независимо во время выполнения.
Это действительно зависит от вашего артистического видения. Сходить с ума! Когда вы закончите, не забудьте экспортировать текстуру как одноканальное изображение в градациях серого, чтобы вы могли использовать те же данные облака для вашего цвета и альфа-канала во время выполнения.
Генерация облаков во время выполнения
Генерация неограниченного количества облачных шаблонов во время выполнения немного сложнее, но все же вполне осуществима. Это огромная тема, и она будет охватывать только широкие мазки.
По сути, вы собираетесь повторить команду Gimp «Solid Noise» в своем коде шейдера, используя функцию шума, такую как канонический шум Perlin, для генерирования бесконечных, плавных, детерминированных (опционально) периодических шумовых объемов. В вашем вопросе не было указано, на какой API рендеринга вы нацеливаетесь, поэтому я не могу здесь сказать слишком подробно; глава 26 "GPU Gems 2" описывает вариант шума Перлина в (несколько устаревшем) HLSL и CgFX, или вы можете использовать эту функцию шумов GLSL., Сэмплируя 2D-фрагмент громкости трехмерного шума, вы получаете что-то вроде команды Gimp «Solid Noise» с Detail = 0. Чем меньше расстояние между вашими выборками уровня шума, тем ниже будет частота («сглаживание») вашего шума. Чтобы повысить уровень высокочастотной детализации, начните с базовой низкочастотной диаграммы шума и добавьте дополнительные высокочастотные «октавы» шума, где каждая «октава» представляет собой отдельный фрагмент объема трехмерного шума с большим расстоянием выборки. и более низкая амплитуда. Визуальный пример этого процесса (который я нашел по Гуглингу «многооктавный шум Перлина») можно найти здесь .
В качестве огромного дополнительного бонуса, облачные текстуры, созданные таким образом, очень легко анимируются! Добавьте временное смещение к координатам образца функции трехмерного шума, и вы получите чрезвычайно убедительное движение облаков (как показано в этом видео , например). Это потому, что функция шума является плавной во всех трех измерениях; прокрутка текстуры в направлении U / V заставляет облака перемещаться вокруг планеты, тогда как прокрутка в направлении W (перпендикулярно) приводит к медленному «развитию» облаков.
Искажение облаков во время выполнения также возможно, для эффектов, подобных ураганам. На самом деле результаты могут быть гораздо более высокого качества, чем наивные фильтры деформации Gimp, что (как упоминалось ранее) может привести к чрезмерно размытой текстуре. Одна из техник, которую вы определенно хотите изучить, - это «карты потоков», описанные Алексом Влахосом из Valve ( слайды SIGGRAPH 2010 ) или Карлосом Гонсалесом из Naughty Dog ( слайды GDC 2012 ). Основная идея заключается в том, что вы рисуете векторное поле («карту потока») и используете его для искажения и прокрутки текстуры облака во время выполнения, при этом периодически пересекаясь между двумя различными текстурами облака, когда расстояние искажения становится слишком большим.
Какой метод использовать?
Предварительный рендеринг облачных текстур в Gimp / Photoshop чрезвычайно прост; Вы можете создать новую текстуру за несколько секунд, как только вы ее освоите. Код времени выполнения тривиален и очень быстр. Тем не менее, более уникальные облачные текстуры означают более высокие требования к дисковому пространству (а также, большую / более медленную загрузку) и большее использование VRAM во время выполнения.
Поначалу генерация облаков намного сложнее, но как только вы запустите его, у него будет несколько явных преимуществ перед предварительно визуализированными текстурами облаков. Вы можете создавать бесконечное множество реалистичных анимированных облачных шаблонов без использования дополнительного дискового пространства или VRAM. Тем не менее, затраты времени выполнения оценки нескольких трехмерных шумовых функций на пиксель могут быть высокими; Ваши пиксельные шейдеры в облаке будут работать намного медленнее, чем в предварительно обработанном случае.
TL; DR: определенно начните с использования предварительно визуализированных облаков и переключитесь на процедурные облака во время выполнения, если вам нужно дополнительное разнообразие (или если вам нужны дополнительные задачи программирования).