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