DXC是否对光线跟踪着色器HLSL中的条件和对TraceRay()的调用施加限制?

时间:2019-02-21 17:41:47

标签: shader raytracing

我在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搜索显示的匹配很少。真希望这里的人看到类似的东西并能对此有所启发。

非常感谢。

1 个答案:

答案 0 :(得分:-1)

我注册了S.O.只是告诉你我也有这个问题。我间歇性地看到它,并进行了微小的代码更改,这些更改似乎没有明显的语法或用法错误。尽管我还致力于着色器和光线跟踪,但是我现在遇到的错误与一个包含漂亮的vanilla switch / case语句的函数有关。

我刚刚从Debug版本切换到Release版本,并对其进行了编译。你尝试过类似的东西吗?

并非完全解决方案,但是它使我能够克服错误。让我知道你是否成功。