你好!我是 阿米特·莫欣德拉 是Visual C++团队的程序管理器。
我们相信,Metro风格的游戏和图形密集型应用为平板电脑等新设备的开发者提供了巨大的机会。在Windows上访问底层图形硬件全部功能的主要API是 DirectX 11系列 (包括 Direct3D 和 直接2D ).
我们为VisualStudio11带来的最重要的创新之一是一系列帮助您开发Direct3D游戏的工具。我们在Channel9上制作了一个关于这些特性的快速视频( 链接 ). 在本文中,我将介绍我们对D3D的调试和诊断支持。
新的 图形调试器 在visualstudio中,是一个调试和分析工具,它在Direct3D应用程序执行时从中捕获详细信息。您可以使用它来:
- 捕获渲染帧以供以后检查和分析。
- 查看DirectX事件及其对应用程序的影响。
- 查看顶点着色器变换前后的三维网格。
- 找出哪些DirectX事件影响特定像素的颜色。
- 直接跳转到源代码中特定DirectX调用的位置
让我们尝试使用图形调试器一步一步地解决一个简单的问题。对于这个博客,我们正在做的游戏是一个旋转骰子游戏。这是它应该是什么样子。
然而,当我们运行应用程序时,我们发现骰子没有在游戏中渲染。
若要开始调试此游戏,请在解决方案资源管理器中右键单击项目,并在“调试”节点中将“启用图形捕获”设置为“是”。
现在,F5开始调试你的应用程序,你会注意到游戏现在有一些基本的统计数据显示在左上角。这表示VS已准备好从游戏中捕获诊断信息,以便您调查渲染问题。
为了捕捉一帧,只需点击“打印屏幕”键。你可以随时重复这句话;每个帧都将作为“Graphics experience.vsglog”文件的一部分显示在VisualStudio中。日志文件包含调试呈现问题所需的所有信息。默认情况下,该文件位于临时位置,但您可以选择保存该文件并与其他开发人员共享。
让我们通过分析VisualStudio中捕获的帧来进一步深入了解发生了什么。为了更好地理解它,我想知道我打电话给 绘图索引 “API在我的代码中。
“检查” 绘图索引 调用右键单击框架缩略图并从上下文菜单中选择“事件列表”以打开事件列表窗口。
这个 图形事件列表窗口 列出通过在VS调试器下运行程序捕获的所有DirectX事件。它还模拟图形调试器下的事件,使用与正在运行的程序相同的输入重新运行命令。在搜索框中,您可以键入“Draw”来过滤列表以显示DirectX Draw调用。单击draw调用,您将能够在frame窗口(右侧)中看到该帧是如何逐块绘制的。
在此窗口的搜索框中键入“ 绘制 ,这将筛选列表以显示游戏所做的抽签调用。选择“ 绘图索引 “调用事件列表并检查帧窗口中是否呈现了某些内容。
不幸的是,在上述场景中,没有呈现任何内容,因此我们需要继续调试过程。A 绘图API ( 绘图索引 )将工作提交到渲染管道。因此,让我们检查渲染管道,看看是否提交了某些内容作为“ 绘图索引 “打电话。为了查看执行draw调用时图形管道中发生了什么,请右键单击事件列表中的调用,并通过从上下文菜单中选择“管道查看器”来打开管道查看器。
这个 图形管道查看器 显示图形管道中的不同阶段以及这些阶段如何修改模型。
查看器显示网格数据的四种不同视图;这些对应于管道中的四个不同阶段
查看 | 说明 |
顶点前着色器 | 在顶点着色器之前查看网格顶点。相机指向物体的中心。 |
后顶点着色器 | 在顶点着色器之后查看网格顶点。相机指向物体的中心。 |
几何渲染单元 (本例中未看到,因为未使用) | 查看几何体着色器之后的网格顶点。相机指向物体的中心。如果未指定几何体着色器,则此视图为空(浅灰色的实心阴影)。 |
查看端口 | 在屏幕空间中查看网格顶点。相机的设置与目标程序中的相机相同。 |
请注意,图形管道中还有其他阶段未在此视图中表示。有关DirectX 11中新图形管道阶段的更多信息,请参见 在这里 .
在图形管道视图中,您可以看到正在绘制的某些东西看起来像应用程序要渲染的模具。从上图看来 死 “(cube)结构正在正确地通过图形管道,这表明明暗器工作正常(它们没有以阻止渲染的方式修改原始结构)。
在这一点上,我们需要继续调试,看看其他地方。可能是像素被覆盖或丢弃。为了验证这个假设,让我们来看看帧中心的像素(应该在那里渲染模具)。在“帧缓冲区”窗口中,单击中心以首先选择一个像素,然后右键单击并从关联菜单中选择“像素历史”。
这个 绘图 像素历史窗口 显示影响当前帧中选定像素颜色的活动。它包含像素历史记录窗口中每个DirectX事件如何修改像素的信息。这包括初始帧缓冲区状态,然后是渲染的中间绘制事件和最终结果。
我们可以从“像素历史”窗口中看到,像素的帧缓冲区颜色为蓝色,然后像素着色器将不同的颜色(灰色)应用于像素。然而,最终的颜色仍然是蓝色。渲染的所需像素颜色根本无法应用。这表示可能未正确设置混合状态。混合状态控制在将渲染数据与现有渲染目标数据组合时如何混合颜色和alpha值。要检查混合状态,右键单击像素并从上下文菜单中选择“对象表”。这将弹出“图形对象表”窗口。
这个 图形对象表 显示由目标程序创建的Direct3D对象。任何包含状态信息的对象都可以通过双击表中的对象来查看。
对对象表排序(按“类型”),然后滚动到“D3D11混合状态”对象的列表。双击“D3D11混合状态”对象将显示最低有效(不适用)“使用年限”“使用期限”有助于确定要调查的对象与所选绘图调用的关系范围,使用期限越低,相关性越大。双击使用年限最低的blend state对象,它将在visualstudio中打开一个包含该对象详细信息的文档。
从上图我们可以看到:
我们可以从中看到,源的混合状态被屏蔽,因为它被设置为零( D3D11混合0 )目的地的混合状态设置为1( D3D11混合1 ). 这会导致背景色在混合后显示为原色,因此我们看不到正在渲染的模具。应切换这些值,以便像素着色器的输出是混合操作的主要输出。
要找出混合状态的设置位置,我们可以返回“事件列表”窗口,筛选要查找的事件列表“ 混合状态 “因为事件列表列出了为捕获的帧传输的所有DirectX事件。过滤后,您可以看到呼叫“ OMSetBlendState设置 ”. “ OMSetBlendState设置 “是设置混合状态的调用。要获取进行此调用的源代码,请右键单击“ OMSetBlendState设置 调用并从上下文菜单中选择“调用堆栈”以打开“图形调用堆栈”窗口
这个 图形事件调用堆栈 窗口将DirectX事件绑定到正在调试的C++源代码。
双击调用堆栈中的第一个调用,它会将您带到“ OMSetBlendState设置 “请输入密码。“上面几行” 混合状态 “调用时,您将注意到设置了源和目标混合值的代码行。
通过更改代码以反映以下内容来切换这两种状态:
构建并运行。
总结:
游戏开发并不容易,我们认为工具应该帮助您使用底层的DirectX平台。在这个版本中,我们很高兴将这种新型的诊断体验直接引入visualstudio。 这些功能仍在开发中,可能会发生变化,甚至不包括在我们的最终产品中 . 这些功能仅适用于Visual Studio Professional及更高版本的SKU。