Продолжение поста «Игровая легенда из 90-х: Как работала 3dfx Voodoo "под капотом"? Пишем 3D-приложение нуля на Glide (1/2)»

Это вторая часть длинной серии о 3dfx Voodoo. Мне пришлось разделить его пополам из-за ограничения Пикабу на 30 000 символов на сообщение. Прочитайте сначала первую часть.

Скриншот с перекошенной нанесенной текстурой: сэмплер здесь уже был настроен, но неправильно. И здесь хорошо видны артефакты отсутствия Z-сортировки.

Пока не впечатляет, правда? Где текстуры? И подробнее об этом в следующей главе!

❯ Текстуры


Плоские модели без текстур — это не очень круто. Ну а что можно сделать с плоскими моделями, даже если у них есть подсветка?

Те читатели, которые имеют опыт графического программирования, наверняка знают, что видеодрайвер сам управляет видеопамятью с точки зрения аллокатора (механизма, управляющего выделением динамической памяти - то есть памяти, которая может быть выделена под объект, освобожденный а затем занят другим объектом). Программист просто создает текстуру, указывает количество мипов и загружает ее на видеокарту — теперь даже генерация мипов — задача видеодрайвера и самой видеокарты.

А вот в Glide всё было иначе — не было понятия текстуры как объекта! Как? Glide позволял нам получить верхнюю и нижнюю границы адресного пространства памяти конкретного TMU, а программист мог свободно выгружать текстуру куда угодно! Затем программист сохранял указатель на текстуру в видеопамяти и передал его.. комбайнеру, чтобы тот мог использовать текстуру по назначению! При этом TMU даже не знал характеристик текстур — эту информацию прислал программист.

TMU поддерживает множество форматов пикселей: RGB332 (8 бит на пиксель), RGB565 (16 бит на пиксель), палитру и собственный формат сжатия со сжатием NCC. Однако 565 в 3dfx требует специального формата пикселей, иначе текстуры будут мешанины. К счастью, для загрузки текстур с диска в Glide есть удобные функции и утилита texUS для создания текстур и полный набор мипов для них — gu3dfGetInfo и gu3dfLoad.

Обратите внимание: В музеях Москвы протестируют приложение для посетителей.

Кроме того, существует функция grTexCalcMemRequired для расчета необходимого размера текстуры в видеопамяти с учетом mips, формата и выравнивания.

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

https://pastecode.io/s/ruf14177

После этого нам необходимо загрузить текстуру в видеопамять устройства с помощью grTexDownloadMipMap.

https://pastecode.io/s/260k0nrr

Как теперь указать текстуру для выборки, раз glBindTexture здесь нет? Для этого есть функция glTexSource, которая принимает адрес первой конфигурации мипа и текстуры — которая хранится на стороне ЦП!

https://pastecode.io/s/6ouq99eo

Но если мы сейчас запустим программу, мы не увидим никакой текстуры. Потому что сначала надо настроить сэмплер и комбайнер!

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

Запускаем программу и вот результат:


Да, первая полностью текстурированная 3D-модель! Мы реализовали половину видеодрайвера вручную, но конечный результат все равно очень хорош! Игры здесь пока нет — материал будет слишком длинным.

❯ А где практика?



К сожалению сегодня без практической части :(Сначала я думал, что всё разобрался и моя 478 материнская плата со слотами AGP вполне справится с ролью тестового стенда для нашей демки. Однако я не учел одного важного факта - есть было несколько физических версий AGP, и 478 — это уже поздняя версия с уровнями 1,5 В/0,8 В.

Материал обещали в четверг в 11 часов, на почту заказать не успел (сейчас Новый год, посылки задерживаются на 1,5-2 недели только сортировкой в ​​Краснодаре), поэтому начал писать во всю службу провайдеров в моем городе, надеясь, что у кого-нибудь есть на складе материнская плата PGA370. в любом состоянии.

И материнская плата нашлась! Им оказался поздний ECS P6IPAT на чипсете 815 с универсальным разъемом AGP, поддерживающим все стандарты AGP одновременно. Мужичок продал его всего за 100 рублей, сразу с процессором и охлаждением :) Однако возникли определённые проблемы с поднятием платы (пришлось менять все электролиты "вокруг", а нужных значений не было в наличии, плата запустилась с 3-го раза) и накат винды (сдох IDE-диск), поэтому практическая часть немного затянулась…


❯ Заключение


И мы приходим к выводу, что для написания 3D-игры программисту в 90-х нужно было как минимум:

  1. Иметь представление о преобразовании геометрии, что такое матрицы (геометрию можно преобразовывать и без матриц, но это не очень практично).

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

  3. Иметь представление об основных методах растеризации 3D-графики: что такое разделение перспективы, Z-буферизация, форматы вершин, фильтрация текстур, мип-мэппинг, затенение Гуро, любые методы анимации, если это необходимо, и т д.


Материал получился очень объёмным, для меня это абсолютный рекорд. Я постарался собрать всю информацию о 3dfx Voodoo, которую изучал, и поделюсь с вами не только архитектурой конкретно видеокарт, но и расскажу о программировании графических API на низком уровне и подробно расскажу, как строится изображение «под hood» на вашей видеокарте.

По поводу историй о 3dfx в СНГ: лично я родился в 2001 году, поэтому могу судить только по рассказам и историям, которые слышал. Какова была ваша история с 3dfx Voodoo? Пишите в поле для комментариев!
Надеюсь, материал был вам интересен. :) Статья писалась за несколько бессонных ночей, чтобы успеть к Новому году! Больше закулисья, мыслей и проектов у меня в Telegram.

Материал подготовлен при поддержке TimeWeb Cloud. Подпишитесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи каждую неделю!

[my]ГаджетыКупить 3D-графикуГрафикаПрограммированиеC++3dfxVoodooВидеокарты90-е ЖелезоСтарое железоРетро игрыИгрыРетроYouTube Ответить на постДлинный постTelegram (ссылка) 29

Больше интересных статей здесь: Гаджеты.

Источник статьи: Продолжение поста «Игровая легенда из 90-х: Как работала 3dfx Voodoo "под капотом"? Пишем 3D-приложение нуля на Glide (1/2)».