Функция 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 |