Графика видеоигры Quake 1 на экране Hitachi V-422
На работу над этим проектом Пекку Вяанянена вдохновили ролик с демонстрацией рисования на экране осциллографа гриба и широко известный Youscope. Если подобное возможно, то почему бы не вывести на экран трёхмерную графику?
Рисование на осциллографе происходит в режиме XY, в котором напряжения определяют координаты точек на экране. Их достаточно варьировать как функцию времени, чтобы рисовать линии. При этом скорость изменения нужно оставлять примерно одинаковой, иначе будут получаться линии с различной яркостью. Согласно отличному руководству от Джеда Марголина, особой точности в определении длины линии не нужно. Чтобы нарисовать не связанный с предыдущим сегмент, луч нужно быстро сдвинуть, не оставляя видимой линии.
Для начала в Processing Пекка создал простую симуляцию режима XY осциллографа. Youscope отлично отрендерился после добавления особенностей работы люминофора.
Для вывода использовался аудиовыход компьютера — вполне типичное решение, которое бралось для того же Youscope.
Quake — это игра 1996 года, которая исполняется очень быстро на современном «железе». И генерацию сигналов тоже лучше сделать быстрой. Сначала выбор пал на ASIO SDK, но после пары вечеров попыток Вяанянен решил использовать PortAudio, который отлично подошёл для задачи. Впрочем, библиотека без «плясок с бубном» не скомпилировалась.
Все из доступных звуковых карточек применяли фильтр нижних частот, поэтому пропускная способность была ограничена. Это означает, что получается отрисовать меньше линий, чем в Youscope, у создателя которого нашлась звуковая карта с нужными характеристиками. Не слишком помогло и увеличение частоты до максимально доступных 96 кГц.
Процесс генерации разбит на две части: игровой движок Darkplaces и синтезатор аудиосигнала, которые «общаются» друг с другом посредством WinAPI под названием pipe.
Модификация Darkplaces оригинального движка Quake предоставляет детали геометрии, в частности, передавались рёбра треугольников. Брались не все, из общего числа отфильтровывались только видимые и не являющиеся дубликатами друг друга.
Аудиопоток имеет очередь линий для отрисовки, которые запрашиваются из движка игры. Затем в своём собственном темпе процесс работает над отображением этих линий, выдавая 32-битный поток данных частотой 96 кГц.
В среднем за кадр передаётся 1800 линий. Если новых данных нет, то будет отрисован предыдущий кадр. За каждую линию на демонстрации отвечает 5—20 сэмплов. Качество картинки увеличивается с замедлением отрисовки.
Генерация аудиосигнала отнимает процессорную мощность, но большая часть тратится на растеризацию буфера глубины движка игры. За счёт подбора параметров сигнала конечная производительность и величина времени запаздывания позволяют комфортно играть с помощью клавиатуры и мыши, а не просто проигрывать демки.
Как пишет Вяанянен, производительность всё равно осталась на неудовлетворительном уровне. Максимально получается одновременно отрисовывать меньше 1000 линий. Большее количество требует болеее высокой частоты звука, чем это может предоставить текущий аудиовыход.
Ускорение отрисовки снижает качество картинки, а если оставлять больше времени на каждую из линий, то будет страдать отклик.
Также появляется низкочастотный шум, особенно заметный при быстрых движениях, когда обновляется весь экран. Возможно, это от увеличения уровня басов эквалайзера в аудиокарте, но автор проекта не уверен в своей догадке.
Ознакомиться с данными можно на странице отчёта. В статье использованы изображения с сайта lofibucket.com.