Сглаживание графики – это метод улучшения внешнего вида графиков за счет уменьшения появления зубчатых линий. По умолчанию эта функция включена, если ваша система ее поддерживает.
В этой таблице показана разница между включением и отключением функции. Чтобы отключить эту функцию для определенной фигуры, установите для свойства GraphicsSmoothing фигуры значение 'off' .
Графический интерфейс DirectX (DXGI) и несколько API Direct3D выполняют ту же роль, что и EGL. Этот раздел поможет вам понять DXGI и Direct3D 11 с точки зрения EGL.
DXGI и Direct3D, как и EGL, предоставляют методы для настройки графических ресурсов, получения контекста рендеринга для отрисовки ваших шейдеров и отображения результатов в окне. Однако DXGI и Direct3D имеют гораздо больше параметров и требуют больше усилий для правильной настройки при переносе из EGL.
Большое преимущество EGL по сравнению с DXGI и Direct3D заключается в том, что начать рисовать на поверхности окна относительно просто. Это связано с тем, что OpenGL ES 2.0 и, следовательно, EGL — это спецификация, реализованная несколькими поставщиками платформ, тогда как DXGI и Direct3D — это единая ссылка, которой должны соответствовать драйверы поставщиков оборудования. Это означает, что Microsoft должна реализовать набор API-интерфейсов, обеспечивающих максимально широкий набор функций поставщика, вместо того, чтобы сосредотачиваться на функциональном подмножестве, предлагаемом конкретным поставщиком, или путем объединения команд настройки конкретного поставщика в более простые API-интерфейсы. С другой стороны, Direct3D предоставляет единый набор API-интерфейсов, которые охватывают очень широкий спектр аппаратных графических платформ и уровней функций и обеспечивают большую гибкость для разработчиков, имеющих опыт работы с этой платформой.
Чтобы увидеть базовый процесс Direct3D для настройки графического конвейера, ознакомьтесь с шаблоном приложения DirectX 11 (универсальное для Windows) в Microsoft Visual Studio 2015. Базовый класс рендеринга в нем обеспечивает хорошую основу для настройки графической инфраструктуры Direct3D 11. и настройка основных ресурсов на нем, а также поддержка функций приложения универсальной платформы Windows (UWP), таких как поворот экрана.
В EGL очень мало API-интерфейсов по сравнению с Direct3D 11, и навигация по последнему может стать проблемой, если вы не знакомы с названиями и жаргоном, характерными для платформы. Вот простой обзор, который поможет вам сориентироваться.
абстракция EGL | Аналогичное представление Direct3D |
EGLDisplay | В Direct3D (для приложений UWP) дескриптор отображения получается через Windows::UI::CoreWindow API (или интерфейс ICoreWindowInterop, предоставляющий HWND). Конфигурация адаптера и оборудования задается с COM-интерфейсами IDXGIAdapter и IDXGIDevice1 соответственно. |
EGLSurface | В Direct3D буферы и другие ресурсы окна (видимые или вне экрана) создаются и настраиваются с помощью определенных интерфейсов DXGI, включая IDXGIFactory2 (реализация фабричного шаблона, используемого для получения ресурсов DXGI, таких как IDXGISwapChain1 (буферы отображения). ID3D11Device1, представляющий графическое устройство и его ресурсы, получается с помощью D3D11Device::CreateDevice . Для целей рендеринга используйте интерфейс ID3D11RenderTargetView. |
EGLContext | В Direct3D вы настраиваете и отдаете команды графическому конвейеру с помощью интерфейса ID3D11DeviceContext1.< /td> |
EGLConfig | В Direct3D 11 вы создаете и настраиваете графические ресурсы, такие как буферы, текстуры, трафареты и шейдеры, с помощью методов интерфейса ID3D11Device1. тд> |
таблица>
А теперь самый простой процесс настройки простого графического отображения, ресурсов и контекста в DXGI и Direct3D для приложения UWP.
- Получите дескриптор объекта CoreWindow для основного потока пользовательского интерфейса приложения, вызвав CoreWindow::GetForCurrentThread.
- Для приложений UWP получите цепочку обмена из IDXGIAdapter2 с помощью IDXGIFactory2::CreateSwapChainForCoreWindow и передайте ей ссылку CoreWindow, полученную на шаге 1. Взамен вы получите экземпляр IDXGISwapChain1. Ограничьте его объектом рендеринга и его потоком рендеринга.
- Получите экземпляры ID3D11Device1 и ID3D11DeviceContext1, вызвав метод D3D11Device::CreateDevice. Примените их также к объекту средства визуализации.
- Создавайте шейдеры, текстуры и другие ресурсы, используя методы объекта ID3D11Device1 средства визуализации.
- Определяйте буферы, запускайте шейдеры и управляйте этапами конвейера с помощью методов объекта ID3D11DeviceContext1 средства визуализации.
- После выполнения конвейера и отрисовки кадра в задний буфер отобразите его на экране с помощью IDXGISwapChain1::Present1.
Чтобы изучить этот процесс более подробно, см. статью Начало работы с графикой DirectX. В оставшейся части этой статьи рассматриваются многие общие шаги по базовой настройке графического конвейера и управлению им.
Примечание. Приложения Windows Desktop имеют разные API для получения цепочки обмена Direct3D, например D3D11Device::CreateDeviceAndSwapChain, и не используют объект CoreWindow.
Получение окна для отображения
В этом примере eglGetDisplay передается HWND для ресурса окна, характерного для платформы Microsoft Windows. Другие платформы, такие как Apple iOS (Cocoa) и Google Android, имеют разные дескрипторы или ссылки на ресурсы окна и могут иметь другой синтаксис вызова. После получения отображения вы инициализируете его, устанавливаете предпочтительную конфигурацию и создаете поверхность с задним буфером, в котором вы можете рисовать.
Получение отображения и его настройка с помощью EGL..
В Direct3D главное окно приложения UWP представлено объектом CoreWindow, который можно получить из объекта приложения, вызвав CoreWindow::GetForCurrentThread в рамках процесса инициализации "поставщика представлений", который вы создаете для Direct3D. (Если вы используете взаимодействие Direct3D-XAML, вы используете поставщика представлений платформы XAML.) Процесс создания поставщика представлений Direct3D описан в разделе Как настроить приложение для отображения представления.
Получение CoreWindow для Direct3D.
После получения ссылки CoreWindow окно должно быть активировано, при этом выполняется метод Run основного объекта и начинается обработка событий окна. После этого создайте ID3D11Device1 и ID3D11DeviceContext1 и используйте их для получения базовых IDXGIDevice1 и IDXGIAdapter, чтобы вы могли получить объект IDXGIFactory2 для создания ресурса цепочки обмена на основе вашей конфигурации DXGI_SWAP_CHAIN_DESC1.
Настройка и установка цепочки обмена DXGI в CoreWindow для Direct3D.
Вызовите метод IDXGISwapChain1::Present1 после подготовки кадра для его отображения.
Обратите внимание, что в Direct3D 11 нет абстракции, идентичной EGLSurface. (Есть IDXGISurface1, но он используется по-другому.) Наиболее близким концептуальным приближением является объект ID3D11RenderTargetView, который мы используем для назначения текстуры (ID3D11Texture2D) в качестве заднего буфера, в который будет отрисовываться наш конвейер шейдеров.
Настройка заднего буфера для цепочки подкачки в Direct3D 11
Хорошей практикой является вызов этого кода всякий раз, когда окно создается или изменяется в размере. Во время рендеринга задайте целевое представление рендеринга с помощью ID3D11DeviceContext1::OMSetRenderTargets перед настройкой любых других подресурсов, таких как буферы вершин или шейдеры.
Создание контекста рендеринга
В EGL 1.4 "дисплей" представляет собой набор оконных ресурсов. Как правило, вы настраиваете «поверхность» для отображения, предоставляя набор атрибутов экранному объекту и получая взамен поверхность. Вы создаете контекст для отображения содержимого поверхности, создавая этот контекст и привязывая его к поверхности и отображению.
Поток вызовов обычно выглядит примерно так:
- Вызовите eglGetDisplay с дескриптором ресурса отображения или окна и получите объект отображения.
- Инициализируйте отображение с помощью eglInitialize.
- Получите доступную конфигурацию дисплея и выберите ее с помощью eglGetConfigs и eglChooseConfig.
- Создайте поверхность окна с помощью eglCreateWindowSurface.
- Создайте контекст отображения для рисования с помощью eglCreateContext.
- Привяжите контекст отображения к отображению и поверхности с помощью eglMakeCurrent.
В предыдущем разделе мы создали EGLDisplay и EGLSurface, а теперь используем EGLDisplay для создания контекста и связывания этого контекста с дисплеем, используя настроенный EGLSurface для параметризации вывода.
Получение контекста рендеринга с помощью EGL 1.4
Контекст рендеринга в Direct3D 11 представлен объектом ID3D11Device1, который представляет адаптер и позволяет создавать ресурсы Direct3D, такие как буферы и шейдеры; и объектом ID3D11DeviceContext1, который позволяет управлять графическим конвейером и выполнять шейдеры.
Не забывайте об уровнях функций Direct3D! Они используются для поддержки более старых аппаратных платформ Direct3D, от DirectX 9.1 до DirectX 11. Многие платформы, использующие графическое оборудование с низким энергопотреблением, такие как планшеты, имеют доступ только к функциям DirectX 9.1, а более старое поддерживаемое графическое оборудование может быть от 9.1 до 11.
Создание контекста рендеринга с помощью DXGI и Direct3D
Рисование в ресурсе текстуры или растрового изображения
Чтобы нарисовать текстуру с помощью OpenGL ES 2.0, настройте буфер пикселей или PBuffer. После того, как вы успешно сконфигурируете и создадите для него EGLSurface, вы можете предоставить ему контекст рендеринга и выполнить конвейер шейдера для рисования в текстуре.
Рисовать в пиксельный буфер с помощью OpenGL ES 2.0
В Direct3D 11 вы создаете ресурс ID3D11Texture2D и делаете его целью рендеринга. Настройте цель рендеринга с помощью D3D11_RENDER_TARGET_VIEW_DESC. Когда вы вызываете метод ID3D11DeviceContext::Draw (или аналогичную операцию Draw* в контексте устройства), используя этот целевой объект рендеринга, результаты рисуются в текстуре.
Рисование в текстуру с помощью Direct3D 11
Эту текстуру можно передать шейдеру, если она связана с ID3D11ShaderResourceView.
Рисование на экране
После того как вы использовали свой EGLContext для настройки буферов и обновления данных, вы запускаете привязанные к нему шейдеры и рисуете результаты в заднем буфере с помощью glDrawElements. Вы показываете задний буфер, вызывая eglSwapBuffers.
Откройте GL ES 2.0: рисование на экране.
В Direct3D 11 вы настраиваете свои буферы и связываете шейдеры с помощью IDXGISwapChain::Present1. Затем вы вызываете один из методов ID3D11DeviceContext1::Draw* для запуска шейдеров и отрисовки результатов в цель рендеринга, настроенную как задний буфер для цепочки обмена. После этого вы просто отображаете задний буфер на дисплее, вызывая IDXGISwapChain::Present1.
Direct3D 11: рисование на экране.
Освобождение графических ресурсов
В EGL вы освобождаете ресурсы окна, передавая EGLDisplay в eglTerminate.
Завершение отображения с помощью EGL 1.4
В приложении UWP вы можете закрыть CoreWindow с помощью CoreWindow::Close, хотя это можно использовать только для дополнительных окон пользовательского интерфейса. Основной поток пользовательского интерфейса и связанный с ним CoreWindow нельзя закрыть; скорее, срок их действия истек операционной системой. Однако при закрытии вторичного окна CoreWindow возникает событие CoreWindow::Closed.
Unity поддерживает графические API DirectX 11 (DX11) и OpenGL Core. На этой странице подробно описано, как их использовать.
Включение DirectX 11
DirectX 11 включен по умолчанию в Windows. Ваши игры и редактор Unity используют DX11 и возвращаются к DX9, когда DX11 недоступен.
Чтобы включить или отключить DirectX 11 для сборок игры и редактора, выберите «Правка» > «Настройки проекта» > «Проигрыватель», чтобы открыть настройки проигрывателя. Перейдите к «Другие настройки» и снимите флажок с Auto Graphics API для Windows. На появившейся панели выберите Direct3D11 и нажмите кнопку "минус" (-), чтобы удалить его, или нажмите кнопку "плюс" (+) и выберите Direct3D11 из списка, чтобы добавить его.
Добавление Direct3D11 в список графических API для Windows
После того, как Direct3D11 появится в списке, вы можете перетаскивать его вверх и вниз, чтобы определить приоритет, в котором выбран графический API. Редактор Unity и проигрыватель по умолчанию используют тот, это как запасной вариант, в порядке их перечисления.
ПРИМЕЧАНИЕ. Для DX11 требуется Windows Vista или более поздняя версия и как минимум графический процессор уровня DX10 (предпочтительно уровня DX11). Заголовок окна редактора Unity отображается в конце, когда он работает в режиме DX11.
Включение ядра OpenGL
OpenGL Core включен по умолчанию на Mac и Linux. Ваши игры и редактор Unity используют OpenGL Core на этих платформах.
Чтобы включить OpenGL Core в Windows и установить его по умолчанию, выберите «Правка» > «Настройки проекта» > «Проигрыватель», чтобы открыть настройки проигрывателя. Перейдите к «Другие настройки» и снимите флажок с Auto Graphics API для Windows. В появившейся панели нажмите кнопку плюса (+) и выберите OpenGLCore из списка, чтобы добавить его.
Добавление OpenGLCore в список графических API для Windows
OpenGL Core имеет следующие минимальные требования:
- Mac OS X 10.8 (OpenGL 3.2), MacOSX 10.9 (OpenGL 3.2–4.1)
- Windows с NVIDIA с 2006 г. (GeForce 8), AMD с 2006 г. (Radeon HD 2000), Intel с 2012 г. (HD 4000/IvyBridge) (от OpenGL 3.2 до OpenGL 4.5)
- Linux (от OpenGL 3.2 до OpenGL 4.5)
Вычислительные шейдеры
Вычислительные шейдеры позволяют использовать GPU в качестве параллельного процессора. Дополнительные сведения см. в документации по вычислительным шейдерам.
Тесселяция и геометрические шейдеры
Поверхностные шейдеры поддерживают простую тесселяцию и смещение. Дополнительную информацию см. в документации по тесселяции шейдеров поверхности.
При написании шейдерных программ вручную вы можете использовать полный набор функций модели шейдеров DX11 5.0, включая шейдеры геометрии, корпуса и домена.
Поверхностные шейдеры и DX11
Некоторые части конвейера компиляции шейдеров поверхности не понимают синтаксис HLSL, специфичный для DX11, поэтому, если вы используете функции HLSL, такие как StructuredBuffers, RWTextures и другой синтаксис, отличный от DX9, вам необходимо включить его в препроцессор только для DX11. макрос. Дополнительную информацию см. в документации по различиям между платформами.
Эффекты изображения, хорошо работающие с DX11 и OpenGL Core
- Эффект глубины резкости (оптимизированное разбрызгивание текстуры боке)
- Эффект «Шум и зернистость» (более качественные шумовые паттерны)
- Эффект размытия в движении (фильтр реконструкции более высокого качества)
Примеры
На следующих снимках экрана показаны примеры того, чего можно добиться с помощью DirectX 11 и OpenGL Core.
Объемный взрыв на приведенных выше снимках визуализируется с помощью raymarching, что становится правдоподобным с Shader Model 5.0. Кроме того, поскольку он генерирует и обновляет значения глубины, он становится полностью совместимым с эффектами изображения на основе глубины, такими как глубина резкости или размытие в движении.
Волосы на приведенном выше снимке реализованы с помощью тесселяции и геометрических шейдеров для динамического создания и анимации отдельных прядей волос. Затенение основано на модели, предложенной Каджией-Кай, которая обеспечивает более правдоподобное рассеянное и зеркальное поведение.
Подобно технике прически, показанной на предыдущем изображении, мех на этой паре тапочек также основан на создании геометрии, полученной из простой базовой сетки тапочек.
Эффект размытия на изображении выше (известный как боке) основан на нанесении текстуры поверх очень ярких пикселей. Это создает очень правдоподобное размытие объектива камеры, особенно при использовании в сочетании с визуализацией HDR.
На этом изображении показано преувеличенное размытие объектива. Это возможный результат использования нового эффекта глубины резкости.
Авторские права © Unity Technologies, 2017. Публикация: 5.6-001Н. Дата постройки: 12 июля 2017 г.
Unity может использовать графические API DirectX 11 и OpenGL Core со всеми ожидаемыми от них функциями: вычислительные шейдеры, шейдеры тесселяции, модель шейдеров 5.0 и т. д.
Включение DirectX 11
Этот параметр включен по умолчанию (т. е. в Windows ваши игры и редактор будут пытаться использовать DX11 и возвращаться к DX9, когда он недоступен). Чтобы включить DirectX 11 для сборок игры и редактора, включите параметр «Использовать DX11» в настройках проигрывателя.
ПРИМЕЧАНИЕ. Для DX11 требуется Windows Vista или более поздняя версия и как минимум графический процессор уровня DX10 (предпочтительно уровня DX11). Заголовок окна редактора Unity отображается в конце, когда он работает в режиме DX11.
Включение ядра OpenGL
Этот параметр включен по умолчанию для Mac и Linux (т. е. на этих платформах ваши игры и редактор будут использовать OpenGL Core).
Вы можете включить OpenGL Core в Windows и установить его по умолчанию, перейдя в настройки проигрывателя, сняв флажок «Auto Graphics API для Windows» и добавив OpenGL Core в список. Затем вы можете перетащить OpenGL Core в начало списка, если хотите использовать его по умолчанию.
Включение ядра OpenGL для Windows
ПРИМЕЧАНИЕ. Минимальные требования OpenGL Core:*
- Mac OS X 10.8 (OpenGL 3.2), MacOSX 10.9 (OpenGL 3.2–4.1)
- Windows с NVIDIA с 2006 г. (GeForce 8), AMD с 2006 г. (Radeon HD 2000), Intel с 2012 г. (HD 4000 / IvyBridge) (от OpenGL 3.2 до OpenGL 4.5).
- Linux (от OpenGL 3.2 до OpenGL 4.5).
Эффекты изображения, которые могут использовать преимущества DX11/OpenGL Core
- Эффект глубины резкости (оптимизированное разбрызгивание текстуры боке)
- Эффект «Шум и зернистость» (более качественные шумовые паттерны)
- Эффект размытия в движении (фильтр реконструкции более высокого качества)
Вычислительные шейдеры
Вычислительные шейдеры позволяют использовать GPU в качестве процессора с массовым параллелизмом. Подробнее о режиме см. на странице Compute Shaders.
Тесселяция и геометрические шейдеры
Шейдеры поверхности поддерживают простую тесселяцию и смещение, см. страницу Мозаика шейдеров поверхности.
При написании шейдерных программ вручную можно использовать полный набор функций модели шейдеров DX11 5.0, включая геометрические шейдеры, шейдеры оболочки и домена.
Поверхностные шейдеры и DX11
В настоящее время некоторые части конвейера компиляции поверхностных шейдеров не понимают синтаксис HLSL, специфичный для DX11, поэтому при использовании функций HLSL, таких как StructuredBuffers, RWTextures и другой синтаксис, отличный от DX9, вам необходимо включить его в макрос препроцессора только для DX11. Подробнее см. на странице «Различия платформ».
Примеры
На следующих снимках экрана показаны примеры возможностей DirectX 11/OpenGL Core.
Объемный взрыв на этих кадрах визуализируется с помощью raymarching, что становится правдоподобным с моделью шейдера 5.0. Более того, поскольку он генерирует и обновляет значения глубины, он становится полностью совместимым с эффектами изображения на основе глубины, такими как глубина резкости или размытие движения. Волосы на этом снимке реализованы с помощью шейдеров тесселяции и геометрии для динамического создания и анимации отдельных прядей волос. Затенение основано на модели, предложенной Kajiya-Kai, которая обеспечивает более правдоподобное рассеянное и зеркальное поведение. Подобно технике с волосами выше, показанный мех тапочек также основан на создании геометрии, испускаемой из простой базовой сетки тапочек. Эффект размытия на этом изображении (известный как боке) основан на нанесении текстуры поверх очень ярких пикселей. Это может создать очень правдоподобное размытие объектива камеры, особенно при использовании в сочетании с рендерингом HDR. Преувеличенное размытие объектива, как на скриншоте выше. Это возможный результат использования нового эффекта глубины резкости
Читайте также: