В системе Linux, я полагаю, это будет GTK -> X Server - (OpenGL) -> видеокарта. Это правильно?
Нет. GTK + на Linux выходит
/-[ if direct context ]---\
/--> OpenGL >-+---------/ \
/ \-> GLX -+--------------\ \
/ \ \ \
GTK+ -+-> cairo >-+---> XRender >--------+----+-> Xlib/xcb >-+-> X server >-+-> Kernel Module >-> GPU
\ \–-> pixmap buffer >–/
\ /
\―---------------------------/
Я читал, что некоторые графические интерфейсы напрямую рисуют OpenGL (например, Blender3D), так как другие приложения рисуют свои графические интерфейсы?
Это просто "Блендер" (без трейлинга в 3D). GUI-инструментарий Blender использует OpenGL в качестве единственного бэкэнда, да. Но графический интерфейс не рисуется напрямую с использованием OpenGL, с которым было бы неудобно работать (рисуйте каждую кнопку с помощью вызовов OpenGL. Blender имеет свой собственный инструментарий. GTK + - это еще один инструментарий, но не привязанный к Blender (на самом деле один из моих любимых проектов - извлечение инструментария Blender GUI, чтобы его можно было использовать в независимых проектах).
Наборы инструментов, такие как GTK + и Qt, разработаны для максимальной мобильности. Blender может позволить себе роскошь знать, что OpenGL будет доступен. Приложения, разработанные для GTK + или Qt, могут работать на системах, не поддерживающих 3D, поэтому дизайн GTK + и Qt позволяет работать на нескольких бэкэндах. GTK + теперь в версии 3 использует графический движок Cairo в качестве графического бэкэнда. Cairo снова имеет свои собственные бэкэнды, а именно программный растеризатор, рисующий в растровые изображения (пиксельные изображения), или проксирующий команды рисования для базовой графической архитектуры. В случае Cairo в Linux это может быть OpenGL или X11 (расширения ядра и протокола XRender).
Если единственными API (которые я знаю) для видеокарт являются Direct3D и OpenGL, в чем разница между программным рендерингом и аппаратным ускорением?
Ни OpenGL, ни Direct3D не общаются с видеокартой. Они разговаривают с драйверами видеокарты. Таким образом, у вас будет возможность поговорить с самими драйверами, минуя OpenGL и Direct3D. Но зачем ты это делаешь? Это утомительно.
Кроме того, в Windows у вас есть GDI и / или WPF (Windows Presentation Foundation) для рисования, а также Direct2D.
В Linux вы получаете ядро X11 и протокол расширения XRender для рисования красивых картинок.
Еще одним API, находящимся в стадии разработки, является OpenVG, целью которого является стандартизация всех этих API-интерфейсов 2D-рисования. И, по крайней мере, в Linux OpenGL и OpenVG были выбраны, чтобы стать единственными доступными API абстрактного рисования в долгосрочной перспективе, с некоторой оконной системой для управления кадровым буфером и пользовательским вводом. В разработке находится Wayland (дизайн которого мне совершенно не нравится) и X11, который, я думаю, имеет лучший дизайн (это сетевая система, которая позволяет распределенное выполнение, что я считаю очень важным в будущем), но нуждается в полная перестройка в некоторый «X12» - очистка устаревшего кода, заставить его работать в цветовом пространстве контакта, сделать соединения переходными (чтобы можно было переносить клиентов между X-серверами, что позволило бы гораздо более элегантный способ блокировки X-сеансов путем перемещения всех подключений к теневому X-серверу вместо попытки заблокировать доступ с помощью экранной заставки блокировки).
Может ли программное обеспечение, которое выполняет «программный рендеринг», напрямую записывать в кадровый буфер видеокарты, так что OpenGL остается нетронутым?
Не в современной операционной системе. Однако ОС может предоставить вам абстрактный доступ к графической карте через некоторый API кадрового буфера (/ dev / fb0 в Linux). Однако кадровый буфер неуправляем, поэтому, если запущен X-сервер или Wayland, любой из них занимается управлением FB, и тогда это не ваше дело.