Функция D3DCompile2 (d3dcompiler.h)

Компилирует код HLSL (Microsoft High Level Shader Language) в байт-код для заданного целевого объекта.

Синтаксис

HRESULT D3DCompile2(
  [in]            LPCVOID                pSrcData,
  [in]            SIZE_T                 SrcDataSize,
  [in, optional]  LPCSTR                 pSourceName,
  [in, optional]  const D3D_SHADER_MACRO *pDefines,
  [in, optional]  ID3DInclude            *pInclude,
  [in]            LPCSTR                 pEntrypoint,
  [in]            LPCSTR                 pTarget,
  [in]            UINT                   Flags1,
  [in]            UINT                   Flags2,
  [in]            UINT                   SecondaryDataFlags,
  [in, optional]  LPCVOID                pSecondaryData,
  [in]            SIZE_T                 SecondaryDataSize,
  [out]           ID3DBlob               **ppCode,
  [out, optional] ID3DBlob               **ppErrorMsgs
);

Параметры

[in] pSrcData

Тип: LPCVOID

Указатель на некомпилированные данные шейдера (код ASCII HLSL).

[in] SrcDataSize

Тип: SIZE_T

Размер (в байтах) блока памяти, на который указывает pSrcData .

[in, optional] pSourceName

Тип: LPCSTR

Необязательный указатель на константную строку со значением NULL, содержащую имя, определяющее исходные данные для использования в сообщениях об ошибках. Если не используется, задайте значение NULL.

[in, optional] pDefines

Тип: const D3D_SHADER_MACRO*

Необязательный массив D3D_SHADER_MACRO структур, определяющих макросы шейдеров. Каждое определение макроса содержит имя и определение, завершаемое пустым значением. Если не используется, задайте значение NULL. Последняя структура в массиве выступает в качестве признака конца и должна иметь значение NULL для всех членов.

[in, optional] pInclude

Тип: ID3DInclude*

Указатель на интерфейс ID3DInclude , используемый компилятором для обработки включаемого файла. Если для этого параметра задано значение NULL , а шейдер содержит #include, возникает ошибка компиляции. Можно передать макрос D3D_COMPILE_STANDARD_FILE_INCLUDE , который является указателем на обработчик включения по умолчанию. Этот обработчик включения по умолчанию включает файлы, относящиеся к текущему каталогу, и файлы, относящиеся к каталогу исходного исходного файла. При использовании D3D_COMPILE_STANDARD_FILE_INCLUDE необходимо указать имя исходного файла в параметре pSourceName ; компилятор наследует исходный относительный каталог от pSourceName.

#define D3D_COMPILE_STANDARD_FILE_INCLUDE ((ID3DInclude*)(UINT_PTR)1)

[in] pEntrypoint

Тип: LPCSTR

Указатель на константную строку, завершающуюся null, которая содержит имя функции точки входа шейдера, с которой начинается выполнение шейдера. При компиляции эффекта D3DCompile2 игнорирует pEntrypoint; Рекомендуется задать для pEntrypoint значение NULL , так как рекомендуется задать для параметра указателя значение NULL , если вызываемая функция не будет его использовать.

[in] pTarget

Тип: LPCSTR

Указатель на константную строку, завершающуюся нулевым значением, которая указывает целевой объект шейдера или набор компонентов шейдера для компиляции. Целевым объектом шейдера может быть модель шейдера (например, модель шейдера 2, модель шейдера 3, модель шейдера 4 или модель шейдера 5). Целевой объект также может быть типом эффекта (например, fx_4_1). Сведения о целевых объектах, которые поддерживаются различными профилями, см. в разделе Указание целевых объектов компилятора.

[in] Flags1

Тип: UINT

Сочетание констант компиляции D3D шейдера, которые объединяются с помощью побитовой операции OR . Полученное значение указывает, как компилятор компилирует код HLSL.

[in] Flags2

Тип: UINT

Сочетание эффектов D3D компилировать константы эффекта , которые объединяются с помощью побитовой операции OR . Полученное значение указывает, как компилятор компилирует эффект. При компиляции шейдера, а не файла эффекта , D3DCompile2 игнорирует Flags2; Рекомендуется задать для параметра Flags2 значение 0, так как рекомендуется задать для параметра, не являющегося указателем, равным нулю, если вызываемая функция не будет использовать его.

[in] SecondaryDataFlags

Тип: UINT

Сочетание следующих флагов, объединенных с помощью побитовой операции OR . Полученное значение указывает, как компилятор компилирует код HLSL.

Flag Описание
D3DCOMPILE_SECDATA_MERGE_UAV_SLOTS (0x01) Объединение слотов неупорядоченного представления доступа (UAV) во вторичных данных, на которые указывает параметр pSecondaryData .
D3DCOMPILE_SECDATA_PRESERVE_TEMPLATE_SLOTS (0x02) Сохраните слоты шаблонов во вторичных данных, на которые указывает параметр pSecondaryData .
D3DCOMPILE_SECDATA_REQUIRE_TEMPLATE_MATCH (0x04) Требовать, чтобы шаблоны во вторичных данных, которые указывает параметр pSecondaryData , должны совпадать при компиляции компилятором кода HLSL.

Если pSecondaryData имеет значение NULL, установите значение 0.

[in, optional] pSecondaryData

Тип: LPCVOID

Указатель на вторичные данные. Если вы не передаете вторичные данные, задайте значение NULL. Используйте эти дополнительные данные для выравнивания слотов UAV в двух шейдерах. Предположим, что у шейдера A есть БПЛА и они привязаны к некоторым слотам. Чтобы скомпилировать шейдер B таким образом, чтобы БПЛА с теми же именами сопоставлялись в B с теми же слотами, что и в A, передайте байт-код A в D3DCompile2 в качестве дополнительных данных.

[in] SecondaryDataSize

Тип: SIZE_T

Размер (в байтах) блока памяти, на который указывает pSecondaryData . Если pSecondaryData имеет значение NULL, установите значение 0.

[out] ppCode

Тип: ID3DBlob**

Указатель на переменную, получающую указатель на интерфейс ID3DBlob , который можно использовать для доступа к скомпилированному коду.

[out, optional] ppErrorMsgs

Тип: ID3DBlob**

Указатель на переменную, получающую указатель на интерфейс ID3DBlob , который можно использовать для доступа к сообщениям об ошибках компилятора, или ЗНАЧЕНИЕ NULL , если ошибок нет.

Возвращаемое значение

Тип: HRESULT

Возвращает один из кодов возврата Direct3D 11.

Комментарии

Разница между D3DCompile2 и D3DCompile заключается в том, что D3DCompile2 принимает некоторые необязательные параметры (SecondaryDataFlags, pSecondaryData и SecondaryDataSize), которые можно использовать для управления некоторыми аспектами создания байт-кода. Дополнительные сведения см. в описании этих параметров. В противном случае нет никакой разницы в эффективности байт-кода, созданного между D3DCompile2 и D3DCompile.

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

Для компиляции автономных шейдеров рекомендуется использовать средство компилятора Effect. Если вы не можете скомпилировать все шейдеры заранее, рассмотрите возможность компиляции более дорогих и тех, которые требуются для запуска и наиболее чувствительных к производительности путей, а также компиляции остальных во время выполнения. Процесс, аналогичный приведенному ниже, можно использовать для компиляции загруженного или созданного шейдера в приложении UWP без блокировки потока пользовательского интерфейса.

  • Используя Visual Studio 2015+ для разработки приложения UWP, добавьте новый элемент shader.hlsl.

    • В представлении Папка решения Visual Studio выберите элемент shaders.hlsl , щелкните правой кнопкой мыши пункт Свойства.
    • Убедитесь, что для элемента Содержимое задано значение Да.
    • Убедитесь, что для параметра Тип элемента задано значение Текст.
    • Добавьте кнопку в XAML, назовите ее соответствующим образом (TheButton в этом примере) и добавьте обработчик click .
  • Теперь добавьте эти элементы в файл .cpp:

    #include <ppltasks.h>
    #include <d3dcompiler.h>
    #include <Robuffer.h>
    
  • Используйте следующий код для вызова D3DCompile2. Обратите внимание, что здесь нет проверки или обработки ошибок, а также, что этот код демонстрирует, что вы можете выполнять операции ввода-вывода и компиляции в фоновом режиме, что делает пользовательский интерфейс более гибким.

void App1::DirectXPage::TheButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
  std::shared_ptr<Microsoft::WRL::ComPtr<ID3DBlob>> blobRef = std::make_shared<Microsoft::WRL::ComPtr<ID3DBlob>>();

  // Load a file and compile it.
  auto fileOp = Windows::ApplicationModel::Package::Current->InstalledLocation->GetFileAsync(L"shader.hlsl");
  create_task(fileOp).then([this](Windows::Storage::StorageFile^ file) -> IAsyncOperation<Windows::Storage::Streams::IBuffer^>^
  {
    // Do file I/O in background thread (use_arbitrary).
    return Windows::Storage::FileIO::ReadBufferAsync(file);
  }, task_continuation_context::use_arbitrary())
    .then([this, blobRef](Windows::Storage::Streams::IBuffer^ buffer)
  {
    // Do compilation in background thread (use_arbitrary).

    // Cast to Object^, then to its underlying IInspectable interface.
    Microsoft::WRL::ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(buffer));

    // Query the IBufferByteAccess interface.
    Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
    insp.As(&bufferByteAccess);

    // Retrieve the buffer data.
    byte *pBytes = nullptr;
    bufferByteAccess->Buffer(&pBytes);

    Microsoft::WRL::ComPtr<ID3DBlob> blob;
    Microsoft::WRL::ComPtr<ID3DBlob> errMsgs;
    D3DCompile2(pBytes, buffer->Length, "shader.hlsl", nullptr, nullptr, "main", "ps_5_0", 0, 0, 0, nullptr, 0, blob.GetAddressOf(), errMsgs.GetAddressOf());
    *blobRef = blob;
  }, task_continuation_context::use_arbitrary())
    .then([this, blobRef]()
  {
    // Update UI / use shader on foreground thread.
    wchar_t message[40];
    swprintf_s(message, L"blob is %u bytes long", (unsigned)(*blobRef)->GetBufferSize());
    this->TheButton->Content = ref new Platform::String(message);
  }, task_continuation_context::use_current());
}

Требования

Требование Значение
Целевая платформа Windows
Header d3dcompiler.h
Библиотека D3DCompiler.lib
DLL D3DCompiler_47.dll

См. также