Обложка. |
Название Грег Снук «3D-ландшафты в реальном времени на C++ и DirectX9»
Издательство Кудиц-Образ, Москва, 2006
Прилагается CD
Системные требования Windows2000/XP, 1GHz, 128 MB, 500 MB на жестком диске, видеокарта не ниже GeForce3 или ATI Radeon 8500, компилятор Microsoft Visual Studio.NET
Очень многие люди писали о книгах, изменивших их жизнь. Как правило, эти книги круто меняли их жизненный путь, вовремя попав в руки. Данная книга в руки мне вовремя не попала и попасть не могла — к тому времени, как она вышла на английском (2003 год), я уже несколько лет не занимался программированием трехмерной графики. Так что значительную долю приводимых рецептов я был вынужден тогда изобретать сам. Или не изобретать, что хуже. Так что тут у меня есть с чем сравнивать.
На заметку: трехмерные движки испокон веков делились на предназначенные под показ помещений (indoor), и на позволяющие показывать обширные поверхности (outdoor). Основная логика первой категории движков мало изменилась со времен Quake I, если не Doom. А на открытых пространствах перемен больше.
Вначале была серость... |
Надо сказать, что трехмерная графика — одна из немногих областей программирования, в которой знания математики достаточно актуальны, хотя много их все равно не надо — программы первого курса хватит за глаза. Математика в книге в необходимых пределах освещается в самом начале всего в одной главе. Базовые операции, впрочем, самому воплощать не придется — они давно уже реализованы в библиотеке D3DX, входящей в поставку DirectX. Еще 3 главы, в том числе глава, посвященная языку шейдеров и общей концепции разрабатываемого движка — и начинается самое интересное.
Как известно, быстрее всего движок рисует то, что он рисовать и не пытается. Даже в наши времена быстрых видеокарт количество полигонов в убедительно выглядящем рельефе побольше, чем в большинстве прочих моделей, хотя модели потихоньку подтягиваются, а кое-где и превосходят. Для того, чтобы поставить разумные ограничения на рельеф, можно либо отсекать его по расстоянию (так в свое время делал я), либо использовать древовидное разбиение пространства — как правило, четверичные и восьмеричные деревья.
Определение: четверичные деревья (не нравится мне термин «квадрадеревья») — это способ разбиения плоскости на квадраты, в каждом из которых опять-таки выделяется 4 квадратные части — и так несколько раз. Очень удобно: если мы не пытаемся рисовать квадрат побольше, то все квадраты поменьше, входящие в его состав, тоже в расчет можно не принимать. А восьмеричные деревья — то же самое, только для кубов.
Но ландшафт — это в некотором смысле синоним слова «рельеф». Который надо задавать уже для выделенных квадратов (или кубов). Для начала — прямоугольной сеткой. И должен этот рельеф быть достаточно гладким — иначе никто из игроков не поверит, да и, к примеру, лошадь, стоящая левой задней ногой на одиноком пике с тремя остальными ногами, болтающимися в воздухе, вызовет у зрителей странное непонимание. Поэтому идея случайного ландшафта в чистом виде, как правило, не работает. Но есть несколько способов получить правдоподобную карту. Один из таких методов, подробно описанный в книге — шум Перлина.
Это интересно: в 1997 году Кен Перлин, изобретатель этого метода, стал лауреатом премии «Оскар» за вклад в киноиндустрию.
Какое небо, какие облака! Это в Microsoft хорошо умеют. |
Для почти естественного вида остается немного — поверхность должна освещаться без резких границ между треугольниками. Для этого надо вычислить нормали — и вот она, сетка.
Впрочем, сетка — это только полдела. И действительно, еще полкниги впереди.
Еще раз вспомним об экономии. Зачем нам треугольники одного размера вблизи и вдали? Вблизи может захотеться (и обязательно захочется) подробностей, а вдали эти подробности — пустая трата ресурсов. Главы 7 и 8, рассказывающие об этом — одни из самых интересных и важных в книге. Надо сказать, что лет 5-6 назад готовых реализаций этой техники мне не попалась, а свою я сделать не успел — и облизывался на статью, где она описывалась.
Вечер трудного дня |
Надо отдать автору должное: он честно описывает не только пироги и пышки, но и синяки и шишки в тех случаях, когда предлагается несколько вариантов. В классическом варианте по категории шишек проходит то, что в каждом кадре рельеф одного и того же участка имеет шанс получиться уникальным. И, что хуже — с дырками.
Теперь можно сделать следующий шаг — и покрыть поверхность текстурой. Вот при чтении этой главы было мне очень обидно — часть возможностей для красивого текстурирования была недоступна, а другие идеи очень просты, и тут уже обидно, что не я до них не додумался. Проблема, как все догадываются — в гладкой стыковке разных текстур так, чтобы стыки не были прямолинейными. Тут уж позвольте секреты не раскрывать и книгу близко к тексту не пересказывать — прочитаете и узнаете.
Склоны кое-где поросли травой. |
Теперь, когда земля достигла совершенства, можно приблизиться к реальности еще и еще. И сначала посмотрим вверх. Да-да, на небо. Которое — хотя и называется по-английски sky box — все-таки гораздо лучше смотрится, когда за основу берется не коробка, а сплющенная полусфера. Причина этому достаточно очевидна: на параллелепипеде достаточно трудно сделать равномерное движение облаков. А при выборе несплющенной полусферы облака будут поворачиваться перпендикулярно горизонту, чего в реальности не бывает.
После облаков — очередь солнца, пейзаж закатный от пейзажа дневного или ночного отличается весьма и весьма. А уж если еще и учесть рассеяние лучей сквозь облака — а способы сделать это тоже описываются — то мир покажется практически готовым к тому, чтобы заселить его.
Для начала — деревья и травы. Деревья изображаются либо как трехмерные модели разной степени детализации, либо — на большом расстоянии — плоские объекты, перпендикулярные камере. А трава моделируется в виде ряда частично прозрачных концентрических оболочек, рисовать травинки поштучно не могут даже самые современные видеокарты. Заодно — как и во всех главах, впрочем — мы узнаем, как избежать типичных дефектов изображения.
Ну, откуда берется нужная им вода — тоже описано, но уже в следующей главе. Казалось бы, чего проще — задать уровень моря и провести плоскость? Но такая вода не будет смотреться естественно — в реальности волны бегут даже при малейшем ветерке. А еще океан должен быть безграничным.
Вот он, путь в открытое море! Но путеводитель на этом заканчивается. |
А уж про то, как запустить в воду дельфинов, вам уже рассказывали — в пакете LKICreator это был один из ранних уроков. Так что автору можно простить, что про это он не сказал ни слова.
Надо сказать, что автор о производительности все время помнит. И совершенно верно делает: примеры из последних глав книги на видеокарте — ровеснице книги начинают подтормаживать.
На диске, прилагаемом к книге, ничего сенсационного не содержится: исходные коды примеров (в самой книге откомментированы только ключевые места) и примеры, готовые к запуску, требуемые модели и — самое интересное — DirectX SDK. Но про DirectX SDK я еще надеюсь рассказать отдельно.
И под занавес отмечу, что хотя книга вышла на английском уже 3 года назад, она до сих пор актуальна — новая, поскольку все еще актуален и еще некоторое время останется таковым DirectX 9.