Тайны первых 3D-игр: как устроена была графика в проектах 90-х
Вы когда-нибудь задавались вопросом, как создатели 3D-игр 90-х умудрялись добиваться эффектной картинки на крайне скромном железе? Достаточно вспомнить NFS High Stakes, Quake 3, Unreal или Jurassic Park: Trespasser: при всей простоте тогдашних технологий они выглядят потрясающе. Там были и зеркала, и отражения на металле, и продвинутое статическое освещение с рейтрейсингом, и даже чёткие тени…
…но далеко не все знают, что на видеокартах уровня 3dfx Voodoo 2 всё это достигалось благодаря хитроумным приёмам, хакам и особенностям тогдашних ускорителей. В этой статье мы из первых рук разберём такие техники на практике: писать 3D-демки и игры для ретро-железа — одно из моих хобби.
О железе
Начать, конечно, стоит с аппаратной базы, на которой в те годы запускались 3D-игры. Типичный компьютер середины девяностых выглядел примерно так:
-
Процессор — Intel 386/486 с тактовой частотой 16–50 МГц и аналоги от AMD/Cyrix в более бюджетных конфигурациях; Pentium 66 и 133 встречались в машинах побогаче.
-
Оперативная память — 4–8 мегабайт в недорогих сборках и 16–32 в более дорогих.
-
Видеокарта — обычный VGA-адаптер без 2D-ускорения либо 2D-ускоритель вроде S3 Trio с аппаратным блиттингом. Ускорять 3D такие карты не умели.
-
HDD — от ~100 до 500 МБ в бюджетных системах и порядка 1 ГБ в некоторых дорогих.
О 3D-ускорении на домашних ПК тогда оставалось лишь мечтать, но многие разработчики всё равно выпускали полноценные 3D-игры и демки, пусть и не слишком сложные графически: просто мир в них рисовал процессор. Этот подход получил название Software rendering, а возможным его сделало появление FPU в x86-процессорах — роскоши, о которой большинству чипов на ARM/MIPS приходилось У программного рендеринга были и достоинства, и недостатки. Главное достоинство в том, что, в отличие от ранних видеокарт, здесь не было фиксированного конвейера: разработчик реализовывал отрисовку так, как считал нужным, и мог по сути встроить «шейдеры» прямо в функцию растеризации треугольника. Второй важный плюс — «бесплатный» прямой доступ к буферу кадра, благодаря которому легко делались разнообразные постэффекты вроде LUT, размытия или капель дождя на стекле. Были, однако, и минусы, причём главный из них — колоссальная нагрузка на процессор, растущая вместе с разрешением игры. В 320×200 Pentium 66 ещё как-то справлялся с несложной сценой без значительного овердроу (как в Quake 1), но на 640×480 и 800×600 частота кадров падала до однозначных значений. Второй недостаток вытекает из первого: во многих играх не было ни фильтрации, ни перспективной коррекции текстур, из-за чего полы и стены под определённым углом начинали искажаться. Overdraw — доля отрисовки поверхностей, которые перекрывают фрагмент, уже нарисованный ранее. Простой пример: мы сидим в доме и смотрим на стену. Если игра сначала нарисует ландшафт за домом, затем забор, затем качели за забором и лишь после этого стену прямо перед нами — это и есть Overdraw. Некоторые игры умудряются рисовать за кадр практически весь уровень, и это сильно бьёт по филлрейту. В Quake-подобных играх такой проблемы не было: там работал хитрый PVS-куллинг, отсекавший даже те стены, что находятся прямо за стеной, на которую мы смотрим. Первой 3D-видеокартой для ПК стала STG2000 (она же Diamond Edge 3D), вышедшая в 1995 году на чипе NV1 — первом видеочипе Nvidia. По сути, NV1 был мультимедийным комбайном: один чип объединял 3D-ускоритель, 2D-ускоритель, аудио- и MIDI-контроллер и даже контроллер геймпадов Sega Saturn. Всё было бы замечательно, но чип от Nvidia работал не с привычными треугольниками, а с квадами и хитрой схемой представления текстурных координат. Портировать на него игры, написанные для «треугольных» софтрендеров, было слишком сложно: приходилось переделывать всю геометрию (а значит, и переучивать 3D-моделеров). Большинство разработчиков не стали возиться, NV1 провалился и едва не разорил молодую Nvidia. Уже через год, в 1996-м, вышла первая 3dfx Voodoo, перевернувшая мир 3D-игр на ПК. Это был первый по-настоящему полноценный 3D-ускоритель: он реально разгружал процессор и позволял рендерить игры в заметно более высоком разрешении с приличным FPS — теперь можно было замахнуться не только на 640×480, но и на 800×600 в 16-битном цвете! Важный нюанс: Voodoo был именно ускорителем. Технически он умел лишь растеризовать треугольники, интерполировать цвета, накладывать на них текстуры и добавлять туман; вершинного конвейера, клиппинга и освещения у него не было — всё это ложилось на

Что такое Overdraw?

