Запуск компилятора SPIR-V в качестве события перед сборкой в ​​VS2017, если был изменен только код шейдера

Итак, я рассмотрел здесь несколько вопросов, которые возникли после поиска, но мне все еще не удалось заставить это работать.

В моем проекте есть два файла: main.cpp и shader.comp.

Шейдер необходимо скомпилировать перед запуском основной программы, и у меня есть небольшой .bat скрипт, который делает именно это. Он настроен на запуск как событие перед сборкой.

Однако, если я отредактирую shader.comp и оставлю main.cpp без изменений с момента последнего запуска проекта, нет необходимости перестраивать проект (в любом случае согласно VS), поэтому нет необходимости запускать какие-либо события перед сборкой, а мой шейдер не скомпилировать.

Есть ли способ сообщить VS2017 (или VS2019), что если какой-то файл будет изменен, то запустите что-то или, по крайней мере, способ добавить произвольный файл в список файлов что VS проверяет, решая, запускать ли сборку или нет?

Я пробовал установить «Исключить из сборки» на «Нет» в свойствах файла, но независимо от того, какой «Тип элемента» я выберу, редактирование только шейдера не вызовет перестройку.


person Karlovsky120    schedule 17.08.2019    source источник


Ответы (2)


Можно определить шейдер, который должен быть скомпилирован, как Custom Build Tool в свойствах файла (как Item Type). Это откроет другое меню в свойствах, где можно написать cmd-скрипт и тому подобное.

В данном конкретном случае значение Command Line было:

glslangValidator.exe -V -o "%(RootDir)%(Directory)%(Filename).spv" "%(FullPath)"

И Outputs:

%(RootDir)%(Directory)%(Filename).spv

Короче говоря, если файл, определенный в Outputs, не существует или старше владельца этого свойства (файла, который необходимо скомпилировать), аргумент Command Line будет запущен в cmd.

Официальная документация есть больше информации об этом.

person Karlovsky120    schedule 17.08.2019
comment
Привет, друг, спасибо, что поделился, и, пожалуйста, отметьте свой ответ как ответ, и это поможет другим членам сообщества, которым будет проще искать эту полезную информацию, это просто напоминание :) - person LoLance; 20.08.2019
comment
Да, я ждал, пока закончатся 2-дневные таймеры. :) - person Karlovsky120; 20.08.2019

Возможно, вам поможет эта проблема < / а>. Вы можете указать файлы для VS Up-To-Date check.

<Project...>
...
  <ItemGroup>
    <UpToDateCheckInput Include="shader.comp" />  <!--when this file is in the project folder-->
    <!--<UpToDateCheckInput Include="path/shader.comp" />-->
  </ItemGroup>
</Project>

И этот скрипт в файл вашего проекта. Затем, если есть какие-либо изменения в shader.comp файле, VS построит ваш проект.

Примечание. Таким образом, если вы измените только файл shader.comp, но не измените исходный файл (xx, cpp), сборка начнется, но vs пропустит цель компиляции исходного кода C ++. Только когда вы измените исходный код main.cpp, VS запустит событие предварительной сборки и скомпилирует код. Дайте мне знать, если это то, что вы хотите, надеюсь, я ничего не понял неправильно :)

person LoLance    schedule 17.08.2019
comment
С вами не все было так ясно. Допустим, я все это делаю, и мой проект обновлен. Затем я меняю shader.comp и нажимаю "Выполнить". Будет ли выполнено событие предварительной сборки или нет? Я хочу, чтобы это было. - person Karlovsky120; 18.08.2019
comment
Думаю, я понимаю, что вы на самом деле сделали. Да, это сработает как общее решение. Ответ, который я дал, работает лучше в этом конкретном случае, поскольку это функция VS, которая была специально разработана для этого. - person Karlovsky120; 18.08.2019