Я изо всех сил пытаюсь понять, как настроить мои шейдеры 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: Я понял, как обрабатывать параметры командной строки.





Я просто возился с этим сегодня. Для моих файлов 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 (включить символы отладки) для компиляции шейдера, но я не совсем уверен, возможно ли это.
Я попытался немного поиграть с shaderoptions, но это не показалось мне очень полезным — на самом деле компилятор обработал шейдеры как дополнительные входные данные, а не как фактические параметры (и просто выдал ошибку).
Мне удалось получить символы отладки. Я обновлю свой пост с кодом.
Я смог выяснить, как добавить параметры компилятора с помощью shaderoptions Я протестировал его с флагом компилятора /WX (потому что я хотел, чтобы предупреждения были ошибками). И как ни странно в премейках флаг "FatalWarnings" его не включал.
У меня была ошибка в моем скрипте. На самом деле он никогда не создавал файлы cso, я использовал старые файлы cso. Я снова обновил пост.
Могу ли я указать отладочную информацию с помощью шейдеров? Или шейдеропции делают что-то совершенно другое? Кроме того, большое спасибо, я сделаю, чтобы проверить все это, как только смогу.