netlib.narod.ru< Назад | Оглавление | Далее >

Обзор шейдеров

Фиксированные функции означают, что разработчики GPU запрограммировали фиксированный путь преобразования вершин (в случае видеокарт с возможностью аппаратного преобразования и освещения вершин) и выходных пикселов, жестко заданный непосредственно в аппаратуре GPU. Это поведение невозможно изменить; вы можете только включать или отключать отдельные возможности. Для ранних игр это было хорошо, потому что GPU выполнял большой объем работы и освобождал центральный процессор для других задач, а также потому что GPU визуализировал трехмерные данные быстрее, чем центральный процессор, будучи специально оптимизированным именно для рисования полигонов. Если вы слышали о «Direct3D 7.0-совместимых видеокартах», это именно то, что они могут делать; у более ранних видеокарт было похожее поведение, но в DirectX 5.0 и более ранних версиях программировать непосредственно на аппаратном уровне GPU было очень трудно из-за буферов исполнения и подобных вещей. Direct3D 7.0 упростил процесс визуализации, когда в середине 1999 года стала доступна серия видеокарт Nvidia GeForce. В ней стало возможным визуализировать полигоны с одновременным наложением нескольких текстур, использовать сжатие текстур, чтобы больше текстур помещалось в видеопамяти, использовать буферы вершин, размещенные непосредственно в видеопамяти для увеличения производительности.

История

Даже после значительных усовершенствований в Direct3D 7.0 между играми не появилось много различий, они просто заработали быстрее, могли иметь много полигонов, применяли сжатие текстур и эффекты мультитекстурирования для отображения нескольких текстур и смешивания их воедино. Настоящая революция пришла с DirectX 8 и DirectX 9. DirectX 8 окончательно удалил компонент DirectDraw и ввел вершинные шейдеры, пиксельные шейдеры и много эффектов — наложение рельефа, нестандартное наложение текстур и т.д. — но поддерживал только шейдерную модель 1.0, и сначала был не слишком легок в использовании из-за многочисленных изменений в API и необходимости писать шейдеры на языке ассемблера.

DirectX 9 добавил поддержку для HLSL (высокоуровневый язык программирования шейдеров, о котором вы узнаете в этой главе) и новые возможности для будущих видеокарт, такие как визуализация в расширенном динамическом диапазоне (HDR) и многочисленные цели визуализации, что позволило реализовать такие техники, как отложенное затенение (deferred shading). DirectX 9 стал очень популярным и многие разработчики перешли от OpenGL к DirectX только потому что сперва OpenGL не обеспечивал корректную поддержку шейдеров, а утверждения стандарта OpenGL 2.0 пришлось ждать слишком долго. Модель расширений для шейдеров, стоящая ниже, чем использование классов шейдеров Direct3D, также долго присутствовала в OpenGL, ожидая появления более совершенного механизма. Direct3D 10 снова опережает OpenGL, поддерживая модель шейдеров 4.0 и геометрические шейдеры уже больше года, в то время как OpenGL только предстоит пройти этот путь. Direct3D 10 работает сейчас только в Windows Vista, но вы можете выполнять какие-то разработки для шейдерной модели 4.0 в Windows XP с помощью расширений OpenGL. Хотя большинство разработчиков игр перейдут в ближайшие годы на Vista только ради Direct3D 10. Вопреки убеждениям некоторых людей, в DirectX 9 нет никакой поддержки шейдерной модели 4.0, а то, что называется DirectX 9.0L — это лишь способ поддержки игр под DirectX 9.0 в Vista. Мне кажется, для разработчиков игр плохо иметь так много различных версий DirectX, поддерживая DirectX 9 и отступая к старому оборудованию, способному работать только с DirectX 7 или 8, затем получить реализацию Direct3D 10 для новейших эффектов в Vista и в конце также делать вариант с DirectX 9.0 для большинства, работающего в Windows XP. Это похоже на бег с препятствиями. К счастью, для XNA эти проблемы не существуют; здесь доступна только одна версия, она поддерживает шейдерные модели с 1 по 3 (DirectX 8 и 9), и вам не надо беспокоиться о чем-нибудь еще. Все замечательно работает на Windows XP, Vista и даже на Xbox 360.

Чтобы больше узнать об истории DirectX и его взаимоотношении с версиями Windows и доступными аппаратными технологиями, взгляните на рис. 6.1. Он показывает, что версии DirectX обычно были связаны с самой новой операционной системой от Microsoft, и можно ожидать, что так будет и в будущем. DirectX 1 и 2 практически не использовались. В DirectX 3 все еще оставалась поддержка абстрактного (высокоуровневого) режима (retained mode), но он не применялся разработчиками игр и в последующих версиях был объявлен устаревшим. DirectX 5 вышел вместе с Windows 98 и использовался более широко (версия DirectX 4 была пропущена). DirectX усовершенствовался почти каждый год, пока не достиг версии DirectX 7, которая повсеместно использовалась, и одновременно, год за годом, все быстрее становилось графическое оборудование. Вместе с Windows XP был выпущен DirectX 8 и впервые были представлены шейдеры. Полгода спустя стал доступен DirectX 9, существующий сейчас во многих версиях. В первые годы (2002, 2003, 2004) Microsoft добавляла к названию каждой новой версии новую букву (DirectX 9.0a, DirectX 9.0b и т.д.), и каждая новая версия позволяла использовать новую шейдерную модель и новейшее графическое оборудование. После версии 9.0c этот процесс переименования остановился, но было выпущено очень много вариантов DirectX 9.0c (на данный момент 11), и между их выходом иногда проходило лишь несколько месяцев. Бета-версия Direct3D 10 была представлена в конце 2005 года, а окончательный вариант вышел вместе с Windows Vista в начале 2007. Видеокарты с поддержкой шейдерной модели 4.0 доступны на рынке с конца 2006 года (Nvidia GeForce 8800).


Рис. 6.1

Рис. 6.1


Шейдеры повсюду в XNA

Вы уже видели в предыдущей главе, что шейдеры являются основой для визуализации чего-либо в XNA; без шейдера, выводящего пиксели на экран вы не сможете нарисовать даже простую линию. Уверен, вы сможете использовать классы спрайтов для двухмерной графики интерфейса и, возможно, сумеете использовать класс SimpleEffect для отображения каких-нибудь трехмерных данных, но я не люблю класс SimpleEffect и вообще не использую его в этой книге. Я думаю, что он слишком сложен для использования и в нем нет тех преимуществ, обеспечиваемых возможностью писать собственные шейдеры, которые будут проще, быстрее и более гибкими. Использование простых эффектов означает, что вы пользуетесь предопределенными возможностями, и если вам понадобится что-то большее, вам все равно придется начать писать собственные шейдеры. В последующих играх из этой книги вы будете в основном использовать шейдер наложения нормалей для отображения трехмерных данных, а затем некоторые крутые шейдеры постэкранных эффектов для манипуляций с итоговым изображением, выводимым на экран. Все эти шейдеры невозможно реализовать, используя класс SimpleEffect.

Если вы раньше работали с OpenGL или DirectX и пользовались только фиксированным конвейером функций, то можете недоумевать, зачем надо так много усилий тратить на шейдеры и почему нельзя просто визуализировать некоторые трехмерные данные на экране, как делалось до сих пор. Да, написание кода стало несколько труднее, и, хотя вы могли в DirectX визуализировать модели .x почти ничего не зная о матрицах и внутренних принципах работы GPU, вам не удастся внести в визуализацию значительные изменения, если вы не разберетесь в деталях. Возможно, изучить все о шейдерах трудно, но, по крайней мере, вы более тесно познакомитесь с графическим оборудованием, лучше поймете как полигоны визуализируются на экране, почему могут происходить ошибки и как быстро исправить их.

После следующих двух глав в этой книге больше не будет разговора о шейдерах, и вы, возможно, не будете тратить в своих играх слишком много времени на шейдеры, после того, как в начале сделаете наиболее важные из них. Затем вы будете только использовать шейдеры, и вам даже не придется больше задумываться о них.

И в конце я хочу упомянуть еще одну вещь — увеличение объема работы в связи с использованием шейдеров. Не только вы, как программист, должны знать все о шейдерах, хотя вы, вероятно и напишете большинство из них, если только в вашей команде нет «шейдерного мальчика», но и художники (надеюсь, что это не снова вы) должны быть знакомы с шейдерами. Например, использование шейдера наложения нормалей для увеличения реализма вида объектов как в последних играх (например, Doom 3) имеет смысл только если ваши трехмерные данные содержат не только базовую геометрию, но и предоставляют карты нормалей, необходимые для осуществления этого эффекта.

Не забегая вперед до следующей главы, где эффект наложения нормалей обсуждается более подробно, отметим, что вам обычно нужна высокополигональная версия (с несколькими миллионами полигонов) трехмерного объекта и низкополигональная версия (всего из нескольких сотен или тысяч полигонов) для визуализации. Как видно на рис. 6.2, низкополигональный объект без применения наложения нормалей выглядит плохо, но когда эффект активирован (смотри справа), вид сферы значительно улучшается.


Рис. 6.2

Рис. 6.2


В качестве альтернативы созданию высокодетализированной модели, которое обычно требует много работы, вы можете также использовать программу рисования, чтобы «нарисовать» вашу карту нормалей, сперва нарисовав карту высот, а затем сконвертировав ее в карту нормалей. Обычно такие карты выглядят более грубыми, и с таким подходом вы никогда не достигнете качества графики ведущих игр, но время от времени вы будете видеть, что реализация карт нормалей таким способом экономит деньги. В любом случае, ваш художник должен знать обо всех новых техниках и вы должны подумать о способах создания содержимого перед тем, как начнете писать ваш движок или игровой код.

Примеры игр

Если вы хотите увидеть шейдеры в действии, просто поиграйте в какую-нибудь из последних игр, — почти все они поддерживают шейдеры и, даже если вы не увидите наложения нормалей или постэкранных эффектов, шейдеры могут использоваться для эффективной визуализации трехмерных моделей или выполнения техники наложения теней.

Трехмерные игры с видом от первого лица, такие как Doom 3, Half-Life 2, Far Cry и более поздние Fear, Ghost Recon и Gears of War демонстрируют действительно первоклассную графику и великолепные примеры использования шейдерных эффектов. Они извлекают выгоду из большинства новых графических технологий, поскольку вы видите окружающий мир во многих деталях. Во-первых, вы видите себя, или, как минимум, свое оружие, затем, в закрытых помещениях, вы видите стены и окружающие объекты на близких расстояниях, а есть еще большие комнаты и открытые пространства, где вы можете видеть предметы на дальних расстояниях. Это означает, что уровни обычно большие, и вы можете рассматривать что угодно вблизи и перемещаться там, где вам хочется. Очевидно, видеокарты, особенно старых моделей, не в состоянии хранить так много деталей в видеопамяти и просто накладывают одну большую текстуру на весь трехмерный уровень или повсеместно используют одну и ту же текстуру для стен, что не является хорошим вариантом. Вместо этого разработчики игр думают о множестве замечательных техник для улучшения визуального качества путем использования карт детализации, применения наложения нормалей, чтобы игроку геометрия казалась более детализированной, и смешивании в постэкранных эффектах, делающем общий вид игры более реалистичным.

Другие игры, такие как стратегические или ролевые, тоже используют преимущества шейдеров, но чтобы заметить это необходим более пристальный взгляд, поскольку даже при наличии шейдеров эти игры более фокусируются на самом игровом процессе, том, как визуализировать одновременно как можно больше подразделений или проблемах управления камерой.

В любом случае, вы, вероятно, хотите, чтобы и в вашей игре были шейдеры, и, если вы взглянете на экран игры Rocket Commander (рис. 6.3), то увидите результат работы наложения нормалей и постэкранных шейдеров. С отключенными шейдерами (экран слева) игра выглядит достаточно скучно и астероиды не кажутся реалистичными, поскольку освещение работает неправильно. Пожалуйста заметьте, что версия без шейдеров предоставляется только как вариант для поддержки старых видеокарт; игра с самого начала проектировалась с мыслью о шейдерах. Можно сделать и лучший снимок экрана для версии с фиксированным конвейером функций, но реальная игра выглядит еще более нереалистично, если освещение не меняется и если отсутствуют постэкранные эффекты.


Рис. 6.3

Рис. 6.3


Чтобы увидеть еще лучший пример различий между использованием шейдеров и фиксированным конвейером функций в играх, взгляните на водные поверхности в трехмерных играх. За последние несколько лет техники изображения водных поверхностей так эволюционировали, что сейчас их трудно отличить от настоящих.

Если вы хотите увидеть больше примеров из игр, или вам нужны более подробные инструкции, я рекомендую посмотреть мой видеоурок Rocket Commander Video Tutorials, который вы найдете на сайте www.RocketCommander.com. Либо вы можете посмотреть видеоурок XNA Racing Game Video Tutorials на www.XnaRacingGame.com. там будет больше ссылок на полезные сайты, посвященные шейдерам, больше снимков экрана и т.д.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz