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

Заметка

В этом разделе рассматривается компилятор 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 использует компилятор кода HLSL fxc.exe или dxc.exe HLSL для компиляции исходных файлов шейдера HLSL в файлы объектов двоичного шейдера или в массивы байтов, определенные в файлах заголовков. Как компилятор кода HLSL компилирует каждый исходный файл шейдера в проекте, зависит от того, как указать свойство Ouput Files для этого файла. Дополнительные сведения о страницах свойств HLSL см. в разделе страницы свойств HLSL.

Используемый метод компиляции обычно зависит от размера исходного файла шейдера HLSL. Если в заголовке включен большой объем байтового кода, вы увеличиваете размер и начальное время загрузки приложения. Кроме того, весь байткод должен находиться в памяти даже после создания шейдера, что ведет к растрате ресурсов. Но при включении кода байтов в заголовок можно уменьшить сложность кода и упростить создание шейдера.

Теперь рассмотрим различные способы компиляции кода шейдера и соглашения относительно расширений файлов для него.

Использование расширений файлов кода шейдера

Чтобы соответствовать соглашению Майкрософт, используйте эти расширения файлов для кода шейдера:

  • Файл с расширением .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 файлы, как правило, расположены вместе с другими продуктами сборки Visual Studio (VS). Пример реализации см. в ReadData.h.

Компиляция во время процесса сборки для формирования файлов заголовков

Если вы компилируете hlsl-файлы в массивы байтов, определенные в файлах заголовков, необходимо включить эти файлы заголовков в код. В этом примере кода свойство Output 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

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