В программе DX12 у меня есть шейдер с ближайшим эффектом, и передача dxc.exe в VS2017 (15.9.7) выдает мне следующую ошибку при компиляции:
1>------ Build started: Project: Raymond, Configuration: Debug x64 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1327,5): error MSB6006: "dxc.exe" exited with code -1073741571.
1>Done building project "Raymond.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========
Для чего это стоит (вероятно, нет)много), строки в файле, который он упоминает в сообщении об ошибке:
1327 <FXC
1328 Condition = "'@(FxCompile)' != '' and '%(FxCompile.ExcludedFromBuild)'!='true'"
1329 Source = "%(FxCompile.Identity)"
1330 ToolPath = "$(FXCToolPath)"
Ошибка, как представляется, наиболее зависит от включения вызова встроенной функции DX12 TraceRay (), которая находится вфункция-обертка TraceRadienceRay ():
#if 1
float4 ambient = TraceRadianceRay(ambientRay, rayPayload.recursionDepth, rayPayload.sample_ID, rayPayload.medium_stack);
#else
float4 ambient = { 0, 0, 0, 0 };
#endif
При значении #if, равном 1, я получаю сообщение об ошибке.Установите в 0, он компилируется нормально.Нет ничего плохого в этой конкретной строке кода.Шейдер использовался для компиляции, но по мере его роста (теперь он составляет около 360 строк), ошибка начала увеличиваться по частоте.Что действительно странно, так это то, что вероятность получения ошибки находится где-то между 0 и 1. Иногда происходит сбой, но если я просто скомпилирую снова, это работает!Кажется, существует корреляция между вероятностью отказа и количеством / уровнем условных предложений в коде.Теперь я просмотрел код и свел его к минимуму, но я не могу уменьшить сложность кода, не удалив функциональность.
Я просмотрел ограничения шейдеров в Интернете, и похоже, чтоограничения для таких вещей, как количество локальных переменных и условных предложений, но все эти ограничения в Shader Model 6.0 намного выше того, что есть в моем коде.
Я попытался найти возвращаемое значение, но ни одно изресурсы, которые я нашел, имеют этот код возврата.Если вы превратите значение в шестнадцатеричное значение, вы получите 0xFFFF_FFFF_C000_00FD, но это не соответствует какой-либо документации, даже если вы удалите все буквы F.
Кажется, что с dxc.exe очень мало что можно сделать- поиск Google обнаруживает очень мало хитов.Действительно надеясь, что кто-то здесь видел нечто подобное и может пролить свет на это.
Большое спасибо.