Вопросы 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

Процесс отрисовки с помощью устройства 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.

Создание ресурсов

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.

Страница руководства программистов по доступу к ресурсам

Пример CubeMap

Статический и динамический доступ к ресурсам

Для обеспечения оптимальной производительности приложения должны секционировать свои данные с точки зрения статического и динамического характера данных. Direct3D 10 был разработан, чтобы воспользоваться этим подходом и таким образом, правила доступа для ресурсов были значительно ужесточены по сравнению с Direct3D 9. Для статических ресурсов в идеале следует заполнить ресурс своими данными во время создания. Если модуль был разработан вокруг точки создания, блокировки, заполнения, разблокировки точки разработки Direct3D 9, вы можете отложить население от времени создания с помощью промежуточного ресурса и метода UpdateSubResource в интерфейсе ресурсов.

Эффекты Direct3D 10

Использование системы эффектов Direct3D 10 находится за пределами область этой статьи. Система была написана, чтобы воспользоваться преимуществами архитектуры, предоставляемыми Direct3D 10. Дополнительные сведения об использовании см. в разделе "Эффекты" (Direct3D 10 ).

HLSL без эффектов

Конвейер шейдера Direct3D 10 можно управлять без использования системы эффектов Direct3D 10. Обратите внимание, что в этом экземпляре все буферы констант, шейдер, выборщик и привязка текстур должны управляться самим приложением. Дополнительные сведения см. в примерах ссылки и следующих разделах этого документа:

Пример HLSL без эффектов

Компиляция шейдера

Компилятор 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 HLSL и API D3DCompiler из пакета SDK для Windows.

 

Создание ресурсов шейдера

Создание скомпилированных экземпляров шейдеров вне системы эффектов Direct3D 10 выполняется очень аналогично Direct3D 9, однако в Direct3D 10 важно сохранить сигнатуру входных данных шейдера для последующего использования. Подпись возвращается по умолчанию в составе большого двоичного объекта шейдера, но при необходимости может быть извлечена, чтобы уменьшить требования к памяти. Дополнительные сведения см. в разделе "Использование шейдеров" в Direct3D 10.

Интерфейс слоя шейдера Рефлексия ion

Уровень отражения шейдера — это интерфейс, с помощью которого могут быть получены сведения о требованиях шейдера. Это особенно полезно при создании связей сборки входных данных (см. ниже), где может потребоваться пройти требования к входным данным шейдера, чтобы обеспечить правильную структуру входных данных шейдеру. Экземпляр интерфейса слоя отражения можно создать одновременно с созданием экземпляра скомпилированного шейдера.

Слой отражения шейдера заменяет методы 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, &paramDesc);
        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 x x
JPG x x
TGA x
PNG x x
DDS x x
.Ppm x
.Dib x
.Hdr x
.Pfm x
TIFF x
.gif x
.tif x

 

Дополнительные сведения см. в перечислениях 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.

Руководство по программированию для Direct3D 10