Компиляция шейдеров
Примечание
В этом разделе рассматривается компилятор, используемый FXC.EXE
для моделей шейдеров 2–5.1. Для модели шейдера 6 используйте DXC.EXE
вместо нее , что описано в статье Использование dxc.exe и dxcompiler.dll. Visual Studio будет использовать DXC.EXE
автоматически при выборе модели шейдера 6 для конфигурации страницы свойств HLSL.
Microsoft Visual Studio может компилировать код шейдера из файлов *.hlsl и *.fx, которые вы включаете в проект C++.
В процессе сборки Visual Studio использует компилятор кода fxc.exe или dxc.exe HLSL для компиляции исходных файлов шейдера HLSL в двоичные файлы объектов шейдера или в массивы байтов, определенные в файлах заголовков. Способ компиляции компилятором кода HLSL каждого исходного файла шейдера в проекте зависит от того, как вы укажете свойство Ouput Files для этого файла. Дополнительные сведения о страницах свойств HLSL см. в разделе Страницы свойств HLSL.
Используемый метод компиляции обычно зависит от размера исходного файла шейдера HLSL. При включении большого количества байтового кода в заголовок увеличивается размер и время начальной загрузки приложения. Кроме того, весь байтовый код должен находиться в памяти даже после создания шейдера, что приводит к трате ресурсов. Но при включении байтового кода в заголовок можно снизить сложность кода и упростить создание шейдера.
Теперь рассмотрим различные способы компиляции кода шейдера и соглашения для расширений файлов для кода шейдера.
- Использование расширений файлов кода шейдера
- Компиляция во время сборки в объектные файлы
- Компиляция во время сборки в файлы заголовков
- Компиляция с помощью D3DCompileFromFile
- См. также
- Связанные темы
Использование расширений файлов кода шейдера
В соответствии с соглашением Майкрософт используйте следующие расширения файлов для кода шейдера:
- Файл с расширением HLSL содержит исходный код HLSL. Старое расширение .FX также поддерживается, но обычно связано с устаревшей системой эффектов.
- Файл с расширением .cso содержит скомпилированный объект шейдера.
- Файл с расширением .h — это файл заголовка, но в контексте кода шейдера этот файл заголовка определяет массив байтов, содержащий данные шейдера. Другие распространенные расширения для заголовков кода шейдера HLSL включают .hlsli и .fxh.
Компиляция во время сборки в объектные файлы
Если скомпилировать HLSL-файлы в двоичные файлы объектов шейдера, приложению необходимо считывать данные из этих файлов объектов (CSO является расширением по умолчанию для этих файлов объектов), назначать данные массивам байтов и создавать объекты шейдера из этих массивов байтов. Например, чтобы создать вершинный шейдер (ID3D11VertexShader**), вызовите метод ID3D11Device::CreateVertexShader с массивом байтов, который содержит скомпилированный код байтов вершинного шейдера. В этом примере кода свойство Ouput Files для файла SimpleVertexShader.hlsl указывает на компиляцию в объектный файл SimpleVertexShader.cso.
auto vertexShaderBytecode = ReadData("SimpleVertexShader.cso");
ComPtr<ID3D11VertexShader> vertexShader;
DX::ThrowIfFailed(
m_d3dDevice->CreateVertexShader(
vertexShaderBytecode->Data,
vertexShaderBytecode->Length,
nullptr,
&vertexShader
)
Вспомогательное средство ReadData будет искать в текущем рабочем каталоге, а также в том же каталоге, что и EXE-файл текущего процесса, так как CSO-файлы обычно находятся вместе с другими продуктами сборки VS. Пример реализации см. в разделе ReadData.h .
Компиляция во время сборки в файлы заголовков
При компиляции HLSL-файлов в массивы байтов, определенные в файлах заголовков, необходимо включить эти файлы заголовков в код. В этом примере кода свойство Ouput Files для файла PixelShader.hlsl указывает для компиляции в массив g_psshader байтов, определенный в файле заголовка PixelShader.h.
namespace
{
include "PixelShader.h"
}
...
ComPtr<ID3D11PixelShader> m_pPixelShader;
hr = pDevice->CreatePixelShader(g_psshader, sizeof(g_psshader), nullptr, &m_pPixelShader);
Компиляция с помощью D3DCompileFromFile
Вы также можете использовать функцию D3DCompileFromFile во время выполнения для компиляции кода шейдера для Direct3D 11. Дополнительные сведения о том, как это сделать, см. в разделе Практическое руководство. Компиляция шейдера.
Примечание
Приложения Магазина Windows поддерживают использование D3DCompileFromFile для разработки, но не для развертывания.
См. также
Руководство по программированию для HLSL
Связанные темы