Простое программирование 2D-графики - PullRequest
5 голосов
/ 12 июля 2010

Я использовал DirectDraw в C и C ++ много лет назад, чтобы нарисовать простую 2D-графику. Я привык к этапам создания поверхности, записи в нее с помощью указателей, перелистывания заднего буфера, хранения спрайтов на внеэкранных поверхностях и так далее. Итак, сегодня, если я хочу написать несколько программ для 2D-графики на C или C ++, каков путь?

  1. Будет ли применяться этот же метод программирования или у меня другое понимание аппаратной абстракции видео?
  2. Какие библиотеки и инструменты доступны в Windows и Linux?

Ответы [ 3 ]

3 голосов
/ 12 июля 2010

Какие библиотеки и инструменты доступны в Windows и Linux?

SDL , OpenGL и Qt 4 (это библиотека графического интерфейса, но она достаточно быстрая / гибкая для 2D-рендеринга)

Будет ли применяться этот же метод программирования или у меня другое понимание аппаратной абстракции видео?

Обычно вы не записываете данные в поверхность «с помощью указателей» каждый кадр, а вместо этого манипулируете / рисуете их, используя методы, предоставляемые API. Это связано с тем, что драйвер будет работать быстрее с видеопамятью, чем при передаче данных из системной памяти в видеопамять каждый кадр. Вы по-прежнему можете записывать данные в аппаратную поверхность / текстуру (даже в каждом кадре), если это необходимо, но эти поверхности, возможно, придется обрабатывать особым образом, чтобы получить оптимальную производительность. Например, в DirectX вам необходимо сообщить драйверу, что данные поверхности будут часто меняться и что вы будете только записывать данные в поверхность, а не читать их обратно. Кроме того, в 3D-ориентированных API-интерфейсах (openGL / DirectX) поверхность рендеринга на другой поверхности является «особым случаем», и вам может понадобиться использовать «Render Targets» (DirectX) или «Framebuffer Objects» (OpenGL). Который отличается от DirectDraw (где, AFAIK, вы можете пометить все что угодно). Хорошая вещь заключается в том, что с 3D API вы получаете невероятно гибкий способ работы с поверхностями / текстурами - растягивание, вращение, окрашивание их в цвета, смешивание их вместе, обработка их с помощью шейдеров может быть выполнена на оборудовании.

Другое дело, что современные 3D API с аппаратной поддержкой часто не работают с 8-битными текстурами на поддонах и предпочитают изображения ARGB. При необходимости можно эмулировать 8-битные поверхности с палитрой, и 2D низкоуровневые API (SDL, DirectDraw) предоставляют их. Также вы можете эмулировать 8-битную текстуру на оборудовании, используя фрагментные / пиксельные шейдеры.

В любом случае, если вам нужен кроссплатформенный способ использования поверхностей «старой школы» (т. Е. «Записывать данные каждый кадр с помощью указателей» - т. Е. Вам нужен программный рендерер или что-то в этом роде), SDL легко это допускает. Если вам нужны высокоуровневые, более гибкие операции - Qt 4 и OpenGL для вас.

2 голосов
/ 12 июля 2010

В Linux вы можете использовать OpenGL, он не только используется для поддержки 3D, но также поддерживает 2D.

1 голос
/ 12 июля 2010

SDL также довольно прост в использовании, из коробки.Он также кроссплатформенный и включает в себя (и имеет множество) плагинов для удовлетворения ваших потребностей.Он прекрасно взаимодействует с openGL, если вам нужна поддержка 3D.

...