Подтвердить что ты не робот

Изучение низкоуровневого графического программирования

Мне интересно узнать о различных уровнях абстракции, доступных для создания графических приложений.

Я вижу много терминов, брошенных вокруг: на самом высоком уровне абстракции я слышу о таких вещах, как С#,.NET, pyglet и pygame. Далее я слышу о DirectX и OpenGL. Затем есть DirectDraw, SDL, Win32 API и другие многоплатформенные библиотеки, такие как WxWidgets.

Как я могу получить хорошее представление о том, где заканчивается один из этих слоев и где начинается следующий? Каков способ "минимально возможного уровня" создания окна в Windows, в C? Как насчет С++? (Образец кода будет божественным.) А как насчет X11? Являются ли версии Windows OpenGL и DirectX, построенные поверх API Win32? Где я могу начать узнавать об этих вещах?

Предлагается другой вопрос о SO, где Программирование Windows. Что относительно Linux? Существует ли такая эквивалентная книга?

Я знаю, что это очень низкоуровневый, и есть много удобных инструментов, но мне хотелось бы хотя бы узнать основы того, что происходит под поверхностью. Столько, сколько я хотел бы начать вышивать окна и векторы сразу с места в карьер, начиная с чего-то вроде pygame, для меня слишком высокий уровень; Мне действительно нужно сделать полную концептуальную схему того, как вы рисуете материал на компьютере.

Я, безусловно, буду признателен за предложения по книгам и ресурсам, но я думаю, что было бы здорово здорово, если бы ответы на этот вопрос заполнились множеством разных способов добраться до "Hello world" с различными подходами к графическому программированию. C? С++? Использование OpenGL? Использование DirectX? В Windows XP? На Ubuntu? Может быть, я прошу слишком много.

4b9b3361

Ответ 2

Самый низкий уровень будет видеопамять видеокарты. Когда компьютер сначала запускается, графическая карта обычно устанавливается в устаревший режим символов 80x25.

В этот момент вы можете написать текст с прерыванием BIOS. Вы также можете изменить цвет переднего и заднего фона из палитры из 16 отличительных цветов. Вы можете использовать порты доступа/регистры для изменения режима отображения. На данный момент вы можете сказать, загрузите другой шрифт в память дисплея и по-прежнему используйте режим 80x25 (обычно это делают установки ОС), или вы можете продолжить и включить VGA/SVGA. Это довольно сложно, для чего нужны драйверы.

Как только карта в режиме "выше" вы измените, что на экране, обратившись к памяти, сопоставленной с видеокартой. Он хранится горизонтально по пикселям с некоторыми "грязными областями" пикселей, которые не отображаются на экране в конце каждой строки, которую вы должны компенсировать. Но да, вы можете скопировать пиксели изображения в память непосредственно на экран.

Для таких вещей, как DirectX, OpenGL. вместо того, чтобы напрямую писать на экран, команды отправляются на графическую карту, и она автоматически обновляет свой экран. Такие команды, как "Эй вы, нарисуйте это изображение, которое я загрузил в VRAM здесь, здесь и здесь" или "Нарисуйте эти треугольники с помощью этой матрицы преобразования...", занимают долю времени по сравнению с пикселем за пикселем. CPU поблагодарит вас.

DirectX/OpenGL - это программа-дружественная библиотека для отправки этих команд на карту со всеми поддерживающими функциями, которые помогут вам сделать это плавно. Более прямой подход был бы непродуктивным.

SDL - это слой абстракции, поэтому, не утруждая себя чтением, я бы предположил, что у него будут разные способы работы с каждой системой. На одном из них можно использовать полу-прямую запись на экране, другую Direct3D и т.д. Независимо от того, какой код остается кросс-платформенным.

Система GDI/GDI + и XWindow. Они разработаны специально для рисования окон. Первоначально они рисовали с использованием пиксельно-пиксельного метода (это было достаточно хорошо, потому что им нужно было перерисовывать только при нажатии кнопки или перемещении окна и т.д.), Но теперь они используют Direct3D/OpenGL для ускоренного рисования (и специальные последствия). Оптимизации зависят от версий и реализаций этих библиотек.

Итак, если вам нужна максимальная мощность и скорость, DirectX/openGL - это путь. SDL, безусловно, полезен для получения максимальной отдачи от кросс-платформенной среды и в любом случае интегрируется с OpenGL. Система окон занимает последнее место, но не стоит ее недооценивать. Особенно с тем, что Microsoft придумала в последнее время.

Ответ 3

Если вы действительно хотите начать снизу, то рисование линии - это самая основная операция. Компьютерная графика - это просто заполнение пикселей на сетке (экране), поэтому вам нужно решить, какие пиксели заполнить, чтобы получить линию, которая идет от (x0, y0) к (x1, y1).

Посмотрите алгоритм Брезенхэма, чтобы понять, что с этим связано.

Ответ 4

Чтобы быть хорошим программистом по обработке графики и изображений, не требуется знание этого низкого уровня, но я не люблю быть невежественным в отношении того, что я использую. Я вижу два способа преследовать это: высокий уровень вниз или нижний уровень вверх.

Сверху вниз следует следить за тем, как действие отслеживается с помощью высокоуровневой графической операции, такой как рисование круга, на аппаратное обеспечение. Познакомьтесь с OpenGL. Тогда источник в Mesa (бесплатно!) Обеспечивает быстрый взгляд на то, как OpenGL может быть реализован в программном обеспечении. Источник для Xorg будет следующим, сначала посмотреть, как действие происходит от вызовов API через клиентскую сторону на X-сервер. Наконец, вы погружаетесь в драйвер устройства, который взаимодействует с оборудованием.

Внизу: создайте собственное графическое оборудование. Подумайте, как можно подключиться к компьютеру - как обрабатывать огромное количество пикселей через несколько байтовых регистров, как DMA будет работать. Напишите драйвер устройства и попробуйте создать графическую библиотеку, которая может быть полезна для приложений-программистов.

Восходящий путь - это то, как я узнал, много лет назад, когда это было возможно с медленными 8-битными микропроцессорами. Прямой опыт использования схемных и аппаратно-программных интерфейсов дал мне хорошую оценку сложных проектных решений - например, рисовать прямоугольники с использованием умного оборудования, в драйвере устройства или на более высоком уровне. Ничто из этого не имеет практической повседневной ценности, но обеспечивает основу для понимания новых технологий.

Ответ 6

В MSWindows это легко: вы используете то, что предоставляет API, является ли он стандартным API программирования Windows или API-интерфейсом DirectX-семейства: то, что вы используете, и они хорошо документированы.

В среде X-Window вы используете все X11-библиотеки, которые предоставляются. Если вы хотите понять принципы, лежащие в окнах на X, я предлагаю вам сделать это, не зная, что многие другие говорят вам не об этом, это действительно поможет вам понять графику и оконную обработку под X. Вы можете прочитать документацию по X-программированию (Google для него). (После этого упражнения вы по достоинству оцените библиотеки более высокого уровня!)

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

В другом сообщении упоминается Черная книга Abrash - отличный ресурс.

Edit: Что касается книг по программированию Linux: это сообщество, есть много способов вокруг; также найдите форум, присоединитесь к нему, и пока вы действуете цивилизованно, вы получите всю необходимую помощь.

Ответ 7

С самого начала, я бы сказал, "вы слишком много просите". Из того небольшого опыта, который у меня был, я бы рекомендовал прочитать некоторые уроки или получить книгу на DirectX или OpenGL для начала. Чтобы идти хоть немного ниже, это было бы довольно сложно. Большинство книг, которые я видел в OGL или DX, имеют довольно хорошие представления, которые объясняют, что делают функции/классы.

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

Или, если вы действительно, НЕ ДОЛЖНЫ узнать НИЗКОЙ уровень... прочитайте книгу в приведенном выше сообщении.

Ответ 8

libX11 - это библиотека нижнего уровня для X11. Я считаю, что opengl/directx напрямую разговаривают с драйвером/оборудованием (или эмулируют неподдерживаемые операционные системы), поэтому они будут самой низкой библиотекой уровня.

Если вы хотите начать с очень низкого уровня программирования, посмотрите на код сборки x86 для VGA и запустите копию dosbox или аналогичного.

Ответ 9

Vulkan api - это API, который предоставляет вам доступ на очень низком уровне к большинству, если не ко всем функциям графического процессора, вычислительным и графическим, он работает на графических процессорах amd и Nvidia (не на всех)

Вы также можете использовать CUDA, но он работает только на Nvidia GPUS и имеет доступ только к вычислительным функциям, без вывода видео.