История 3D-графики в компьютерных играх
Давным-давно, когда воздух был чистым, деревья - высокими, а небезызвестная Корпорация еще не монополизировала рынок операционных систем, появились первые компьютерные игры...
Естественно, тогда трехмерной графикой даже и не пахло: первые игрушки были абсолютно плоскими и создавались в основном для игровых автоматов. Затем появилась изометрия, которой, кстати, до сих пор находят применение в играх. Но о трехмерной графике, с которой знакомы мы с вами, задумались где-то в 80-х годах XX века, хотя, говорят, уже в 70-х некоторые энтузиасты работали с wireframe-каркасами. Самой первой трехмерной игрой, использующей каркасную графику, была Battlezone (Atari, 1980 г.). В дальнейшем же появились реализации, работающие с затенением граней, правда, по скорости они здорово уступали спрайтам, и их использование могло быть оправдано только в случае, когда полигональных моделей было совсем немного. Прародителем современных 3D-игр считается I, Robot от той же Atari (1983 г.). В середине 80-х появилась первая игра линейки Microsoft Flight Simulator, что вполне закономерно: рисовать надо только несколько самолетиков и плоскую землю. Зато вовсю используется третье измерение. Нужно ли говорить, что игра пользовалась большой популярностью? Чисто полигональные движки тогда практически не использовались, наряду с полигональными моделями широко применялись спрайты, так что "полного 3D" еще не существовало. Наиболее ярким примером сочетания полигональных и спрайтовых объектов является игра Alone in the Dark (это уже 1992 год), впрочем, эта технология применяется и сегодня (хотя уже достаточно редко).
В том же 1992 году стараниями небезызвестной компании id Software свет увидел первый шутер от первого лица (FPS) - Wolfenshtein 3D. Хотя на самом деле Wolfenshtein'у предшествовала игра Catacomb Abyss, но почему-то она оказалась забыта игроками. Впервые была применена перспектива, благодаря чему объекты уменьшались, отдаляясь от игрока. Впервые (в отличие от Microsoft Flight Simulator или F-19) в этих играх применяется текстурирование - вместо однотонных граней используются масштабируемые растровые изображения. Сердцем тогдашних компьютеров был 386-й процессор, а видеокарты отвечали только за вывод на экран монитора непосредственно кадра, не проводя никаких дополнительных вычислений. Через год происходит очередной прорыв: появляется DOOM. Теперь игрок перемещается по полностью трехмерному уровню, правда при этом монстры по-прежнему остаются спрайтовыми, но все-таки эффект присутствия становится достаточно ощутимым, игра на самом деле затягивает. А настоящий переворот в области игровой трехмерной графики происходит в 1996 году - выходит Quake от все той же id Software. Теперь полностью полигональный движок становится реальностью, появляется множество новых технологий, например, Z-буфер, а текстурирование уже подразумевается как нечто само собой разумеющееся. Правда, впервые Z-буфер был опробован еще в DOOM, но теперь он становится стандартом. Кстати говоря, незадолго до этого (1995 г.), свои первые неуверенные шаги делает Game SDK, разработанный Microsoft для Windows 95. По сути, Game SDK - первенец в линейке DirectX. В это же время получает распространение среди программистов графический стандарт OpenGL (разработчик - Silicon Graphics совместно с Sun Microsystems), изначально разработанный для CAD-систем еще в 1992 году.
Тогда же (точнее, немного позднее - в 1997 году) появляются первые видеокарты с 3D-ускорением - Voodoo Graphics от 3Dfx (представитель первого поколения видеокарт). Наряду с DirectX (в 1996 г. выходит уже DirectX 2) для написания игр с аппаратным ускорением трехмерной графики используется интерфейс Glide все той же 3Dfx. Надо ли говорить, какой популярностью среди игроков (и разработчиков игр) пользовался 3D-ускоритель: адаптер мог обрабатывать до 1 миллиона треугольников и 45 миллионов пикселей в секунду, полностью брал на себя вычисления, относящиеся к 3D-сцене. Достаточно интересным было подключение Voodoo к компьютеру: так как 2D-часть на акселераторе полностью отсутствовала, для работы была необходима еще и обычная видеокарта, которая подключалась к ускорителю. Совместное использование 3D- и 2D-карт было существенным недостатком, поэтому сразу после Voodoo Graphics выходит Voodoo Rush, сочетающая в себе оба модуля. Впрочем, качество этой карты оставляло желать лучшего, поэтому она не смогла завоевать признание игроков.
Вскоре (1998 год) выходит игра Unreal (Epic Megagames). В играх используются все более и более изощренные технологии (например, микрофактурные текстуры и прозрачность), рынок видеокарт с 3D-ускорением резко расширяется: на арену выходят nVidia, Maxtor, S3, а через некоторое время и ATI. Например, еще в конце 1997-го nVidia выпускает первый видеоадаптер, сочетающий в себе 2D- и 3D-ускорители, и при этом превосходящий по производительности Voodoo - nVidia Riva128.
В конце того же 1998 года выходит DirectX 6, позволяющий разработчикам использовать новые технологии: stencil, W-буфер, мультитекстурирование и многое другое. 3D-технологии развиваются с невообразимой скоростью, революция следует за революцией. В конце 1999 года выходит DirectX 7 - очередной прорыв. На этот раз появляется аппаратный T&L (Transforms and Lighting) - модуль, отвечающий за преобразование геометрии и аппаратный рассчет освещения. За ускорение 3D-графики отвечают видеокарты третьего поколения. Постепенно оттесняя 3Dfx, лидером в производстве 3D-ускорителей становится nVidia. С появлением RivaTNT2 в 1999 году nVidia отказывается от поддержки API Glide.
Начало нового тысячелетия оказалось очень символичным: на рубеже веков были практически переломлены основные принципы построения трехмерной графики в видеокарте. На смену фиксированному конвейеру приходит программируемый, широкое распространение приобретают шейдеры. В конце 2000 года исчезает легендарная 3Dfx (компания была куплена ее главным конкурентом - nVidia).
Итак, для чего же были разработаны шейдеры? Дело в том, что в предыдущих поколениях за поддержку того или иного эффекта (например, тумана) отвечало ядро видеокарты, а точнее его TCL-блок (Transforms Clipping Lighting - трансформация, отсечение и освещение), поэтому введение новых эффектов происходило очень медленно - было необходимо ждать очередного поколения видеокарт, в которых этот эффект поддерживается. Кроме того, нужно было постоянно расширять сам графический чип и переписывать драйвера, что добавляло хлопот производителям "железа". Вполне логичным шагом была замена фиксированного TCL-блока программируемым. Если точнее, то TCL заменяется вершинным шейдером, а кроме него существуют также пиксельные шейдеры, которые изменяют процесс обработки текстур. Это значит, что каждый разработчик может контролировать процесс обработки видеокартой данных о 3D-сцене и изменять его, чтобы добавить какой-нибудь новый визуальный эффект.
Именно версия поддерживаемых шейдеров становится основным отличием между видеокартами следующих поколений: шейдеры появляются в 3D-ускорителях четвертого поколения, например nVidia GeForce 4 или ATI Radeon 8500, и поддерживаются в DirectX 8. Следующее поколение - вершинный и пиксельный шейдеры версии 2.0 и DirectX 9. Примерами видеокарт этого поколения являются ATI Radeon 9600 или nVidia GeForce FX 5800. Бурное развитие языка программирования шейдеров высокого уровня для Direct3D и OpenGL 2.0 привело к практически полному отказу от использования ассемблера в описании шейдера. Были разработаны специальные языки программирования шейдеров: Cg (не заработавший, правда, особой популярности), HLSL от Microsoft (впоследствии ставший частью DirectX 9) и GLSL от SGI, являющийся аналогом HLSL, разработанным для OpenGL.
В эпоху DirectX 9 для соответствия спецификациям требовалась лишь поддержка шейдеров 2.0. Сами разработчики за три года «додумали» столько, что DirectX 9.0с и 9.0а отличались такими «мелочами», как HDR, новые типы фильтрации, использование геометрических шаблонов и т.д. И все это кардинальным образом смогло изменить реализм трехмерной графики. Однако отсутствие жесткой стандартизации на уровне API привело к тому, что многие возможности пришлось снова поддерживать на уровне приложений, а это вылилось в проблемы с совместимостью, потери производительности и др.
Пожалуй, главное новшество, положенное в основу DirectX 10, – максимальное недопущение «вольностей» со стороны производителей GPU из-за специфики структуры нового набора шейдеров 4.0. В результате многочисленные надстройки, придуманные производителями, ушли в прошлое. Предусматривается использование полностью программируемых универсальных шейдеров при отсутствии разделения на вершинные и пиксельные, как это было раньше. Также добавлен новый тип шейдеров – геометрический, промежуточный между вершинным и пиксельным. Он дает возможность производить манипуляции над уже определившимся массивом треугольников после окончания работы вершинного шейдера и, самое главное, допускает произвольное изменение их геометрии.