Как собрать шейдеры HLSL несколько раз в Visual Studio? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть шейдеры HLSL, добавленные в мой проект Visual Studio, и они автоматически компилируются в cso-файлы как часть процесса сборки.Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно компилировать их несколько раз, используя разные модели шейдеров, потому что "/ 4_0_level_9_3" работает на DirectX 11, но не на DirectX 9, в то время как "/ 3_0" работает только на DirectX 9, но нев DirectX 11.

Добавление одних и тех же файлов более одного раза в проект Visual Studio не работает, и я хотел бы избежать копирования исходных файлов HLSL, поскольку это увеличивает усилия по обслуживанию и потенциальные причины ошибок.Я не могу создать отдельные цели / конфигурацию в Visual Studio для достижения этой цели, потому что мне нужно поддерживать обе версии DirectX в исполняемом файле (переключаемые во время выполнения).

Есть ли способ указать несколько компиляций (разныемодели шейдеров и другой выходной файл) для одного файла HLSL в Visual Studio?

1 Ответ

0 голосов
/ 25 апреля 2018

Поместите свой код шейдера в файл .hlsli, добавьте его в свой проект. Создайте для каждой комбинации шейдера и модели файл .hlsl, который будет #include вашего .hlsli файла. Добавьте каждый .hlsl в свой проект и настройте параметры файла соответствующим образом.

Файл 1 (установлен для исключения из сборки)

// MyShader.hlsli

PS_INPUT VertexShader( VS_INPUT input )
{
...
}

float4 PixelShader( PS_INPUT input)
{
...
}

Файл 2 (для построения в качестве вершинного шейдера, модель шейдера 9_3, точка входа VertexShader)

// MyShader_VS.hlsl

#include "MyShader.hlsl"    

Файл 3 (устанавливается как пиксельный шейдер, модель шейдера 9_3, точка входа PixelShader)

// MyShader_PS.hlsl

#include "MyShader.hlsl"    

Файл 4 (устанавливается для построения в качестве вершинного шейдера, модель шейдера 4.0, точка входа VertexShader)

// MyShader_VS4.hlsl

#include "MyShader.hlsl"    

Файл 5 (для сборки в виде пиксельного шейдера, модель шейдера 4.0, точка входа PixelShader)

// MyShader_PS4.hlsl

#include "MyShader.hlsl"    

Обратите внимание, что вы можете немного упростить жизнь, отредактировав файл vcxproj вручную с помощью текстового редактора. Найдите Label="UserMacros", а затем в ItemDefinitionGroup для каждой конфигурации сразу после этого добавьте раздел для <FXCompile>, чтобы установить лучшие значения по умолчанию (вместо 4.0_level_9_1):

<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Link>
...
</Link>
<ClCompile>
...
</ClCompile>
<FXCompile>
  <ShaderModel>4.0_level_9_3</ShaderModel>
</FXCompile>

Если вы специально не ориентируетесь на системы Windows XP, использование устаревшего API Direc3D 9 не имеет большого смысла. Просто используйте DirectX 11 Feature Level 9.3+ для работы с видеокартами эпохи Shader Model 2.0 / 3.0. Главной ценностью Shader Model 3.0 была выборка вершинных текстур, которая так или иначе не была реализована одним из основных поставщиков. Профиль 4_0_level_9_3 уже создает шейдер как 2.0 и 4.0 в одном и том же BLOB-объекте.

...