Premake5: Как создавать шейдеры HLSL?

Я изо всех сил пытаюсь понять, как настроить мои шейдеры hlsl для работы с Premake5 и Visual Studio 2017.

Я понятия не имею, как сказать Premake5 скомпилировать мои шейдеры hlsl в качестве шага перед сборкой.

Вот мои цели на этом этапе перед сборкой:

  • Specify shader model
  • Specify debug/release compilation
  • Only compile files that have changed
  • Produce dxasm files
  • Place resulting *.asms and *.cso in appropriate release/debug folders

Обновление 1: Изучив немного больше, я обнаружил, что в Premake5 есть действие, что делает прямую ссылку на FxCompile.

Обновление 2: Благодаря мукунде. Я смог отлично настроить свой проект! Мне пришлось собрать premake5 из исходного кода, чтобы запустить этот сценарий premake.

Потому что по состоянию на март 2019 года распространяемый двоичный файл не поддерживает шейдерную модель выше 5.

   hf.deactivate_filter()

   files(src_dir.."shaders/*.hlsl")
   shadermodel("6.3")

   shaderassembler("AssemblyCode")

   local shader_dir = _WORKING_DIR.."/"..src_dir.."shaders/%{cfg.buildcfg}/"

   -- HLSL files that don't end with 'Extensions' will be ignored as they will be
   -- used as includes
   filter("files:**.hlsl")
      flags("ExcludeFromBuild")
      shaderobjectfileoutput(shader_dir.."%{file.basename}"..".cso")
      shaderassembleroutput(shader_dir.."%{file.basename}"..".asm")

   filter("files:**_ps.hlsl")
      removeflags("ExcludeFromBuild")
      shadertype("Pixel")

   filter("files:**_vs.hlsl")
      removeflags("ExcludeFromBuild")
      shadertype("Vertex")

   hf.deactivate_filter()

   -- Warnings as errors
   shaderoptions({"/WX"})

Обновление 3: Я понял, как обрабатывать параметры командной строки.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 038
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я просто возился с этим сегодня. Для моих файлов HLSL у меня есть простая схема именования:

  • *-p.hlsl для файлов пиксельных шейдеров.
  • *-v.hlsl для файлов вершинных шейдеров.
  • *.hlsl для общих файлов, предназначенных для включения в шейдерные программы. Я просто использую расширение hlsl, чтобы оно отображалось с правильной подсветкой синтаксиса HLSL в редакторе.

Вам не нужны специальные правила сборки для их компиляции. Похоже, что Premake может вывести правильный блок в проекте Visual Studio для использования компилятора шейдеров, а затем такие вещи, как перекомпиляция только измененных файлов (с зависимостями #include), обрабатываются просто отлично. Вот как выглядит мой блок конфигурации:

filter { "files:**.hlsl" }
   flags "ExcludeFromBuild"
   shadermodel "5.0"
filter { "files:**-p.hlsl" }
   removeflags "ExcludeFromBuild"
   shadertype "Pixel"
   shaderentry "ForPixel"
filter { "files:**-v.hlsl" }
   removeflags "ExcludeFromBuild"
   shadertype "Vertex"
   shaderentry "ForVertex"
filter {}

В основном устанавливает шейдерную модель и точки входа для моих файлов (для DirectX 12 вы, вероятно, захотите shadermodel "6.0"). Затем я могу добавить свои шейдеры в проект через files:

files { "shaders/**.hlsl"; }

Все это очень новые вещи в premake, поэтому вы не найдете много документации по ним. Я видел эти варианты здесь: https://github.com/premake/premake-core/blob/master/modules/vstudio/_preload.lua.

Что касается вашего вопроса об экспорте файлов dxasm, есть и другие варианты, такие как shaderassembleroutput и shaderassembler, последний, как я полагаю, является переключателем, который экспортирует код сборки в указанное место, но я не проводил никаких испытаний с ними, чтобы дать развернутый ответ.

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

Могу ли я указать отладочную информацию с помощью шейдеров? Или шейдеропции делают что-то совершенно другое? Кроме того, большое спасибо, я сделаю, чтобы проверить все это, как только смогу.

user11164186 08.03.2019 21:27

Я попытался немного поиграть с shaderoptions, но это не показалось мне очень полезным — на самом деле компилятор обработал шейдеры как дополнительные входные данные, а не как фактические параметры (и просто выдал ошибку).

mukunda 08.03.2019 22:39

Мне удалось получить символы отладки. Я обновлю свой пост с кодом.

user11164186 10.03.2019 14:09

Я смог выяснить, как добавить параметры компилятора с помощью shaderoptions Я протестировал его с флагом компилятора /WX (потому что я хотел, чтобы предупреждения были ошибками). И как ни странно в премейках флаг "FatalWarnings" его не включал.

user11164186 10.03.2019 15:36

У меня была ошибка в моем скрипте. На самом деле он никогда не создавал файлы cso, я использовал старые файлы cso. Я снова обновил пост.

user11164186 10.03.2019 17:35

Другие вопросы по теме