dx12) 编译Shader时间太长

Sha*_*der 0 c++ directx direct3d hlsl directx-12

在此输入图像描述

分析时,仅着色器编译就花费了大约 14 秒。(尽管加载所有 obj 文件只花了 7 秒。)

我该如何优化这个?我可以选择预编译 hlsl 着色器吗?

Chu*_*urn 5

事实上,建议是离线编译着色器(在构建时),然后在运行时加载生成的二进制着色器 blob。

  • 您可以使用内置的 Visual Studio HLSL 集成来生成.cso文件(编译着色器对象)。有关详细信息,请参阅Microsoft 文档。有关将 Shader Model 6 DXC 与 VS 结合使用的说明,请参阅此页

  • 您可以使用批处理脚本从命令行调用 FXC 或 DXC,并将其用作 VS 自定义构建或 CMake 自定义目标的一部分。请参阅DirectX 工具包的 CompileShaders.cmd本教程

您将需要为上面代码片段中列出的着色器类提供一个新的 ctor,它直接将着色器二进制 blob 而不是字符串传递到 HLSL 源进行编译。

对于 Win32 桌面应用程序,您需要处理以下事实:您的 .cso 文件最终将位于您构建的 EXE 旁边,而不是您设置项目 CWD 的位置。有关示例,请参阅ReadData 。对于 UWP 和 Xbox 应用程序,.cso 文件会自动放入 appx 包中。

从您的问题来看,尚不清楚您使用的是FXC.EXEShader Model 5.1 的旧版编译器还是DXC.EXEShader Model 6 的当前 DirectX 12 着色器。同样的建议仍然适用于此处。FWIW,DXC 编译器基于 LLVM,因此它有点复杂,因此比传统 FXC 编译器进行更多分析。