我在DX12程序中有一个最接近的着色器,VS2017(15.9.7)中的dxc.exe传递给我以下编译错误:
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搜索显示的匹配很少。真希望这里的人看到类似的东西并能对此有所启发。
非常感谢。
答案 0 :(得分:-1)
我注册了S.O.只是告诉你我也有这个问题。我间歇性地看到它,并进行了微小的代码更改,这些更改似乎没有明显的语法或用法错误。尽管我还致力于着色器和光线跟踪,但是我现在遇到的错误与一个包含漂亮的vanilla switch / case语句的函数有关。
我刚刚从Debug版本切换到Release版本,并对其进行了编译。你尝试过类似的东西吗?
并非完全解决方案,但是它使我能够克服错误。让我知道你是否成功。