Как вещи представлены визуально? - PullRequest
2 голосов
/ 15 декабря 2009

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

Ответы [ 4 ]

3 голосов
/ 15 декабря 2009

В своей основной операционной системе предоставляется набор базовых apis чертежей (gdi, directx, gdi +, opengl), которые затем вызывают драйвер дисплея и позже обновляют «видеопамять». В прежние времена DOS вы могли обновлять его вручную, но с большим количеством аппаратных систем это становится все труднее, поэтому вы приказываете видеодрайверу сделать это за вас.

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

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

Примечание: речь идет о 2D-части, так как это то, о чем вы, похоже, спрашиваете. Трехмерная часть похожа, но у нее есть дополнительный слой, когда вы передаете вершины в свой драйвер дисплея, он проецирует их в «экранное пространство» и выгружает их отсканированные строки в видеопамять, которые позже загружаются в вашу память. монитор.

1 голос
/ 15 декабря 2009

Прочитайте статью Википедии о растровой графике , она охватывает основы.

0 голосов
/ 15 декабря 2009

Обзор

Обычно группирование данных пикселей в необработанном виде называется кадровым буфером. Это одномерный массив значений одинакового размера. Размер каждого значения зависит от используемого цветового пространства и глубины цвета . Например, 32-битный кадровый буфер RGBA может быть определен следующим образом в C: unsigned int fb[width*height];, given that sizeof int is 4.

Аппаратные средства обычно используют цветовое пространство RGB для аппаратной графики, такой как OpenGL и DirectX, и прямого доступа к кадровому буферу, как с / dev / fb в Linux и GDI + в Windows. Аппаратное декодирование фильмов обычно зависит от цветового пространства YCbCr. Некоторые форматы файлов изображений сохраняют свои данные в других цветовых пространствах, кроме RGB, но преобразуются в RGB в используемый ими API.

Цвет пикселя

Цвет отдельного пикселя можно представить этими способами (список не полный), предполагая цветовое пространство RGB:

Отдельные цветные каналы (True-color)

Истинный цвет - это один компонент для каждого из трех или четырех цветовых каналов, где значения отдельных цветовых каналов представляют интенсивность каждого цвета. Если у него есть альфа-канал, он работает так же, но значение альфа зависит от контекста. Обычно альфа представляет непрозрачность, где самое низкое значение является 100% прозрачным, а самое высокое значение является 100% непрозрачным. Например: (0,255,0,128) будет представлять 50% полупрозрачного зеленого цвета, учитывая RGBA True-color, используя 8-битную глубину цвета на канал.

Palette

При использовании палитр значение отдельного пикселя представляет собой индекс в массив цветов, обычно истинного цвета (хотя не подразумевает 8 бит на канал). Диапазон индекса - это количество цветов, которые могут быть представлены. Индексы 8-битной палитры были распространены и раньше, особенно на аппаратном VGA-оборудовании в начале 1990-х. Аппаратные средства могут отображать подмножество из 256 цветов за раз из пула 2 ^ 24 цветов.

Цветовые пространства

Я не хочу делать этот ответ слишком длинным, и я думаю, что Википедия отвечает на этот вопрос лучше меня, так что вот ссылка: Википедия: цветовое пространство Цветовые пространства - это способы представления цветов и сочетания цветов.

Какое цветовое пространство выбрать для своего приложения?

Это зависит от того, что приложение делает с данными пикселей. Разные цветовые пространства определяют разные потребности. YCbCr используется движущимися изображениями, потому что он определяет уровни гаммы, которые снова определяются, например, стандартами NTSC и PAL. sRGB делает то же самое, только для компьютерных мониторов, где вы можете выбрать гамма / цветовые профили для вашего конкретного экрана. Эти цветовые пространства удобны, когда важно, чтобы цвет, который вы воспринимаете на экране, был как можно ближе к цвету, воспринимаемому на конечном носителе. RGB часто используется, когда гамма не важна, и когда экран компьютера является последним средством. С ним легко работать, поскольку цветовое пространство является линейным. Таким образом, для компьютерной игры вы, вероятно, будете использовать RGB, но для программы обработки изображений, такой как Photoshop или GIMP, вы будете поддерживать HSV / HSL / sRGB и CMYK. При работе с необработанными пикселями в кадровом буфере, возвращаемом API, вы можете использовать RGB, если не решите иначе. При работе с движущимися изображениями предположим, что YCbCr. Аппаратное обеспечение поддерживает множество различных способов кодирования данных. Убедитесь, что вы выбрали формат с учетом аппаратной поддержки и производительности.

0 голосов
/ 15 декабря 2009

Краткий ответ на последний вопрос: библиотеки GUI вызывают функции операционной системы для отрисовки элементов UI, которые, в свою очередь, вызывают соответствующий драйвер для оборудования дисплея. Драйвер отправляет команды оборудованию путем записи в его внешние доступные порты, которые отображаются в специальную область памяти компьютера или область ввода / вывода (см. Драйвер устройства в Википедии).

...