演练:因设备状态而缺少对象

本演练演示如何使用 Visual Studio 图像诊断调查因设备状态配置错误而丢失的对象。

此演练演示如何:

  • 使用**“图形事件列表”**定位该问题的潜在来源。

  • 使用**“图形管线阶段”** 窗口检查 DrawIndexed Direct3D API 调用的影响。

  • 使用**“图形像素历史记录”**窗口专门定位该问题。

  • 检查潜在问题或错误配置的设备状态。

方案

对象可能不会出现在三维应用程序中预计会出现的位置的一个原因是,错误配置图形设备导致对象排除呈现—例如,环绕顺序导致错误剔除三角形或深度测试功能导致对象中的所有像素被拒绝。

在本演练中描述的情况下,到达了三维应用程序的开发的第一个里程碑和准备第一次测试。 但是,当您运行该应用程序时,只有用户界面会在屏幕上呈现。 使用图像诊断,则获取此问题到图像日志文件,以便您可以调试该应用程序。 该问题如该应用程序中所示:

修复问题前的应用程序

有关如何捕获图形日志中的图形问题的信息,请参见 捕获图形信息

调查

使用图像诊断工具,可以加载图像日志文件签入测试期间捕获的帧。

检查图形记录的帧

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

  2. 在**“帧列表”**中,选择说明该模型不显示的帧。 将呈现目标更新为反映选定的帧。 在此方案中,图形日志选项卡如下所示:

    .vsglog 选项卡帧缓冲区预览和帧列表

在选择演示问题的帧后,可以使用**“图像事件列表”**对其诊断。 **“图形事件列表”**包含用来呈现活动帧的每个 Direct3D API 调用,例如,API 调用设置设备状态,创建和更新缓冲区和绘制出现在帧中的对象。 许多类型的调用都很有趣,因为当应用程序按预期工作时,通常(但不总是)呈现目标中有一个对应的更改,例如绘制、调度、复制或清除调用。 绘制调用特别感兴趣,因为每个表示该应用程序呈现的几何图形(预定调用也可以呈现几何图形)。

确保进行绘制调用

  1. 打开**“图形事件列表”窗口。 在“图形诊断”工具栏上,选择“事件列表”**。

  2. 检查绘制调用的**“图像事件列表”。 为了使此过程更加简单,在“图像事件列表”窗口的右上角的“搜索”**框中输入“绘制”。 这筛选了该列表以便仅包括其标题中含“绘制”的事件。 在此方案中,您会发现进行调用的多个绘制:

    显示捕获的事件的图形事件列表

在确认进行绘制调用后,您可以确定哪个对应于缺失几何图形。 由于您知道缺少的几何图形不会绘制到呈现目标(在此例中),可以使用**“图像管道阶段”**窗口确定对应于缺少几何图形的绘制调用。 “图形管道阶段” 窗口显示已发送给每个绘制调用的几何图形,而不考虑其在呈现目标上的影响。 当通过绘制调用移动时,更新管道阶段显示与该调用相关的几何图形,并在调用完成后更新呈现目标的输出显示呈现目标的状态。

查找缺少几何图形的绘制调用

  1. 打开**“图形管道阶”窗口。 在“图形诊断”工具栏上,选择“管道阶段”**。

  2. 通过每个绘制调用移动,同时注意**“图形管道阶段”**窗口所缺少的模型。 **“输入装配器”**阶段显示原始模型数据。 **“顶点着色器”**阶段显示转换的模型数据。 **“像素着色器”**阶段显示像素着色器输出。 **“输出合并”**阶段显示此绘制调用和以前所有绘制调用的合并呈现目标。

  3. 停止,一旦到达对应于缺少模型的绘图调用。 在此方案中,**“图像管道阶段”**窗口指示呈现几何图形,但不显示在呈现目标中:

    显示缺失对象的管道查看器

在确认应用程序呈现缺失几何图形并且您找到相应的绘图调用之后,可以选择应显示缺失几何图形的部分呈现目标输出,然后使用**“图像像素历史记录”窗口查看像素为什么被排除。 像素历史记录包含已经影响特定像素的每个绘制调用的列表。 由也显示在“图像事件列表”的编号标识在“图像像素历史记录”**窗口中的绘制调用。 这有助于确认应显示缺失几何图形的像素和查看排出该像素的原因

确定排除像素的原因

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

  2. 根据**“像素着色器”缩略图,选择应在包含缺少一部分几何图形的 framebuffer 输出的像素。 在此方案中,像素着色器输出应包含大多数呈现目标;在选中像素后,“图像像素历史记录”**窗口如下所示:

    显示相关绘图调用的“像素历史记录”窗口

  3. 通过匹配您检查的绘制调用(从**“图像事件列表”窗口)的编号到“图像像素历史记录”**的一个绘制调用,确认所选呈现目标像素包括几何图形的一部分。 如果在"图像像素历史记录" 窗口中的调用都与在检查的绘制调用不匹配,则重复这些步骤(除第1步),直至找到匹配。 在此方案中,调用匹配绘画如下所示:

    显示片段信息的“像素历史记录”窗口

  4. 当您找到匹配时,展开匹配的绘图调用在**“图像像素历史记录”窗口中并确认已排除像素。 在“图像像素历史记录”**窗口的每个绘制调用对应于由于对应对象的几何图形与该像素相交的一个或多个几何图形基元(点,行或三角形)。 每个这样的交集可能会导致像素的最终颜色。 排除的基元,因为它深度测试失败由按从左至右向下显示在该箭头的字母 Z 的图标表示。

  5. 展开排除的基元进一步检查使其排除的状态。 在**“输出合并”组中,移动指向“结果”**的指针。 工具提示指示为什么排除基元。 在这种情况下,检查表示排除基元,由于深度测试失败,因此没有导致像素的最终颜色。

在您确定几何图形因为其基元深度测试失败而未出现之后,您可能怀疑此问题与错误配置的设备状态相关。 使用**“图形对象表”**,可以检查设备状态和其他 Direct3D 对象数据。

检查设备状态

  1. 打开**“图形对象表”窗口。 在“图形诊断”工具栏上,选择“对象表”**。

  2. 找到**“图形对象表”中的“D3D10 设备”对象,然后打开“D3D10 设备”对象。 新的“d3d10 设备”选项卡在 Visual Studio 中打开。 为了使此过程更加简单,可通过“类型”排序“图形对象表”**:

    图形对象表和相关设备状态

  3. 检查在潜在问题的**“d3d10计算机”选项卡上显示的设备状态。 由于几何形状未出现,因为其原始失败深度测试,您可以关注设备状态,例如深度模具,影响深度测试。 在此方案中,“深度模具声明”(在“输出合并状态”下)包含“深度功能”**成员,D3D10_COMPARISON_GREATER 的一个少见的值:

    显示深度模具信息的 D3D10 设备窗口

在确定呈现问题的原因可能是错误配置深度功能之后,可以与您的代码知识一起使用此信息定位深度功能哪里设置不正确,然后解决问题。 如果您对代码不熟悉,则可以使用在调试时收集的线索来搜索问题-例如,根据本方案中的“深度模具声明”,您可以搜索如“深度”或“更大”这些词的代码。 在修复代码后,重新生成并再次运行该应用程序发现呈现问题已解决:

修复问题后的应用程序