DirectX против OpenGL
Алексей Малашин
Xakep Железо, номер #006, стр. 006-068-1
Антиподы или близнецы-братья?
В технических характеристиках можно часто прочитать, что видеокарта поддерживает DirectX и OpenGL последних версий. А что это значит? Зачем поддерживать сразу две библиотеки? В чем заключается разница между ними? Попробуем ответить на эти вопросы.
Все современные видеокарты имеют аппаратную поддержку возможностей DirectX и OpenGL последних версий, причем для совместимости с разным софтом (использующим ту или иную версию) производители встраивают в чипы реализацию сразу обеих библиотек. Различия их состоят в способе обработки графической информации, причем от версии к версии добавляются новые функции и возможности, позволяющие создавать более реалистичную графику. Чтобы выполнить обработку (весьма сложную) графической информации и снять с программистов заботу разработки собственного драйвера для доступа к функциям видеокарты и были созданы данные библиотеки.
Что это такое?
Что же все-таки скрывается за словами OpenGL и DirectX? Слова эти именуют те самые Application Programming Interface (API - Интерфейс Прикладного Программирования), библиотеки для обработки графической информации и прямого доступа к железу («software interface to graphics hardware», как обозначаются они в спецификации). Думаю, не надо объяснять, что библиотеки содержат набор уже однажды написанных функций, от самых простых (вывод точки на экран) до довольно сложных (построение готовых примитивов, например, трехмерной пирамидки), которые применяются практически в каждой программе. Базовые функции реализованы аппаратно, в виде части GPU, более сложные функции представляют собой программные модули, построенные на базовых командах. Видеокарта не всегда аппаратно поддерживает нужные для работы приложения функции, и в этом случае библиотека использует программные модули, эмулирующие требующиеся возможности.
Если попытаться объяснить понятным языком общую схему работы библиотеки (рис. 1), то она выглядит примерно так: программист дал команду сделать Tri-linear Filtering (трилинейную фильтрацию – уменьшить искажения в картах текстур). Программа вызывает графическую часть DirectX (Direct3D) и предает библиотечной функции данные и что нужно с ними сделать. Модуль библиотеки, отвечающий за работу с драйвером видеокарты, в свою очередь, передает ему необходимые данные и «выясняет», аппаратно или программно будет происходить обработка. Драйвер «видит», что D3D этой версии полностью поддерживается на железном уровне и «отвечает», что есть аппаратная поддержка, и «передает» информацию дальше – видеоадаптеру. Но на этой стадии разработчики видеокарты и драйвера могут внести в процесс свои коррективы. Например, Tri-linear Filtering – очень ресурсоемкая операция, поэтому на уровне драйверов она заменяется менее точной, но более быстрой Bri-linear Filtering (брилинейная фильтрация, реализована на картах ATi). И дальше драйвер «кладет» в регистры GPU все данные, которые обрабатываются в соответствии с запросом, после чего во framebuffer поступает двухмерный кадр, который и выводится на монитор.