OpenGL и DirectX
OpenGL (= Open Graphics Library) - это программный интерфейс для управления графическим процессором состоит примерно из 250 команд, зашитых в двух библиотеках oglcore и oglutilities. Разрабатывается с 1990 года компанией SGI (Silicon Graphics Inc.). Цель - создание мульти-платформенного графического интерфейса для разработчиков графических карт и программного обеспечения.
Ссылки:
www.opengl.org
www.sgi.com/products/software/opengl
DirectX - это общее название для коллекции из 10 Windows-библиотек (см. таблицу ниже) для низкоуровнего программирования "железа" от различных производителей. Разрабатывается компанией Microsoft с 1994 (первое название "Games SDK") с постоянно меняющимся функционалом, разделенным на версии (текущая версия 11). Цель и главная задача - позиционировать Windows, как платформу для Multimedia. Почти для всех Graphiс-, Sound-, Radio-, Video-, TV- hardware разработаны DirectX-Драйвера.
До версии DirectX 9.0 (включительно) DirectX-библиотеки принципиально отличались от других Windows-APIs (Application Programming Interfaces). Они не гарантировали исполнение необходимых запросов. Каждый программист должен самостоятельно контролировать - может ли, программируемое через DirectX, железо выполнить нужную операцию, и если да, то в каком объеме и форме. На практике, многие программисты доверяют DirectX-Драйверам с надеждой на то, что Драйвер целевого железа настолько хорош, что не просто отклонит некорректные для данного железа запросы, а попытается с помощью аварийной системы их обработать корректно. (см. ниже описание HEL).
Со временем появилось несколько подходов к программированию DirectX:
1) C++ и DirectX Software Development Kit = DXSDK;
2) Managed DirectX для C# - примерно также быстр в исполнении, но проще в программировании, чем 1) и является частью DXSDK;
3) XNA для C# - это последователь 2) для новых Windows-PC, XBox, Windows-Phone;
4) Windows Presentation Foundation = WPF вместе с XAML и C# → DirectX11 упаковано в одну огромную библиотеку классов.
Managed DirectX быстро стал популярным, так как предлагал простой и элегантный доступ к DirectX с высокой скоростью исполнения, и в период с 2002 по 2007 стал самой популярной оболочкой для разработки PC-игр под WindowsXP.
В 2007году Microsoft объявил о развитии Managed DirectX разработав два новых DirectX-APIs:
1) XNA, который в отличии Managed DirectX значительно упрощал доступ к DirectX для разработок на PC- , XBox- и WindowsPhone- платформах;
2) WPF, с целью полной и цельной интеграции DirectX во все программные оболочки и интернет-страницы.
Свойство | OpenGL | DirectX |
Объектно-ориентирован | нет | да |
Библиотеки классов | QT | Managed DX, XNA, WPF |
Поддержка Audio/Video/Game Input Устройств | нет | да |
Поддержка операционных систем | многие | только Windows (на PC, Xbox, Windows Phone) |
Наличие качественных драйверов | Дорогие GPU | почти на все видео-карты |
Качество драйверов | часто среднее или плохое | часто лучше, чем OpenGL-Драйвер |
используется | Универы, Лабы, CAD | Игровая индустрия |
Новые версии | каждые 5 лет (в промежутках только "Extensions") | каждые 15 месяцев |
Собственность | Silicon Graphics Inc. | Microsoft |
OpenGL Libs и DirectX Namespaces
OpenGL состоит из двух библиотек (DLL), которые исключительно заточены на Графику.
Microsoft под именем DirectX собрал все, что в рамках операционной системы обращается напрямую к железу. В Managed DirectX эти библиотеки организованы в форме Namespaces. Только первые четыре из этих Namesspaces занимаются Графикой.
OpenGL lib | DirectX |
oglcore | Microsoft.DirectX, Microsoft.DirectX.DirectDraw, Microsoft.DirectX.Direct3D |
oglutilities | Microsoft.DirectX.Direct3DX |
.NET Namespace | API = Application Programming Interface |
Microsoft.DirectX | общие базовые функции |
Microsoft.DirectX.DirectDraw | подмножество из Direct3D-lib: basic 2D functions, bitmaps, window management |
Microsoft.DirectX.Direct3D | API for 3D graphics: wireframes, textures, light, Vertex and Pixel Shaders |
Microsoft.DirectX.Direct3DX | 3D utilities library, Mesh class and scene graph |
Microsoft.DirectX.DirectPlay | network support for multiplayer games, host administration for DirectPlay sessions |
Microsoft.DirectX.DirectSound | contains DirectMusic, API for real time multichannel mixer, 3D sound |
Microsoft.DirectX.DirectInput | API for keyboard, mouse, joystick, trackball, touchpad, gamepad, wheel, force feedback |
Microsoft.DirectX.AudioVideoPlayback | API for simple sound and video |
Microsoft.DirectX.Diagnostics | system diagnostics API |
Microsoft.DirectX.Security | system security API |
OpenGL & Direct3D Pipeline
Графический чип современной графической карты содержит множество графических процессоров в форме так называемых каскадных пайплайнов (Pipeline). Первая половина этих процессоров занята работой с векторной графикой, вторая с растровой графикой. Цепочки команд в OpenGL и Direct3D отражают принцип цепочек процессоров графического чипа. Следовательно набор команд OpenGL и Direct3D направлены примерно поровну на 3D-Векторную и Растровую графику. Таким образом, фундаментальное отличие между Векторной и Растровой Графикой нейтрализуется и скрывается, чтобы облегчить решение проблемы Векторно-Растрового перехода. Также скрывается проблема разделения работы между CPU и GPU, Что еще сложнее учитывая разнообразие возможных вариантов.
Таким образом, многие новички поначалу иллюзорно считают, что понимание работы "железа" не так уж необходимо.
Схема 3D-Pipeline в OpenGL & Direct3D повторяет архитектуру GPU:
В DirectX есть возможность отключить всю Векторную часть через флаг CreateFlags.SoftwareVertexProcessing. Если в компьютере нет полноценного или вообще никакого GPU, то Pipeline будет симулироваться внутри OpenGL/DirectX, используя для всех расчётов CPU. В этом случае данные термины - Vertex Shader, T&L Engine, HSSL/Cg - не имеют никакого смысла и лучше говорить о CPU-Графике - HEL und HAL.
Vertex Shader = каскад последовательно включенных микропроцессоров внутри GPU. Современные GPU содержат до 8 таких каскадов параллельно: программа, написанная на HLSL или Cg для Vertex Shader, также называется Vertex Shader.
Задача Vertex Shader: преобразование 3D-треугольников (в мировых координатах) в 2D-треугольники (в экранных координатах).
Процессы в Vertex Shader: Tesselation (триангуляция), координатная трансформация, 3D-Scroll+Zoom+Rotation, Clipping, Back Face Culling.
T&L Engine - Transform & Light Engine - Fixed Vector Pipeline - наименование от одного до 8 параллельных Vertex Shader, которые программируются через заранее прошитые алгоритмы (Firmware), не дающиие большой свободы, но при этом значительно более быстрые. Управление этими Firmware осуществляется из вне, через:
a) флаги состояний, Пример: device.Lights[0].Enabled = true; и
b) 3x3-матрицы, Пример: device.Transform.View = Matrix.LookAtLH( new Vector3( 0f, 0f,-4f ),
new Vector3( 0f, 0f, 0f ),
new Vector3( 0f, 1f, 0f ) );.
Tesselation: создает из произвольных полигонов сеть треугольников и корректирует уже готовые масштабные сетки |
Clipping = обрезка линий и конвексных Полигонов по границе экрана через алгоритм Коена-Сазерленда.
Back Face Culling: примерно 50% треугольников обращены к наблюдателю тыльной стороной - если эти полигоны выбросить из рассчетов, то это ускорит растровые операции примерно в двое.
Pixel-Shader = Rasterizer = включенный после Vertex-Shader специальный процессор графического чипа, специализирующийся на растровой графике = текстурирование и отрисовка (рендер) отдельного Пиксела, программируется через HLSL или Cg, в графическом чипе содержится до 32-х параллельных Pixel-Shader.
Texture = деформация растрового прямоугольника так, что он умещается в заданный Полигон.
BitBlitter = сокращение от Bit Block Transfer = добавление растеризованных Шрифтов, линий, четырехугольников, эллипсов и т.д.
Z-Test = Depth Test = Удаление скрытых Пикселей.
Alpha & Color Blending = наложение масок прозрачности.
Fog = добавление тумана в зависимости от расстояния между наблюдателем и объектом.
Dithering = сглаживание цветов.
HEL и HAL
При установке Драйвера Графических карт, звуковых карт, джойстиков и т.д. определятся в операционной системе в форме Device Driver Interface DDI. С помощью определенного DDIs каждая DirectX-Библиотека при старте инициализирует один Hardware Emulation Layer HEL и один Hardware Abstraction Layer HAL. HEL содержит низкоуровневые вызовы базовых функций и кода CPU. HAL содержит внешние, автономные микро-программы для Графических, звуковых карт и т.д. HAL имеет более высокий приоритет исполнения, чем HEL, но приэтом все библиотечные вызовы выполняются, даже тогда, когда HAL мало что может. HEL-Графика, HEL-Анимация, HEL-Звук, HEL-Видео и пр., как правило медленны в исполнении, но они гарантированно исполнимы.
Производители CPU - Intel и AMD конкурируют с производителями Графических и Мультимедийных карт. Они постоянно улучшают графическую и звуковые компоненты и общую архитектуру CPU, для того чтобы усилить HEL против HAL. И делают это с большим успехом: в простых играх и мультимедиа трудно заметить разницу в производительности, и для офисных приложений достаточно обычного on-board-Videocontroller без отдельной видео-памяти (используется общая память).
Пример: прорисовка через GDI+ или DirectDraw HEL/HAL Существует три пути, чтобы что-то нарисовать: 1) обычный Windows-вызов без DirectX работает через GDI+ und DDI. Пример: graphics.DrawLine( mypen, 0, 0, 100, 100 ); 2) через DirectDraw, HEL и DDI 3) через DirectDraw и HAL Если вариант 3) существует, то 2) закрыт. 3)быстрее, чем 2) и 2) быстрее, чем 1). GDI+ и DirectDraw-команды можно свободно смешивать. GDI+ Info: http://msdn.microsoft.com/library/GDIPlus.asp |
Direct3D Device
это важнейший Direct3D-Класс, который непосредственно управляет Графической Картой. Его главная функция - Device.Present, переключать BackBuffer Графической Карты на FrontBuffer и таким образом отображать прорисованную функцию на мониторе.
Далее этот класс содержит Свойства/Функции как для Векторной Графики (Viewport, Vertex Format, Transform) так и для Растровой Графики (Material, Texture, адресса и длины для Output-Buffer).
При старте любой программы, использующей Direct3D, создается данный класс и резервиуются ресурсы и права доступа к Графической Карте.
Важные свойства | of Direct3D class "Device" |
DeviceCaps | Возвращает структуру, представляющую возможности железа - используется для определения доступна ли та или иная фича для использования в текущем приложении |
Viewport | Возвращает/Определяет прямоугольный регион для отрисовки на текущем устройстве |
Material | Возвращает/Определяет материал для использования при прорисовке (рендере) |
Lights | Возвращает коллекцию источников света, которые могут быть активированы при прорисовке (рендере) |
RenderState | Возвращает колекцию состояний рендера, которые используются для контроля различных состояний Direct3D пайплайна. |
VertexDeclaration | Возвращает/Определяет описание вертексных форматов используемых вертексным шейдером |
VertexFormat | Возвращает/Определяет описание вертексных форматов, используемых в Fixed Vector Pipeline |
VertexShader, PixelShader | Возвращает/Определяет the vertex/pixel shader to use for rendering |
Важные методы | Direct3D class "Device" |
BeginScene | Готовит устройство для прорисовки примитивов (простых форм) в кадре. BeginScene должна быть вызвана перед прорисовкой любых примитивов в кадре. |
EndScene | Сигнал устройству, что все примитивы в кадре отрисованы. EndScene должна быть вызвана, когда все примитивы в кадре отрисованы. |
DrawPrimitives | Прорисовывает примитивы. |
Clear | Очищает окно перед прорисовкой следующего кадра. |
Present | Отображает прорисованный буфер и готовит следующий для прорисовки. Present вызывается после EndScene и до следующей BeginScene (для следующего кадра). |
GetTransform, SetTransform | Возвращает/Определяет мировые, экранныеи другие трансформации. Трансформации применяются для вертексных позиций и нормалей и/или текстурных координат. |
GetTexture, SetTexture | Возвращает/Определяет текстуры связанные с данным текстурным состоянием. |
DirectX, Windows 7 / 8
Начиная с W7 весь пользовательский интерфейс базируется на DirectX. Таким образом, DirectX уже не просто графическая библиотека, а основная часть операционной системы. Microsoft предписывает разработчикам графических чипов детальный план необходимой функциональности, которому должны соответствовать все драйвера, находящиеся между операционной системой и DirectX. Производители не имеют особых вариантов - они обязаны следовать предписаниям Microsoft, иначе они теряют рынок Windows-машин. см: Windows Display Driver Model WDDM W7 Display Driver Model Windows Driver Kit (WDK) |
Плюсы:
1) Mожно положиться на то, что W7 использует Графическое железо по полной. Не существует ни DDI не HEL, а только HAL.
2) Mожно быть уверенным, любой драйвер для W7 предлагает минимальный набор команд "Direct3D 10".
3) Пользовательский интерфейс W7 предлагает быструю высококачественную графику, прозрачность, анимацию, 3D и видео.
4) Интернет-Страницы могут использовать WPF для быстрой DirectX-Графики.
Минусы:
1) Старые Графические карты, принтера, сканеры, не имеющие DirectX10.1-драйвера не будут работать под W7.
2) Старые DirectX-игры, как правило не работают под W7.
Windows Presentation Foundation WPF
Основными элементами W7-Графики являются:
a) Desktop Window Manager = DWM
b) Windows W7 Display Driver Model = WVDDM или короче WDDM, поддерживаемые W7-Графическими картами.
Работает так:
1.) Все окна и графические элементы (включая шрифты) в W7 - это Векторная Графика.
2.) Данные и команды Векторной Графики хранятся, управляются и позиционируются через DVM.
3.) DVM передает данные и команды WVDDM-драйверу.
4.) Драйвер преобразует все в формат данных и команд DirectX и загружает это все в свою Графическую карту.
5.) Графический пайплайн на карте отрисовывает картинку автономно (без участия CPU) с максимальной скоростью в Back-Buffer.
6.) как только Back-Buffer заполнен, Графическая карта переключает его как в состояние Front-Buffer для вывода на экран.
WPF - это программная оболочка (Application Programming Interface API) для W7.
С помощью WPF можно создавать как отдельные приложения, так и интерфейсные части других приложений или браузерные приложения.
WPF содержит два API, которые дополняют друг друга и которые можно произвольно смешивать в одном приложении: можно писать часть на C# или XAML или смешано. WPF создан для замены Windows-Forms- и Active-Server-Page- систем.
Плюсы:
1) WPF генерирует только Векторную Графику (за исключением текстур и видео) как Flash.
2) WPF прорисовывается через DirectX. Соответственно: Анимация, прозрачность, Anti-Aliasing намного быстрее, чем на Flash.
3) WPF обладает богатым и хорошо организованным функционалом для Windows- и Web-GUIs.
4) WPF везде предлагает единообразный интерфейс для Windows, Web-страниц и мобильных устройств.
5) С помощью Expression Studio могут не образованные (не информатики) интерфейс приложения или Web-страницы собрать самостоятельно.
Минусы:
1) WPF работает только под Windows (Исключение - Silverlight см ниже).
2) Библиотека классов WPF глубоко структурирована и сложна в изучении.
3) Использование WPF приводит к бесполезным графическим наворотам различного рода.
Silverlight - это небольшое ответвление от WPF в форме Plugin-а, который доступен для всех основных браузеров. Страница созданная на Silverlight 4.0 и выше, сделана на XAML и C#. Используя Silverlight можно писать WPF-программы, которые будут работать на всех браузерах и всех платформах без установки и проблем с безопасностью.