Поделиться через


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

Примечание

В этом разделе рассматривается компилятор, используемый 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. При включении большого количества байтового кода в заголовок увеличивается размер и время начальной загрузки приложения. Кроме того, весь байтовый код должен находиться в памяти даже после создания шейдера, что приводит к трате ресурсов. Но при включении байтового кода в заголовок можно снизить сложность кода и упростить создание шейдера.

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

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

В соответствии с соглашением Майкрософт используйте следующие расширения файлов для кода шейдера:

  • Файл с расширением 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

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