Изучение низкоуровневого графического программирования - PullRequest
41 голосов
/ 25 октября 2008

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

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

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

Есть еще один вопрос по SO, где предлагается Программирование Windows . Как насчет Linux? Есть ли эквивалентная такая книга?

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

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

Ответы [ 8 ]

38 голосов
/ 30 октября 2008

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

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

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

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

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

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

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

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

22 голосов
/ 25 октября 2008

Графическое программирование Майкла Абраша «Черная книга» - отличное место для начала. Плюс вы можете скачать его бесплатно!

5 голосов
/ 25 октября 2008

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

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

4 голосов
/ 25 октября 2008

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

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

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

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

3 голосов
/ 30 октября 2008

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

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

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

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

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

3 голосов
/ 25 октября 2008

см. Раздел Open GPU Documentation: http://developer.amd.com/documentation/guides/Pages/default.aspx

НТН

2 голосов
/ 25 октября 2008

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

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

2 голосов
/ 25 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...