本演练演示如何使用 Visual Studio 图像诊断调查因着色器 Bug 而着色不当的对象。
此演练演示如何:
检测“图形记录”文档标识显示该问题的像素。
使用**“图形像素历史记录”**窗口更进一步的检查像素状态。
使用**“HLSL 调试器”**检查像素和顶点着色器。
方案
当顶点着色器通过像素着色器不正确或不完整信息时,对象通常发生不正确的着色。
在此方案中,您最近添加项目到应用程序,与新的顶点和像素着色器一起可以转换为对象并为它指定唯一的外观。 在测试期间运行应用程序时,在纯黑中呈现该对象。 使用图像诊断,则获取此问题到图像日志,以便您可以调试该应用程序。 该问题如该应用程序中所示:
调查
使用图像诊断工具,可以加载图像日志文档签入测试期间捕获的帧。
检查图形记录的帧
在 Visual Studio 中,加载包含显示缺少模型的帧的图形日志。 新图形的记录显示在 Visual Studio文档窗口。 此窗口的顶部是呈现选定的帧的目标输出。 在底部是**“帧列表”**中,显示每个捕获的帧为缩略图像。
在**“帧列表”**中,选择不具有正确外观的对象的一个帧。 将呈现目标更新为反映选定的帧。 在此方案中,图形日志文档窗口如下所示:
在选择演示问题的帧后,可以使用**“图形像素历史记录”**窗口对其诊断。 **“图像像素历史记录”**窗口按时间顺序显示可能在特定像素上产生影响的基元、其着色器和它们在呈现目标上的影响。
检查像素
打开**“图形像素历史记录”窗口。 在“图像诊断”工具栏上,选择“像素历史记录”**。
选择一个要检查的像素。 在“图形日志”文档窗口上,选择所标颜色不正确的对象上的一个像素:
更新**“图形像素历史记录”窗口反映选定的像素。 在此方案中,“图像像素历史记录”**窗体如下所示:
注意像素着色器的结果为完全不透明黑 (0, 0, 0, 1),**“输出合并”以此种方式将其与像素的“前一种”颜色组合,以便“结果”**也为完全不透明黑。
在检查颜色不正确的像素并发现像素着色器输出不是所需颜色之后,您可以使用 HLSL 调试器检查像素着色器并查看对象的颜色发生了什么。 您可以在执行期间使用 HLSL 调试器检查 HLSL 变量的状态,通过 HLSL 代码分步执行,并且设置断点帮助您诊断问题。
检查像素着色器
开始调试像素着色器。 在**“图像像素历史记录”窗口中,在对象的基元下,在“像素着色器”的旁边,选择“开始调试”**按钮。
在此方案中,因为像素着色器从顶点着色器中仅传递颜色,很容易的观察像素着色器不是问题的根源。
请将指针停留在 input.color 上。 监视其值是完全不透明的黑色 (0,0,0,1)。
在这种情况下,检查表示不正确的颜色可能是像素着色器不提供正确颜色的信息对顶点着色器的结果。
在您确定顶点着色器可能没有提供正确信息到像素着色器之后,下一步是检查顶点着色器。
检查顶点着色器
开始调试顶点着色器。 在**“图像像素历史记录”窗口中,在对象的基元下,在“顶点着色器”的旁边,选择“开始调试”**按钮。
找到顶点着色器的输出结构 - 这是对像素着色器的输入。 在此方案中,此结构的名称为 output。 顶点着色器检查代码并注意 output 结构的 color 成员来显式设置为完全不透明的黑色,可能导致人员的调试工作。
确认不从输入结构复制颜色成员。 返回 output 结构之前,由于值 output.color 设置为完全不透明的黑色,最好确保output 值在上一行不正常初始化。 当监视 output.color的值时,顶点着色器逐句代码,直至到达设置 output.color 黑色的,。 请注意 output.color 值未初始化,直到将变为黑色。 这样会确认将 output.color 变为黑色的代码行应修改,而不是删除。
在确定呈现问题的原因是顶点着色器不提供正确的颜色值到像素着色器之后,您可以使用此信息解决该问题。 在这种情况下,可以通过更改该顶点着色器的代码修复它
output.color = float3(0.0f, 0.0f, 0.0f);
设置为
output.color = input.color;
此代码从该对象未修改的顶点经过顶点颜色 — 更复杂的顶点着色器可在经过它之前修改该颜色。 更正了顶点着色器代码应类似于:
在修复代码后,重新生成并再次运行该应用程序发现呈现问题已解决。