演练:调试因着色引起的呈现错误

本演练演示如何使用 Visual Studio 图像诊断调查因着色器 Bug 而着色不当的对象。

此演练演示如何:

  • 检查日志记录标识像素显示出问题的图像。

  • 使用**“图形像素历史记录”**窗口更进一步的检查像素状态。

  • 使用**“HLSL 调试器”**检查像素和顶点着色器。

情况

当顶点着色器通过像素着色器不正确或不完整信息时,对象通常发生不正确的着色。

在此方案中,您最近添加项目到应用程序,与新的顶点和像素着色器一起可以转换为对象并为它指定唯一的外观。在测试期间运行应用程序时,在纯黑中呈现该对象。使用图像诊断,则获取此问题到图像日志,以便您可以调试该应用程序。该问题如该应用程序中所示:

呈现对象所使用的颜色不正确。

调查

使用图像诊断工具,可以加载测试期间,日志记录检查帧捕获的图像。

检查图形记录的帧

  1. 在 Visual Studio 中,加载包含显示缺少模型的帧的图形日志。新的图像记录文档窗口显示 Visual Studio。此窗口的顶部为所选帧呈现目标输出。在底部是**“帧列表”**中,显示每个捕获的帧为缩略图像。

  2. 在**“帧列表”**中,选择不具有正确外观的对象的一个帧。将呈现目标更新为反映选定的帧。在此方案中,图像记录文档窗口如下所示:

    Visual Studio 中的图形日志文档。

在选择演示问题的帧后,可以使用**“图形像素历史记录”窗口对其诊断。“图像像素历史记录”**窗口按时间顺序显示可能在特定像素上产生影响的基元、其着色器和它们在呈现目标上的影响。

检查像素

  1. 打开**“图形像素历史记录”窗口。在“图像诊断”工具栏上,选择“像素历史记录”**。

  2. 选择一个要检查的像素。在记录文档窗口的图像,请选择某个错误地为对象的像素:

    选择有关像素历史记录的像素显示信息。

    更新**“图形像素历史记录”窗口反映选定的像素。在此方案中,“图像像素历史记录”**窗体如下所示:

    像素历史记录显示一个 DrawIndexed 事件。

    注意像素着色器的结果为完全不透明黑 (0, 0, 0, 1),**“输出合并”以此种方式将其与像素的“前一种”颜色组合,以便“结果”**也为完全不透明黑。

在检查颜色不正确的像素并发现像素着色器输出不是所需颜色之后,您可以使用 HLSL 调试器检查像素着色器并查看对象的颜色发生了什么。您可以在执行期间使用 HLSL 调试器检查 HLSL 变量的状态,通过 HLSL 代码分步执行,并且设置断点帮助您诊断问题。

检查像素着色器

  1. 开始调试像素着色器。在**“图像像素历史记录”窗口中,在对象的基元下,在“像素着色器”的旁边,选择“开始调试”**按钮。

  2. 在此方案中,因为像素着色器从顶点着色器中仅传递颜色,很容易的观察像素着色器不是问题的根源。

  3. 请将指针停留在 input.color 上。通知它的值是完全不透明黑 (0,0,0,1)。

    未定义“input”的“color”成员。

    在这种情况下,检查表示不正确的颜色可能是像素着色器不提供正确的颜色信息对顶点着色器的结果。

在您确定后顶点着色器可能没有提供正确的信息以像素着色器,下一步是检查顶点着色器。

检查顶点着色器

  1. 开始调试顶点着色器。在**“图像像素历史记录”窗口中,在对象的基元下,在“顶点着色器”的旁边,选择“开始调试”**按钮。

  2. 找到顶点着色器的输出结构 - 这是对像素着色器的输入。在此方案中,此结构的名称为 output。检查顶点着色器代码和通知 output 结构的 color 成员显式设置为完全不透明黑,可能是因为有人的调试工作。

  3. 确认颜色成员从输入机制不会复盖。由于 output.color 的值设置为完全不透明黑,在 output framework 返回之前,最好,以确保 output 的值在前一个行未正确初始化。逐句通过顶点着色器代码,直至到达设置 output.color 黑色的行,当监视 output.color的值时。请注意 output.color 的值未初始化,直到设置为黑色。这可确认设置 output.color 黑色的代码行应修改,而不是将其删除。

    从未初始化“output.color”的值。

在确定呈现的原因问题后是顶点着色器不提供正确的颜色值写入像素着色器,您可以使用此信息解决该问题。在这种情况下,可以通过将顶点着色器下面的代码来修复该错误。

output.color = float3(0.0f, 0.0f, 0.0f);

设置为

output.color = input.color;

此代码从该对象未修改的顶点经过顶点颜色 — 更复杂的顶点着色器可在经过它之前修改该颜色。更正了顶点着色器代码应类似于:

已更正的顶点着色器代码。

在修复代码后,重新生成并再次运行该应用程序发现呈现问题已解决。

呈现对象所使用的颜色正确。