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 во все программные оболочки и интернет-страницы.

СвойствоOpenGLDirectX
Объектно-ориентированнетда
Библиотеки классовQTManaged 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 
oglcoreMicrosoft.DirectX, Microsoft.DirectX.DirectDraw, Microsoft.DirectX.Direct3D
oglutilitiesMicrosoft.DirectX.Direct3DX
.NET NamespaceAPI = Application Programming Interface
Microsoft.DirectXобщие базовые функции
Microsoft.DirectX.DirectDrawподмножество из Direct3D-lib: basic 2D functions, bitmaps, window management
Microsoft.DirectX.Direct3DAPI for 3D graphics: wireframes, textures, light, Vertex and Pixel Shaders
Microsoft.DirectX.Direct3DX3D utilities library, Mesh class and scene graph
Microsoft.DirectX.DirectPlaynetwork support for multiplayer games, host administration for DirectPlay sessions
Microsoft.DirectX.DirectSoundcontains DirectMusic, API for real time multichannel mixer, 3D sound
Microsoft.DirectX.DirectInputAPI for keyboard, mouse, joystick, trackball, touchpad, gamepad, wheel, force feedback
Microsoft.DirectX.AudioVideoPlaybackAPI for simple sound and video
Microsoft.DirectX.Diagnosticssystem diagnostics API
Microsoft.DirectX.Securitysystem 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: создает из произвольных полигонов сеть треугольников и корректирует уже готовые масштабные сетки
Корректировка зависит от расстояния наблюдателя - адаптивная корректировка - Depth-Adaptive Tesselation = Level Of Detail based Tesselation = LOD based 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-программы, которые будут работать на всех браузерах и всех платформах без установки и проблем с безопасностью.