Вопросы Direct3D 9 в Direct3D 10 (Direct3D 10)
На следующей странице представлен базовый обзор ключевых различий между Direct3D 9 и Direct3D 10. В описании ниже приведены некоторые аналитические сведения, которые помогут разработчикам использовать интерфейс Direct3D 9 для изучения и связи с Direct3D 10.
Хотя сведения в этом разделе сравниваются с Direct3D 9 с Direct3D 10, так как Direct3D 11 строится на улучшениях, сделанных в Direct3D 10 и 10.1, вам также нужна эта информация для миграции с Direct3D 9 на Direct3D 11. Сведения о переходе за пределы Direct3D 10 в Direct3D 11 см. в статье "Миграция на Direct3D 11".
- Обзор основных структурных изменений в Direct3D 10
- Абстракции ядра / разделение
- Рекомендации по быстрому устранению проблем сборки приложений
- Управление API Direct3D 10
- Создание ресурсов
- Представления
- Статический и динамический доступ к ресурсам
- Эффекты Direct3D 10
- HLSL без эффектов
- Компиляция шейдера
- Создание ресурсов шейдера
- Интерфейс слоя отражения шейдера
- Макеты сборщика входных данных — шейдер вершин / компоновка входного потока
- Влияние удаления мертвого кода шейдера
- Пример входной структуры шейдера вершин
- Создание объекта state
- Перенос текстур
- Перенос шейдеров
- Дополнительные различия Direct3D 10 для просмотра
- Дополнительные различия Direct3D 10.1
- Связанные статьи
Обзор основных структурных изменений в Direct3D 10
Процесс отрисовки с помощью устройства Direct3D 10 структурно похож на Direct3D 9.
- Задание источника потока вершин
- Задание макета входных данных в Direct3D 10 (задание объявления потока вершин в Direct3D 9)
- Объявление примитивной топологии
- Установка текстур
- Установка объектов состояния
- Установка шейдеров
- Draw
Вызов Draw связывает операции вместе; порядок вызовов до вызова Draw является произвольным. Основные различия в проектировании API Direct3D 10 приведены следующим образом:
- Удаление фиксированной функции
- Удаление битов CAPS — базовый набор функций Direct3D 10 гарантируется
- Более строгое управление: доступ к ресурсам, состояние устройства, константы шейдера, компоновка шейдера (входные и выходные данные для шейдеров) между этапами
- Изменения имени точки входа API отражают использование виртуальной памяти GPU (Map() вместо lock()).
- Слой отладки можно добавить на устройство во время создания
- Примитивная топология теперь является явным состоянием (разделенным от вызова Draw)
- Явные константы шейдера теперь хранятся в буферах констант
- Разработка шейдеров полностью выполняется в HLSL. Компилятор HLSL теперь находится в основной библиотеке DLL Direct3D 10.
- Новый программируемый этап — шейдер геометрии
- Удаление BeginScene()/EndScene()
- Общие функции 2D, фокуса и управления адаптерами, реализованные в новом компоненте: DXGI
Удаление фиксированной функции
Иногда удивительно, что даже в подсистеме Direct3D 9, которая полностью эксплуатирует программируемый конвейер, остается ряд областей, которые зависят от конвейера фиксированной функции (FF). Наиболее распространенные области обычно связаны с выравниванием пространства экрана для пользовательского интерфейса. По этой причине вам, скорее всего, потребуется создать шейдер эмуляции FF или набор шейдеров, которые обеспечивают необходимое поведение замены.
В этой документации содержится технический документ, содержащий источники шейдера замены для наиболее распространенных вариантов поведения FF (см . пример фиксированной функции EMU). Некоторые функции пиксельного поведения, включая альфа-тест, были перемещены в шейдеры.
Проверка времени создания объекта устройства
Конвейер Direct3D 10 был перестроен с нуля в оборудовании и программном обеспечении с основным намерением сократить расходы на ЦП (во время рисования). Чтобы сократить затраты, все типы данных устройства были назначены объекту с явными методами создания, предоставляемыми самим устройством. Это обеспечивает строгую проверку данных во время создания объекта вместо вызова Draw, так как часто это делает с Direct3D 9.
Абстракции ядра / разделение
Приложения, включая Игры, которые хотят поддерживать Direct3D 9 и Direct3D 10, должны иметь слои отрисовки, абстрагированные от остальной части базы кода. Существует множество способов достичь этого, но ключом ко всем из них является проектирование слоя абстракции для устройства Direct3D нижнего уровня. Все системы должны взаимодействовать с оборудованием через общий уровень, который предназначен для обеспечения управления ресурсами GPU и низкоуровневыми типами.
Прямое удаление зависимостей Direct3D 9
При переносе больших, ранее проверенных баз кода важно свести к минимуму количество изменений кода для тех, которые абсолютно необходимы для сохранения ранее протестированных поведении в коде. Рекомендации включают четкое документирование, в котором элементы изменяются с помощью комментариев. Часто полезно использовать стандарт комментариев для этой работы, которая обеспечивает быструю навигацию по базе кода.
Ниже приведен пример списка стандартных однострочных и начальных примечаний, которые можно использовать для этой работы.
Позиция | Description |
---|---|
Удалено Direct3D 10 |
Используйте это, где удаляются строки или блоки кода |
Обновление Direct3D 10 |
Он помогает добавить дополнительные заметки в комментарий NEED UPDATE, который предполагает, что рабочий / новый API следует использовать для последующих посещений кода для преобразования поведения. Интенсивное использование утверждения (false) также следует использовать, где \\ Direct3D 10 NEEDS UPDATE происходит, чтобы не выполнять неузнавательный код. |
Изменено Direct3D 10 |
Области, в которых произошли основные изменения, должны храниться для будущей ссылки, но комментировать |
// Direct3D 10 END |
Квалификатор блока кода конца |
Для нескольких строк источника следует использовать стиль C /* */ примечания, но добавить соответствующие начальные и конечные комментарии вокруг этих областей.
Рекомендации по быстрому устранению проблем сборки приложений
Переопределение типов Direct3D 9
Возможно, полезно вставить файл заголовка высокого уровня, содержащий определения типов и переопределения для базовых типов Direct3D 9, которые больше не поддерживаются заголовками Direct3D 10. Это поможет свести к минимуму количество изменений в коде и интерфейсах, где существует прямое сопоставление типа Direct3D 9 с новым типом Direct3D 10. Этот подход также полезен для поддержания поведения кода в одном исходном файле. В этом случае рекомендуется определить нейтральные версии или обычно именованные типы, описывающие распространенные конструкции, используемые для отрисовки, но охватывать интерфейсы API Direct3D 9 и Direct3D 10. Например:
#if defined(D3D9)
typedef IDirect3DIndexBuffer9 IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9 IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer IDirect3DIndexBuffer;
typedef ID3D10Buffer IDirect3DVertexBuffer
#endif
Ниже приведены другие примеры Direct3D 10.
typedef ID3D10TextureCube IDirect3DCubeTexture;
typedef ID3D10Texture3D IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT D3DVIEWPORT;
typedef ID3D10VertexShader IDirect3DVertexShader;
typedef ID3D10PixelShader IDirect3DPixelShader;
Устранение проблем со ссылкой
Рекомендуется разрабатывать приложения Direct3D 10 и Windows Vista с помощью последней версии Microsoft Visual Studio. Однако можно создать приложение Windows Vista, которое зависит от Direct3D 10 с помощью более ранней версии Visual Studio 2003. Direct3D 10 — это компонент платформы Windows Vista, который имеет зависимости (как и в пакете SDK для платформы Server 2003 с пакетом обновления 1 (SP1) в следующем lib: BufferOverflowU.lib требуется для решения любых проблем с компоновщиком buffer_security проверки.
Имитация ЦС устройств
Многие приложения содержат области кода, которые зависят от доступных данных CAPS устройства. Для этого необходимо переопределить перечисление устройств и принудив capS устройства к разумным значениям. Планируйте повторно посетить районы, где есть зависимости от CAPS позже для полного удаления CAPS, где это возможно.
Управление API Direct3D 10
В этом разделе рассматриваются изменения поведения, вызванные API Direct3D 10.
- Создание ресурсов
- Представления
- Статический и динамический доступ к ресурсам
- Эффекты Direct3D 10
- HLSL без эффектов
- Компиляция шейдера
- Создание ресурсов шейдера
- Интерфейс слоя отражения шейдера
- Макеты сборщика входных данных — шейдер вершин / компоновка входного потока
- Влияние удаления мертвого кода шейдера
- Пример входной структуры шейдера вершин
- Создание объекта state
Создание ресурсов
API Direct3D 10 разработал ресурсы в качестве универсальных типов буферов, которые имеют определенные флаги привязки в соответствии с запланированным использованием. Эта точка разработки была выбрана для упрощения почти повсеместного доступа к ресурсам в конвейере для таких сценариев, как отрисовка в буфер вершин, а затем мгновенное рисование результатов без прерывания ЦП. В следующем примере показано выделение буферов вершин и буфера индекса, где можно увидеть, что описание ресурса отличается только флагами привязки ресурсов GPU.
API Direct3D 10 предоставил вспомогательные методы текстуры для явного создания ресурсов типа текстур, но, как вы можете себе представить, это действительно вспомогательные функции.
- CreateTexture2D()
- CreateTextureCube()
- CreateTexture3D()
При выборе Direct3D 10 вы, скорее всего, хотите выделить больше элементов во время создания ресурса, чем вы используете с Direct3D 9. Это станет наиболее очевидным при создании буферов целевого объекта отрисовки и текстур, где необходимо также создать представление для доступа к буферу и настройки ресурса на устройстве.
Руководство 1. Основы Direct3D 10
Примечание.
Direct3D 10 и более поздних версий Direct3D расширяет формат файла DDS для поддержки новых форматов DXGI, массивов текстур и массивов карты кубов. Дополнительные сведения о расширении формата файлов DDS см. в руководстве по программированию для DDS.
Представления
Представление — это специально типизированный интерфейс к данным, хранящимся в буфере пикселей. Ресурс может одновременно выделить несколько представлений, и эта функция выделена в образце кубовой карты с одним проходом, который содержится в этом пакете SDK.
Страница руководства программистов по доступу к ресурсам
Статический и динамический доступ к ресурсам
Для обеспечения оптимальной производительности приложения должны секционировать свои данные с точки зрения статического и динамического характера данных. Direct3D 10 был разработан, чтобы воспользоваться этим подходом и таким образом, правила доступа для ресурсов были значительно ужесточены по сравнению с Direct3D 9. Для статических ресурсов в идеале следует заполнить ресурс своими данными во время создания. Если модуль был разработан вокруг точки создания, блокировки, заполнения, разблокировки точки разработки Direct3D 9, вы можете отложить население от времени создания с помощью промежуточного ресурса и метода UpdateSubResource в интерфейсе ресурсов.
Эффекты Direct3D 10
Использование системы эффектов Direct3D 10 выходит за рамки этой статьи. Система была написана, чтобы воспользоваться преимуществами архитектуры, предоставляемыми Direct3D 10. Дополнительные сведения об использовании см. в разделе "Эффекты" (Direct3D 10 ).
HLSL без эффектов
Конвейер шейдера Direct3D 10 можно управлять без использования системы эффектов Direct3D 10. Обратите внимание, что в этом экземпляре все буферы констант, шейдер, выборщик и привязка текстур должны управляться самим приложением. Дополнительные сведения см. в примерах ссылки и следующих разделах этого документа:
Компиляция шейдера
Компилятор Direct3D 10 HLSL приносит улучшения в определение языка HLSL и, следовательно, имеет возможность работать в 2 режимах. Для полной поддержки встроенных функций и семантики стиля Direct3D 9 необходимо вызвать компиляцию с помощью флага РЕЖИМА СОВМЕСТИМОСТи, который можно указать на основе компиляции.
Модель шейдера 4.0, определенная семантика языка HLSL и встроенные функции для Direct3D 10, можно найти в HLSL. Основные изменения синтаксиса direct3D 9 HLSL, чтобы получить наибольшее внимание, находятся в области доступа к текстурам. Новый синтаксис является единственной формой, поддерживаемой компилятором вне режима совместимости.
Примечание.
API типа компилятора Direct3D 10 (D3D10CompileShader и D3D10CompileEffectFromMemory) предоставляются средами выполнения Direct3D 10, 10.1 и 11, работающими в Windows Vista и более поздних версиях. API типа компилятора Direct3D 10 имеют те же функции, что и компилятор HLSL, который поставляется в пакете SDK DirectX (декабрь 2006 г.). Этот компилятор HLSL не поддерживает профили Direct3D 10.1 (vs_4_1, ps_4_1, gs_4_1, fx_4_1) и отсутствуют ряд оптимизаций и улучшений. Вы можете получить компилятор HLSL, поддерживающий профили Direct3D 10.1 из последнего устаревшего выпуска пакета SDK DirectX. Сведения о устаревшем пакете SDK DirectX см. в разделе "Где находится пакет SDK DirectX?". Вы можете получить последние Fxc.exe компилятор командной строки и API D3DCompiler из пакета SDK для Windows.
Создание ресурсов шейдера
Создание скомпилированных экземпляров шейдеров вне системы эффектов Direct3D 10 выполняется очень аналогично Direct3D 9, однако в Direct3D 10 важно сохранить сигнатуру входных данных шейдера для последующего использования. Подпись возвращается по умолчанию в составе большого двоичного объекта шейдера, но при необходимости может быть извлечена, чтобы уменьшить требования к памяти. Дополнительные сведения см. в разделе "Использование шейдеров" в Direct3D 10.
Интерфейс слоя отражения шейдера
Уровень отражения шейдера — это интерфейс, с помощью которого могут быть получены сведения о требованиях шейдера. Это особенно полезно при создании связей сборки входных данных (см. ниже), где может потребоваться пройти требования к входным данным шейдера, чтобы обеспечить правильную структуру входных данных шейдеру. Экземпляр интерфейса слоя отражения можно создать одновременно с созданием экземпляра скомпилированного шейдера.
Слой отражения шейдера заменяет методы D3DX9, обеспечивающие аналогичную функциональность. Например, IsParameterUsed заменяется методом GetDesc.
Макеты сборщика входных данных — шейдер вершин / компоновка входного потока
Сборщик входных данных (IA) заменяет объявление потока вершин Direct3D 9, а структура описания очень похожа на форму. Основное различие, которое приносит IA, заключается в том, что созданный объект макета IA должен напрямую сопоставить с определенным форматом входной подписи шейдера. Объект сопоставления, созданный для связывания входного потока с шейдером, может использоваться в любом количестве шейдеров, где входная подпись шейдера совпадает с сигнатурой шейдера, используемой для создания макета ввода.
Чтобы лучше всего управлять конвейером со статическими данными, следует учитывать перемутации формата входного потока для возможных входных сигнатур шейдеров и создавать экземпляры объектов макета IA как можно раньше и повторно использовать их, где это возможно.
Влияние удаления мертвого кода шейдера
В следующем разделе описано значительное различие между Direct3D 9 и Direct3D 10, что, вероятно, требует тщательной обработки в коде подсистемы. Шейдеры, содержащие условные выражения, часто имеют определенные пути кода, удаленные в процессе компиляции. В Direct3D 9 два типа входных данных могут быть удалены (помечены для удаления) при неиспользуемом использовании: входные данные сигнатуры (например, приведенный ниже) и постоянные входные данные. Если конец буфера констант содержит неиспользуемые записи, объявление размера в шейдере будет отражать размер буфера константы без неиспользуемых записей в конце. Оба этих типа входных данных остаются в сигнатурах или буферах констант Direct3D 10 с особым исключением в случае неиспользуемых входных данных констант в конце буфера констант. Это может повлиять на подсистему при обработке больших шейдеров и создании входных макетов. Элементы, которые удаляются с помощью оптимизации недоставленного кода в компиляторе, все равно должны быть объявлены в входной структуре. Следующий пример демонстрирует это:
Пример входной структуры шейдера вершин
struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};
* Удаление мертвого кода Direct3D 9 приведет к удалению объявления в шейдере из-за условного удаления мертвого кода
float4x4 g_WorldViewProjMtx;
static const bool g_bLightMapped = false; // define a compile time constant
VS_INPUT main(VS_INPUT i)
{
VS_INPUT o;
o.pos = mul( i.pos, g_WorldViewProjMtx);
o.uv1 = i.uv1;
if ( g_bLightMapped )
{
o.uv2 = i.uv2;
}
return o;
}
Кроме того, можно сделать его еще более очевидным, что константа является константой времени компиляции со следующим объявлением:
#define LIGHT_MAPPED false
В приведенном выше примере в разделе Direct3D 9 элемент uv2 будет удален из-за оптимизации мертвого кода в компиляторе. В разделе Direct3D 10 мертвый код по-прежнему будет удален, но макет сборщика входных данных шейдера требует определения входных данных. Уровень отражения шейдера предоставляет средства для обработки этой ситуации универсальным образом, в котором можно пройти требования к входным данным шейдера и обеспечить полное описание сопоставления подписей входного потока для шейдера.
Ниже приведен пример функции для обнаружения существования семантического имени или индекса в сигнатуре функции:
// Returns true if the SemanticName / SemanticIndex is used in the input signature.
// pReflector is a previously acquired shader reflection interface.
bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex)
{
D3D10_SHADER_DESC shaderDesc;
D3D10_SIGNATURE_PARAMETER_DESC paramDesc;
Assert(pReflector);
Assert(SemanticName);
pReflector->GetDesc(&shaderDesc);
for (UINT k=0; k<shaderDesc.InputParameters; k++)
{
pReflector->GetInputParameterDesc( k, ¶mDesc);
if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex)
return true;
}
return false;
}
Создание объекта state
При переносе кода подсистемы может помочь изначально использовать набор состояний по умолчанию и отключить все параметры состояния отображения устройства Direct3D 9 или текстуры. Это приведет к отрисовке артефактов, но это самый быстрый способ получить вещи и запустить. Позже можно создать систему управления объектами состояния, которая может использовать составной ключ, чтобы включить максимальное повторное использование количества используемых объектов состояния.
Перенос текстур
Поддерживаемые форматы файлов
Функции D3DXxCreateXXX и D3DXxxSaveXXX , которые создают или сохраняют текстуру из графического файла (например, D3DX10CreateTextureFromFile) поддерживают другой набор форматов файлов в Direct3D 10, чем в Direct3D 9:
Формат файла | Direct3D 9 | Direct3D 10 |
---|---|---|
.bmp | yes | yes |
JPG | yes | yes |
TGA | yes | |
PNG | yes | yes |
DDS | yes | yes |
.ppm | yes | |
.dib | yes | |
.hdr | yes | |
.pfm | yes | |
TIFF | yes | |
.gif | yes | |
.tif | yes |
Дополнительные сведения см. в перечислениях Direct3D 9 D3DXIMAGE_FILEFORMAT с перечислениями D3DX10_IMAGE_FILE_FORMAT для Direct3D 10.
Примечание.
Библиотека служебной программы D3DX (D3DX 9, D3DX 10 и D3DX 11) устарела для Windows 8. Для обработки файлов текстур рекомендуется использовать DirectXTex.
Сопоставление форматов текстур
В следующей таблице показано сопоставление форматов текстур из Direct3D 9 в Direct3D 10. Содержимое в форматах, недоступных в DXGI, необходимо преобразовать с помощью подпрограмм служебной программы.
Формат Direct3D 9 | Формат Direct3D 10 |
---|---|
D3DFMT_UNKNOWN | DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 | Недоступно |
D3DFMT_A8R8G8B8 | DXGI_FORMAT_B8G8R8A8_UNORM & DXGI_FORMAT_B8G8R8A8_UNORM_SRGB вы |
D3DFMT_X8R8G8B8 | DXGI_FORMAT_B8G8R8X8_UNORM & DXGI_FORMAT_B8G8R8X8_UNORM_SRGB no |
D3DFMT_R5G6B5 | DXGI_FORMAT_B5G6R5_UNORM 2 |
D3DFMT_X1R5G5B5 | Недоступно |
D3DFMT_A1R5G5B5 | DXGI_FORMAT_B5G5R5A1_UNORM 3 |
D3DFMT_A4R4G4B4 | DXGI_FORMAT_B4G4R4A4_UNORM DXGI_FORMAT_B4G4R4A4_UNORM DXGI_FORMAT_B4G4R4A4_UNORM |
D3DFMT_R3G3B2 | Недоступно |
D3DFMT_A8 | DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 | Недоступно |
D3DFMT_X4R4G4B4 | Недоступно |
D3DFMT_A2B10G10R10 | DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 | DXGI_FORMAT_R8G8B8A8_UNORM & DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 | Недоступно |
D3DFMT_G16R16 | DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 | Недоступно |
D3DFMT_A16B16G16R16 | DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 | Недоступно |
D3DFMT_P8 | Недоступно |
D3DFMT_L8 | DXGI_FORMAT_R8_UNORM Примечание. Используйте swizzle r в шейдере, чтобы дублировать красный цвет для других компонентов, чтобы получить поведение D3D9. |
D3DFMT_A8L8 | DXGI_FORMAT_R8G8_UNORM Примечание. Используйте swizzle .rrrg в шейдере, чтобы дублировать красный цвет и переместить зеленый цвет в альфа-компоненты, чтобы получить поведение D3D9. |
D3DFMT_A4L4 | Недоступно |
D3DFMT_V8U8 | DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 | Недоступно |
D3DFMT_X8L8V8U8 | Недоступно |
D3DFMT_Q8W8V8U8 | DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 | DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 | Недоступно |
D3DFMT_A2W10V10U10 | Недоступно |
D3DFMT_UYVY | Недоступно |
D3DFMT_R8G8_B8G8 | DXGI_FORMAT_G8R8_G8B8_UNORM (в DX9 данные были масштабируются на 255,0f, но это можно обрабатывать в коде шейдера). |
D3DFMT_YUY2 | Недоступно |
D3DFMT_G8R8_G8B8 | DXGI_FORMAT_R8G8_B8G8_UNORM (в DX9 данные были масштабируются на 255,0f, но это можно обрабатывать в коде шейдера). |
D3DFMT_DXT1 | DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 | DXGI_FORMAT_BC1_UNORM и DXGI_FORMAT_BC1_UNORM_SRGB Примечание. DXT1 и DXT2 одинаковы с точки зрения API или оборудования... единственное различие было "premultiplied alpha", которое может отслеживаться приложением и не требует отдельного формата. |
D3DFMT_DXT3 | DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 | DXGI_FORMAT_BC2_UNORM и DXGI_FORMAT_BC2_UNORM_SRGB Примечание. DXT3 и DXT4 одинаковы с точки зрения API/оборудования... единственное различие было "premultiplied alpha", которое может отслеживаться приложением и не требует отдельного формата. |
D3DFMT_DXT5 | DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 & D3DFMT_D16_LOCKABLE | DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 | Недоступно |
D3DFMT_D15S1 | Недоступно |
D3DFMT_D24S8 | Недоступно |
D3DFMT_D24X8 | Недоступно |
D3DFMT_D24X4S4 | Недоступно |
D3DFMT_D16 | DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE | DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 | Недоступно |
D3DFMT_S1D15 | Недоступно |
D3DFMT_S8D24 | DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 | Недоступно |
D3DFMT_X4S4D24 | Недоступно |
D3DFMT_L16 | DXGI_FORMAT_R16_UNORM Примечание. Используйте swizzle r в шейдере, чтобы дублировать красный цвет для других компонентов, чтобы получить поведение D3D9. |
D3DFMT_INDEX16 | DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 | DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 | DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 | Недоступно |
D3DFMT_R16F | DXGI_FORMAT_R16_FLOAT |
D3DFMT_G16R16F | DXGI_FORMAT_R16G16_FLOAT |
D3DFMT_A16B16G16R16F | DXGI_FORMAT_R16G16B16A16_FLOAT |
D3DFMT_R32F | DXGI_FORMAT_R32_FLOAT |
D3DFMT_G32R32F | DXGI_FORMAT_R32G32_FLOAT |
D3DFMT_A32B32G32R32F | DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DFMT_CxV8U8 | Недоступно |
D3DDECLTYPE_FLOAT1 | DXGI_FORMAT_R32_FLOAT |
D3DDECLTYPE_FLOAT2 | DXGI_FORMAT_R32G32_FLOAT |
D3DDECLTYPE_FLOAT3 | DXGI_FORMAT_R32G32B32_FLOAT |
D3DDECLTYPE_FLOAT4 | DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DDECLTYPED3DCOLOR | Недоступно |
D3DDECLTYPE_UBYTE4 | DXGI_FORMAT_R8G8B8A8_UINT Примечание. Шейдер получает значения UINT, но если требуется целочисленное целое значение стиля Direct3D 9 (0,0f, 1.0f... 255.f), UINT можно просто преобразовать в float32 в шейдере. |
D3DDECLTYPE_SHORT2 | DXGI_FORMAT_R16G16_SINT Примечание. Шейдер получает значения SINT, но если требуется целочисленное целочисленное значение стиля Direct3D 9, SINT можно просто преобразовать в float32 в шейдере. |
D3DDECLTYPE_SHORT4 | DXGI_FORMAT_R16G16B16A16_SINT Примечание. Шейдер получает значения SINT, но если требуется целочисленное целое значение стиля Direct3D 9, SINT можно просто преобразовать в float32 в шейдере. |
D3DDECLTYPE_UBYTE4N | DXGI_FORMAT_R8G8B8A8_UNORM |
D3DDECLTYPE_SHORT2N | DXGI_FORMAT_R16G16_SNORM |
D3DDECLTYPE_SHORT4N | DXGI_FORMAT_R16G16B16A16_SNORM |
D3DDECLTYPE_USHORT2N | DXGI_FORMAT_R16G16_UNORM |
D3DDECLTYPE_USHORT4N | DXGI_FORMAT_R16G16B16A16_UNORM |
D3DDECLTYPE_UDEC3 | Недоступно |
D3DDECLTYPE_DEC3N | Недоступно |
D3DDECLTYPE_FLOAT16_2 | DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 | DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' | DXGI_FORMAT_BC4_UNORM |
FourCC 'ATI2' | DXGI_FORMAT_BC5_UNORM |
¹DXGI 1.1, который входит в среду выполнения Direct3D 11, включает форматы BGRA. Однако поддержка этих форматов является необязательной для устройств Direct3D 10 и 10.1 с драйверами, реализованными в модели драйвера windows (WDDM) для Windows Vista (WDDM 1.0). Вместо этого рекомендуется использовать DXGI_FORMAT_R8G8B8A8_UNORM. Кроме того, вы можете создать устройство с D3D10_CREATE_DEVICE_BGRA_SUPPORT , чтобы обеспечить поддержку компьютеров только с средой выполнения Direct3D 11.0 и установленным драйвером WDDM 1.1 или более поздней версии.
²DXGI 1.0, определенные 5:6:5 и 5:5:5:1, но они не поддерживаются средой выполнения Direct3D 10.x или Direct3D 11.0. Эти форматы при необходимости поддерживаются с DXGI 1.2 в среде выполнения DirectX 11.1, которая требуется для адаптеров видео на уровне 11.1 и WDDM 1.2 (модель драйвера отображения начиная с Windows 8) и уже поддерживается на уровнях компонентов 10level9.
FxDXGI 1.2 представил формат 4:4:4:4. Этот формат также поддерживается в среде выполнения DirectX 11.1, которая требуется для адаптеров видео уровня 11.1 и драйверов WDDM 1.2 и уже поддерживается на уровне компонентов 10level9.
Для несжатых форматов DXGI ограничивает поддержку произвольных шаблонов пикселей; все несжатые форматы должны иметь тип RGBA. Для этого может потребоваться перевораживание существующих форматов пикселей ресурсов, которые рекомендуется вычислить как автономный предварительный проход, где это возможно.
Перенос шейдеров
Шейдеры Direct3D 10 создаются в HLSL
Direct3D 10 ограничивает использование языка сборок только в целях отладки, поэтому все шейдеры сборки, используемые в Direct3D 9, должны быть преобразованы в HLSL.
Подписи шейдера и компоновка
Мы обсудили требования для компоновки входной сборки с входными подписями шейдера вершин в начале этого документа (см. выше). Обратите внимание, что среда выполнения Direct3D 10 также ужесточила требования к этапу для промежуточной компоновки между шейдерами. Это изменение повлияет на источники шейдеров, где привязка между этапами, возможно, не была полностью описана в Direct3D 9. Например:
VS_OUTPUT PS_INPUT
float4 pos : SV_POSITION; float4 pos : SV_POSITION;
float4 uv1 : TEXCOORD1; float4 uv1 : TEXCOORD1;
float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; *
float4 Color : TEXCOORD6; float4 color : TEXCOORD6;
* Нарушенная компоновка VS - PS - несмотря на то, что шейдер пикселей может не быть заинтересован в полной матрице, компоновка должна указывать полный float4x3.
Обратите внимание, что семантика компоновки между этапами должна совпадать точно, входные данные целевых этапов могут быть префиксом выходных значений. В приведенном выше примере шейдер пикселей может иметь позицию и texcoord1 в качестве единственных входных данных, но он не мог иметь позицию и texcoord2 в качестве единственных входных данных из-за ограничений упорядочения.
Компоновки этапов шейдера HLSL
Связь между шейдерами может происходить в любой из следующих точек в конвейере:
- Сборщик входных данных в шейдер вершин
- Шейдер вершин для шейдера пикселей
- Шейдер вершин для геометрического шейдера
- Шейдер вершин для потоковой передачи
- Шейдер геометрии для шейдера пикселей
- Шейдер геометрии для потоковой передачи
Буферы констант
Чтобы упростить перенос содержимого из Direct3D 9, начальный подход к управлению константами вне системы эффектов может включать создание одного буфера констант, содержащего все необходимые константы. Важно, чтобы производительность упорядочила константы в буферы по ожидаемой частоте обновления. Эта организация сократит количество избыточных констант до минимума.
Пользовательские плоскости клипов в HLSL на уровне компонентов 9 и выше
Начиная с Windows 8, можно использовать атрибут функции клиппланов в объявлении функции HLSL, а не SV_ClipDistance, чтобы сделать шейдер работой на уровне компонентов 9_x, а также уровень компонентов 10 и выше. Дополнительные сведения см. в разделе "Плоскости клипов пользователей" на аппаратном уровне 9 компонентов.
Дополнительные различия Direct3D 10 для просмотра
Целые числа в качестве входных данных
В Direct3D 9 не было реальной аппаратной поддержки целых типов данных, однако оборудование Direct3D 10 поддерживает явные типы целых чисел. Если у вас есть данные с плавающей запятой в буфере вершин, у вас должны быть входные данные с плавающей запятой. В противном случае целочисленный тип будет битовое представление значения с плавающей запятой. Целочисленный тип не допускается для входных данных шейдера пикселей, если значение не отмечено для интерполяции (см . модификаторы интерполяции).
Курсоры мыши
В предыдущих версиях Windows стандартные подпрограммы курсора мыши GDI не работали правильно на всех полноэкранных эксклюзивных устройствах. Api SetCursorProperties, ShowCursor и SetCursorPosition были добавлены для обработки этих случаев. Так как версия GDI Windows Vista полностью понимает поверхности DXGI , для этого специализированного API курсора мыши не требуется, поэтому нет эквивалента Direct3D 10. Приложения Direct3D 10 должны вместо этого использовать стандартные подпрограммы курсора мыши GDI для курсоров мыши.
Сопоставление Texels с пикселями в Direct3D 10
В Direct3D 9 центры текселя и пиксельные центры были половиной единицы между (см . непосредственное сопоставление Texels с пикселями (Direct3D 9)). В Direct3D 10 центры текселя уже находятся в полусекундах, поэтому нет необходимости сдвигать координаты вершин вообще.
Отрисовка четырехэкранных четырехэкранных квадратов более прямая с Direct3D 10. Четырехэкранные квадраты должны быть определены в пространстве клипов (-1,1) и просто передаются через шейдер вершин без изменений. Таким образом, не нужно перезагружать буфер вершин при каждом изменении разрешения экрана, и нет дополнительной работы в шейдере пикселей для управления координатами текстуры.
Изменения поведения подсчета ссылок
В отличие от предыдущих версий Direct3D различные функции Set не будут содержать ссылку на объекты устройств. Это означает, что приложение должно убедиться, что он содержит ссылку на объект до тех пор, пока этот объект должен быть привязан к конвейеру. Когда число ссылок объекта удаляется до нуля, объект будет отсоскирован из конвейера по мере его уничтожения. Этот стиль ссылочного хранения также называется слабым ссылочным удержанием, поэтому каждое расположение привязки в объекте Device содержит слабую ссылку на интерфейс или объект. Если явно не указано иное, это поведение должно быть принято для всех методов Set. При уничтожении объекта точка привязки должна быть задана как NULL , уровень отладки выдает предупреждение. Обратите внимание, что вызовы методов Get устройства, таких как OMGetRenderTargets , увеличивают количество возвращаемых объектов ссылок.
Тестовый уровень совместной работы
Функции API Direct3D 9 TestCooperativeLevel аналогичны настройке DXGI_PRESENT_TEST при вызове Present.
StretchRect
Функция, аналогичная методу Direct3D 9 IDirect3DDevice9::StretchRect , недоступна в Direct3D 10 и 10.1. Чтобы скопировать поверхности ресурсов, используйте ID3D10Device::CopySubresourceRegion. Для операций изменения размера отрисовка в текстуру с помощью фильтрации текстур. Для преобразования поверхностей MSAA в поверхности, отличных от MSAA, используйте ID3D10Device::ResolveSubresource.
Дополнительные различия Direct3D 10.1
Windows Vista с пакетом обновления 1 (SP1) включает дополнительное обновление до Direct3D 10 и Direct3D 10.1, которое предоставляет следующие дополнительные аппаратные возможности:
- Шейдеры MSAA на выборку
- Обратная чтение глубины MSAA
- Независимые режимы смешивания для целевого объекта отрисовки
- Массивы карт куба
- Отрисовка в форматы блочного сжатия (BC)
Обновление Direct3D 10.1 добавило поддержку следующих новых интерфейсов, производных от существующих интерфейсов:
Обновление Direct3D 10.1 также включало следующие дополнительные структуры:
API Direct3D 10.1 включает в себя новую концепцию с именем уровня компонентов. Это означает, что вы можете использовать API Direct3D 10.1 для использования оборудования Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) или Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1). Так как API Direct3D 10.1 является производным от интерфейсов Direct3D 10, приложения могут создавать устройство Direct3D 10.1, а затем использовать его в качестве устройства Direct3D 10.0, за исключением тех случаев, когда требуются новые функции 10.1 (при условии, что уровень компонентов D3D10_FEATURE_LEVEL_10_1 присутствует и поддерживает эти функции).
Примечание.
Устройства Direct3D 10.1 могут использовать существующие профили шейдера HLSL 10.0 (vs_4_0, ps_4_0, gs_4_0) и новые профили 10.1 (vs_4_1, ps_4_1, gs_4_1) с дополнительными инструкциями и возможностями HLSL.
Windows 7 содержала дополнительное обновление для API Direct3D 10.1, включенного в среду выполнения Direct3D 11. Это обновление добавляет поддержку следующих уровней компонентов:
Windows 7 также добавила поддержку Direct3D 10.1 для платформы расширенной растеризации Windows (WARP). Драйвер WARP можно указать с помощью D3D10_DRIVER_TYPE_WARP.
Дополнительные сведения о функциях Direct3D 10.1 см. в разделе "Функции Direct3D 10.1" и перечисление D3D10_FEATURE_LEVEL1.
См. также