Я хотел бы исследовать растеризацию в реальном времени на основе программного обеспечения. Я знаю, что сейчас все идет к GPU, но есть несколько игр, в которых все еще имеет смысл использовать программный рендерер.
Например: Воксельтрон
Voxatron - это стрелялка на арене, которая происходит в мире, сделанном из вокселей (маленькие кубики, вроде того). Все в игре отображается на виртуальном дисплее вокселя 128x128x64, включая меню и инвентарь игрока. Если вы присмотритесь, вы можете иногда увидеть, как инвентарь (счет / жизнь / боеприпасы) отбрасывает тень на некоторые объекты на земле.
Я уже давно работаю над инструментами рендеринга и моделирования вокселей, с конечной целью создания большой приключенческой игры. Около полугода назад это слилось с работой, которую я выполнял на арена-шутерах для Conflux, и это результат.
Это довольно простая игра в глубине души - в основном просто Роботрон в трехмерном разрушаемом мире с тупыми существами. Я не уверен, насколько серьезными будут последствия разрушаемости для игрового процесса, но, конечно, весело отрывать куски стены. Я также добавил экспериментальный пикап для строительства стен, который вы можете использовать, чтобы построить барьеры, чтобы спрятаться от страшных монстров.
Действие игры разворачивается на небольшом наборе арен. В некоторых из них есть комнаты с установленными боевиками, где-то между Knightlore и Smash TV. Это некоторые из оригинального приключенческого дизайна, подкрадывающегося назад, и предлог для создания тематической среды.
Функции:
- Пользовательский программный рендеринг с мягкими тенями.
- Встроенный синтезатор звука и музыки (также используется для создания трейлера музыки).
- Воспроизведение и запись после игры.
Ответы:
Я предполагаю, что вы уже знаете некоторую базовую линейную алгебру, к которой относятся: трехмерные проекции, настройка камеры, преобразование вершин в мировое положение и т. Д. Если нет, есть много замечательных мест, где можно поучиться. Вот два, которые мне нравятся:
Архитектура игрового движка
Рендеринг в реальном времени
Как только вы узнаете, как представлять и обрабатывать трехмерные объекты, вы готовы посмотреть, как вывести их на экран. Обычно это делается с помощью метода растеризации треугольника линии сканирования. На самом деле это довольно простая концепция. Вы рисуете одну строку одного треугольника за раз, интерполируя координаты цвета и текстуры. Этот процесс продолжается для всех треугольников на экране. Вы могли бы даже реализовать буфер глубины для обработки не по порядку рендеринга.
Это рассматривается более подробно в этих статьях:
Учебное пособие - Введение в программный рендеринг: треугольная растеризация
Школа визуализации программного обеспечения: часть I
И просто для удовольствия, проверьте следующую статью:
Обзор исходного кода Quake 2 3/4 (Software Renderer)
источник
Это довольно широкая тема. Однако в нем есть две основные части: действительная теория конвейера преобразования и растеризации графики и фактические биты реализации, которые позволяют перемещать пиксели на экране по вашему выбору. Помимо этого, есть также оптимизация (особенно последнего бита).
Первая часть, к счастью, такая же, как теория, используемая для графического конвейера, представленная современным оборудованием и API. Если вы уже знаете это, все готово. Если нет, я рекомендую хорошую книгу. Это довольно хорошо.
Есть много вариантов для второй части. Они сильно зависят от вашей ОС и выбора набора инструментов. Если вы используете C или C ++, в Windows вы можете просто отобразить пиксели непосредственно в растровое изображение GDI (
SetPixel
это просто, но мучительно, бесполезно медленно -CreateDIBSection
дает вам кусок необработанных байтов, которыми вы можете манипулировать с гораздо большей скоростью).Вы также можете приобрести поверхность DirectDraw и записать в нее, или записать в текстуру Direct3D или OpenGL. В этих последних случаях вы по-прежнему будете использовать аппаратное обеспечение, но пока вы сами создаете всю композицию окончательного изображения на ЦП и просто используете аппаратные API-интерфейсы для копирования результатов на экран, это все равно имеет значение. На современных ПК вы все равно не можете получить доступ к сырой VRAM или чему-либо напрямую.
Если вы хотите узнать больше, вам, вероятно, следует создать более конкретные вопросы. Я или другие были бы рады ответить на них.
источник
Хорошо, я подойду к этому вопросу с самых основ; все, что выходит за рамки этого, является широким для простого QA; вам нужно купить книгу на эту тему.
Основное различие между рендерингом в программном обеспечении и использованием графического процессора сводится к построению пикселей. То есть, когда вы выполняете программный рендеринг, вы несете полную ответственность за построение каждого чертового пикселя, тогда как в графическом процессоре графическое построение пикселей в значительной степени автоматизировано аппаратным обеспечением, и вы просто «массируете» конвейер пикселей с помощью шейдеров.
Например, подумайте о том, что вам, программисту, нужно сделать, чтобы вывести на экран трехмерный треугольник. С графическим процессором вы в значительной степени просто указываете аппаратному обеспечению, что такое координаты X, Y, Z вершин, а затем видеокарта заполняет все пиксели на экране, которые составляют изображение треугольника. Вы можете использовать шейдер, чтобы сообщить графическому процессору об изменении цвета каждого пикселя на основе текстуры или чего-то еще, но в конечном итоге это все равно сводится к тому, что графический процессор автоматически заполняет все пиксели за вас.
При программном рендеринге вам нужно будет рассчитать, какие пиксели на экране нужно заполнить, а затем сделать блики, чтобы фактически заполнить эти пиксели. То есть вы будете выполнять математическую математику для преобразования из координатного пространства 3D-сцены в пространство просмотра, затем проецировать точки из пространства просмотра на экран и т. Д.
источник