PerfStudio 支持着色器编辑功能,以帮助开发者在正在运行的应用程序中编写和调试着色器。用户可以在着色器代码窗口中编辑 DirectX11 HLSL 代码,使用原始或修改后的编译器标志重新编译它,并将新着色器插入正在调试的应用程序中。这可以显著加快编辑/保存/应用程序重启的周期,因为可以在一个调试会话中应用多个编辑,而无需重启应用程序或调试工具。将修改后的着色器重新插入正在运行的应用程序中,允许用户立即看到其编辑结果并快速评估其影响。与分析器结合使用,可以通过进行编辑前后的分析并比较结果来衡量编辑对性能的影响。
着色器编辑功能
- 所有 DirectX11 着色器类型都可编辑,包括 ID3D11ComputeShader、ID3D11VertexShader、ID3D11HullShader、ID3D11DomainShader、ID3D11GeometryShader 和 ID3D11PixelShader。
- 在着色器重新编译中使用的编译器标志可以在“着色器编译器选项”窗口中进行编辑(见下文)。
- 可以将编辑恢复为原始应用程序着色器。
- GPU PerfStudio 会将所有当前编辑的着色器文件副本保存在 GPU PerfStudio 服务器目录中(位于名为“shaderCache”的子目录中)。
- 如果用户将依赖文件复制到 shaderCache 目录中,则支持 include。如果找不到依赖文件,系统将提示用户执行此操作。
我能编辑所有着色器吗?
目前,着色器编辑仅在 DX11 中支持一种着色器使用场景:当着色器在运行时使用 D3DCompile() 和 DX11 创建着色器函数(CreateComputeShader 等)进行编译时。请注意,D3DCompileFromFile()、D3DCompileFromMemory() 和 D3DCompileFromResource() 最终会调用 D3DCompile(),因此支持着色器编辑。
预编译的着色器呢?
GPU PerfStudio 目前不支持编辑预编译的着色器。
着色器编辑操作模型
目前,着色器编辑按每个着色器对象进行操作。其工作方式如下:
- GPU PerfStudio 会跟踪对 D3DCompile 的所有函数调用,并记录编译参数,包括着色器源代码。
- GPU PerfStudio 还会跟踪对创建着色器函数的调用,例如 CreateComputeShader、CreateVertexShader、CreateHullShader、CreateDomainShader、CreateGeometryShader、CreatePixelShader。
- 用户选择一个着色器进行编辑,进行更改,然后单击“编译着色器”按钮。将创建一个新的着色器对象,并将其映射到应用程序的原始着色器。
- 当应用程序调用设置着色器函数(例如 CSSetShader、VSSetShader、HSSetShader、DSSetShader、GSSetShader、PSSetShader)时,PerfStudio 会将应用程序的着色器对象指针替换为 PerfStudio 当前编辑的版本。
实际上,这意味着如果应用程序在多个绘制调用中重用了同一个着色器对象指针,那么该着色器的所有实例都将被替换为编辑后的版本。这对于优化应用程序非常有用,因为可以在一帧中将单个着色器编辑应用于多个绘制调用,从而让用户能够看到整个场景的整体性能影响。
编辑着色器时,您不是在编辑原始的 hlsl 文件,而是在编辑着色器对象本身——因此,如果 HLSL 文件被编译了多次(例如,为了使用不同的入口点或设置不同的预处理器定义),那么您可能需要进行多次更改——每次针对最初编译的不同的着色器对象之一。
如何编辑着色器
代码窗口支持着色器编辑。下图显示了一个 DX11 像素着色器的代码窗口。在代码窗口的顶部,有一个新的蓝色笔和纸图标按钮。单击此按钮将使用户能够对窗口中的着色器代码进行更改。
| 启用或禁用着色器编辑 |
下图显示了首次加载着色器时着色器代码窗口的状态。

启用着色器编辑后,另外四个按钮将变为活动状态
编译当前着色器并将其插入正在运行的应用程序 | |
| 恢复所有编辑并切换回应用程序的原始着色器 | |
| 打开编译器选项窗口 | |
| 将当前着色器保存到磁盘 |
下图显示了启用着色器编辑后着色器代码窗口的状态。

现在可以更改着色器代码。请注意,在下图所示的着色器函数返回值已乘以 8.0f。完成编辑后,单击“编译着色器”按钮打开着色器编译器选项。

下图显示了着色器编译器选项用户界面。在编译着色器之前,请更改编译器选项。请注意,某些编译器选项是互斥的,选择所有选项可能会导致编译错误。编译错误将通过客户端上的弹出对话框报告。

选择选项后,单击“编译”按钮来编译并插入您修改后的着色器。

单击“恢复”按钮可恢复到原始着色器。