精华内容
下载资源
问答
  • DirectX11 调试Direct3D应用程序

    千次阅读 2015-09-29 13:55:13
    调试Direct3D应用程序 1. 如何调试Direct3D应用程序? 我们实现了一个宏,用它来检查许多Direct3D函数返回的HRESULT值。这个宏定义在d3dUtil.h文件中:#if defined(DEBUG) | defined(_DEBUG) #ifndef HR #define...

    调试Direct3D应用程序
    1. 如何调试Direct3D应用程序?
    我们实现了一个宏,用它来检查许多Direct3D函数返回的HRESULT值。这个宏定义在d3dUtil.h文件中:

    #if defined(DEBUG) | defined(_DEBUG)
        #ifndef HR
        #define HR(x)                                              \
        {                                                          \
            HRESULT hr = (x);                                      \
            if(FAILED(hr))                                         \
            {                                                      \
                DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); \
            }                                                      \
        }
        #endif
    
    #else
        #ifndef HR
        #define HR(x) (x)
        #endif
    #endif

    当函数的返回值表明调用失败时,我们把返回值传递给DXTrace函数。请注意,当使用该函数时,我们必须在代码中添加包含语句“#include

    HRESULT WINAPI DXTraceW(const char* strFile, DWORD dwLine,
        HRESULT hr, const WCHAR* strMsg, BOOL bPopMsgBox);

    该函数可以弹出一个消息框,显示出现错误的文件、行号、有关错误的描述信息以及导致错误的函数名。图4.11是它的一个例子。注意,当DXTrace函数的最后一个参数设为false时,该函数不会显示消息框,而是把调试信息输出到Visual C++的输出窗口。当我们不使用调试模式时,HR宏不执行任何代码。另外,HR必须是一个宏而不能是一个函数;否则FILELINE将无法引用调用HR宏的函数所在的文件和行。

    这里写图片描述

    现在我们使用HR宏来包围返回HRESULT值的Direct3D函数,下面是一个例子:

    HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice,
        L"grass.dds", 0, 0, &mGrassTexRV, 0 ));

    当我们调试演示程序时,这个宏可以很好地运作,但是对于一个实际的应用程序来说,我们应该使用更完善的错误处理机制。

    注意:L#x将HR宏的参数转换成一个Unicode字符串。通过这一方式,我们可以把导致错误的函数调用语句输出到消息框上面。

    展开全文
  • 开启Direct3D调试模式

    千次阅读 2010-05-28 13:40:00
    在#include 语句前面加上以下这条语句即可:#define D3D_DEBUG_INFO 关闭调试时查看D3D Device对象的情况 开启调试时查看D3D对象的情况 为外部调试使用调用堆栈当 Direct3D 调试模式开启之后,你可以在任何时候...

    在#include <D3D9.h>语句前面加上以下这条语句即可:

    #define D3D_DEBUG_INFO

    关闭调试时查看D3D Device对象的情况

     

    开启调试时查看D3D对象的情况

     

    为外部调试使用调用堆栈

    当 Direct3D 调试模式开启之后,你可以在任何时候查看对象的调用堆栈。这会导致你的程序非常慢,但是可以使用此功能检查资源泄漏(内存泄漏的一种)。开启调用堆栈,设置这个注册表键值为1即可:

    //HKEY_LOCAL_MACHINE//SOFTWARE//Microsoft//Direct3D//
    D3D9Debugging//EnableCreationStack
    

    开启D3D调试模式,然后重建你的工程,系统将会给你访问这个附加的变量:
      LPCWSTR CreationCallStack;

    这个变量存储着每次创建对象时的调用堆栈。这会导致你的程序非常慢,但是可以使用此功能检查资源泄漏。

    展开全文
  • Direct3D调试利器PIX Win简介

    千次阅读 2009-12-19 22:28:00
    PIX Win是DirectX SDK附带的Direct3D程序调试和分析工具,用于D3D应用程序,如果D3D程序的开发者需要收集和分析应用程序对3DAPI的调用和执行信息,此工具是一个很好的选择。例如,用户需要知道某个渲染过程中,后台...

     

    PIX Win是DirectX SDK附带的Direct3D程序调试和分析工具,用于D3D应用程序,如果D3D程序的开发者需要收集和分析应用程序对3DAPI的调用和执行信息,此工具是一个很好的选择。例如,用户需要知道某个渲染过程中,后台渲染目标、深度缓冲区、模板缓冲区是否正确地渲染出来了,或者想知道在某帧一个D3D对象是否被正确释放了,可以用这个工具进行调试。当然,此工具不能用于OpenGL程序。本人在一款产品的优化中,使用了此工具,搜索后除了有MSDN文档外,未发现此工具的任何介绍,那这里就以使用者的角度进行简要介绍,希望与使用过和将要使用此工具的朋友交流D3D程序优化的相关经验。

    1.工具界面

    参考文档:MSDN PIX documentation

     

     图1 在PIX中创建一个实验

    用PIX创建一个实验,运行后,截取D3D应用程序的调用,可以生成一个调用记录文件。经常的做法是创建一个实验,指定一个快捷键,并设置在按键触发时捕获所API调用,再设置自动保存到实验运行文件(*.PIXrun),而实验设置本身又可以存为一个很小的实验文件(*.PIXexp)。程序退出时或打开实验记录时界面切换到下图的样子。下图是从wikipedia借来的主界面图,图中展示的是程序录制的结果。

     PIX界面

    图2 PIX调试分析界面

    图2中的4个视图分别显示了时间轴,对象列表,事件列表,渲染目标和对象查看视图。 在事件中,可以切换录制的帧,展开树型列表,可以看到在这一帧中对D3D/D3DX函数的调用情况,参数以及返回值。其中蓝色的是地址,代表一个对象指针,点击它可以在右边显示。当选择一个帧时,对象视图中的有些对象变成Alive,这代表这个对象在这一帧中是可用的,双击即可查看。图中选中的是某帧中第2727次函数调用的情况,这是一个SetTexture调用。

    渲染和对象查看视图中列出了对象的属性,在上部可以设置过滤和排序,每列显示了他被释放的时间(第几帧),引用计数器、分辨率等信息。需要注意的是,只有在事件列表中选中了某一帧,并且打开了右下角的对象查看器中的Render窗口,才能使对象变成可用,当对象可用时,双击对象列表中的对象或直接双击事件列表中指针,就可以在一个新窗口中显示了。我用的版本可能存在一个bug,显示第2个对象就会崩溃,所以可能需要一个对象查看标签后才能打开下一个对象。图2中右下角视图显示的是一个表面。

    2.实验内容简介

    要使用PIX对应用程序进行测试,需要建立一个个实验,此实验需要设置应用程序的路径和运行参数,另外选择你要测试的项目,所有测试参数选择好之后,就可以开始测试了,这些测试参数可以保存为一个脚本文件,以后可以反复测试。

    此工具的位置:

    Microsoft DirectX SDK (June 2006)/Utilities/Bin/x86/PIXWin.exe

    此工具的完整文档位于帮助文档的如下位置:

    DirectX Software Development Kit/DirectXTools/PIX

    如果打开帮助文档,使用搜索,输入PIX也能很快定位到这部分文档,从开始菜单中可以直接启动该工具。

    本文旨在以用户角度而不是MS角度介绍此工具的使用。

    能测试或记录的项目包括:

    (1).每Frame对D3D/D3DX函数的调用,以及参数,可以多次记录单个Frame,也可以记录一段Frame;

    (2).截取屏幕;

    (3).每Frame的计数器,以曲线方式显示在屏幕上,包括提交DP,DIP,DUP,DUIP,SetRenderState,SetTexture等请求的数量,的三角形数量,这里,统计的项目可以灵活设置;

    (4).设备修改;

    (5).拦截Draw调用;

    (6).保存设备状态到文件;

    (7).记录API调用时的数据,包括纹理,顶点和索引的数据,在重绘时,可以查看提交的每个纹理以及纹理的完整数据;

    (8).保存实验记录,将所有试验中处理的数据保存到一个文件中,当然,如果完整记录所有Frame,文件可能比较大,一般只记录关键的几个点。实验记录可以脱离原EXE和资源使用,如果日后需要分析,也只需要这一个文件。

    实验数据保存后,可以反复查看,其中包括保存的各个帧。

    有了这些测试项目,你可以检查你的应用程序是否提交了正确的状态,释放了不再使用的纹理,如果在某帧一个纹理在某帧还可用,而工具中的渲染窗口还在激活时,此纹理将显示可用,您可以在双击事件列表里的指针或对象表中的条目查看各种数据(顶点,索引,以反汇编形式显示的Shader程序等)表面(纹理,表面等)。

    展开全文
  • Direct3D程序调试

    千次阅读 2012-05-16 20:01:57
    内容提要:手动调试和使用工具PIX调试Direct3D程序。  3D绘图中常见问题: 1.模型消失,没有出现在画面上; 2.模型在画面上失真、变形或者闪烁; 3.贴图出现不正常拉扯; 4.使用了错误的贴图、Shader或者...

       内容提要:手动调试和使用工具PIX调试Direct3D程序。

          3D绘图中常见问题:

    1.模型消失,没有出现在画面上;

    2.模型在画面上失真、变形或者闪烁;

    3.贴图出现不正常拉扯;

    4.使用了错误的贴图、Shader或者RenderState .

           没有固定方法来查找错误的原因,一般尝试改变绘图设置,慢慢缩小问题可能发生的范围。

           模型消失时,第一步检查转换矩阵,尤其是投影矩阵。如果投影矩阵的Z near和Z far范围不够大,3D对象就会落在屏幕坐标系之外而被忽略。可以试着改变投影矩阵的可视范围,看看消失的对象是否会重新出现。必要时检查顶点位置和转换矩阵的相乘结果,看看它们是否会落在画面范围中。还可以把透视投影的矩阵暂时改成正交投影,这样可以查看3D对象的位置是否正确。

           确认矩阵没有问题后,如果画面仍然不正确,问题应该出在模型数据和纹理的正确性上。这时可以暂时把纹理简化。第一个简化通常是关闭光照功能。如果模型在画面上看起来过暗,甚至是完全黑色时,可能是光照的设置出了问题,这时只有关闭光照功能,就可以让模型重新出现。简化纹理还可以把Alpha Test和Blending功能关闭,有时可能贴图的Alpha层完全是黑色,或者纹理使用了错误的Alpha Test比较值,这些错误都有可能让整个对象消失。

           如果关闭Alpha Test和Blending功能后,画面上仍然看不到3D对象,就把纹理做最终的简化,移除所有的贴图,让物表纹理固定地输出单一颜色。如果这个步骤可以让模型出现在画面上,那就可以肯定问题出在贴图设置或Pixel Shader的代码上。

           经过前面3个步骤后,如果模型仍然没有出现在正确的位置上,就在检查模型数据的正确性。第1步在画出模型时,把几何图形的种类由三角形Triangle暂时改成点Point,因为创建三角形数据的Index Buffer有可能发生错误,所以无法组合出正确的模型。暂时先把模型用点Point的类型来画,最起码可以在画面上看到模型的大致形状,如果连大致形状都是错误的,那代表最原始的模型数据就已经出现问题了。

           模型数据的问题有可能出现在GPU读取数据的部分,也有可能在设置顶点数据字段时出现错误。这个部分比较难确认,比较好的方法是通过工具来检查,在C++部分所能做到的检查工作如下:

    1.确定顶点数据的大小size正确,

    2.确认顶点数据字段设置,让GPU能够获得所以需要用到的数据。

    3.在测试时,也可以先把数据简化,暂时只传入顶点的位置Position,忽略发线Normal、颜色Color,以及贴图坐标等,先只使用顶点位置把整个模型用点的方法画出来,只要看到模型的大致形状,再试着去传入其它数据。

            使用上述的方法应该可以把问题范围缩小,这时也许还没有找出真正的原因,但是先把范围缩小后,再通过工具,应该就可以发现问题所在。

            Direct3D调试工具PIX(Performance Investigate for Xbox) for Windows.在Direct SDK的工具下可以找到这个程序。PIX可以查看贴图和模型,绘图结果,顶点和像素着色器调试等功能。注意PIX启动要调试的程序路径必须是英文,否则出现不能运行错误“PIX Experiment File Version Mismatch”。

             使用PIX分为2大步骤:第1步是通过PIX来启动想要调试的程序,并在程序启动后,按工具设置来截取某个画面所使用的Direct3D指令;第2步是在截取画面后关闭绘图程序,PIX接下来应该会切换到回放Direct3D指令的模式。

             PIX先把某个画面中的Direct3D绘图指令截取下来,再把每个指令都视为1个断点,程序员可以从Event窗口中选择其中指令,再通过Render窗口来查看绘图的结果。Render窗口显示的是,从这个画面的起点开始一直运行到说选择断点为止的3D绘图结果。

             PIX可以查看程序中所使用的贴图和模型数据。在Event窗口中找到相对应的SetTexture函数调用,双击函数的第2个参数,即蓝色文字的参数,右下方的窗口中就会显示所使用的贴图。如果要查看模型,选择Event窗口中画出模型的DrawPrimitive和DrawIndexedPrimitive函数调用(单击工具Event窗口最上边的按钮D也可以上下移动到函数调用),再在Detail窗口中选择Mesh,窗口中就会显示坐标转换前和转换后的的模型,还会显示出一个列出所有的顶点数据的列表。双击其中1个顶点,就可以进入Vertex Shader的调试模式。其中查看坐标转换前后的模型非常实用,马上可以看出加载模型是否正确,以及VS处理后是否正确,显示是否超出。Mesh中PreVS的顶点为原始输入坐标值,而PostVS的顶点为处理后的坐标值,即原始输入坐标值XWorld_View_Proj矩阵=处理后的坐标值,其中矩阵为世界,视图,投影三个矩阵的乘积。

            调试Pixel Shader。在Detail窗口的Render模式,在要调试的像素上右击,弹出一个快捷菜单,选择菜单上的Debug This Pixel选项,进入Pixel Shader的调试模式。

            具体的调试操作可以查阅SDK.

            Visual Studil也提供了Shader的调试模式,不过不太实用,Microsoft也没有再对它更新。PIX所提供的调试功能比较完整,也比较实用。

            OpenGL调试工具有glslDevil,GLIntercept和gDEBugger等。

           摘选于彭国伦的《3D绘图程序设计》.


    展开全文
  • 声明:此文章翻译自DirectX 9.0C OCT 2006 SDK的Direct3D For C++帮助文档的Enabling Direct3D Debug Information主题,前面部分有些没有翻译的。 在#include <D3D9.h>语句前面加上以下这条语句即可...
  • 3D游戏的在新设备(智能手机,平板电脑)上呈现一个巨大的机会,为开发人员。用于访问底层的图形硬件,在 Windows 上全部的力量的主 API 是...在 Visual Studio 中的新图形调试器是捕获从 Direct3D 应用程序的详细
  • Direct11 学习笔记(初始化Direct3D)

    千次阅读 2018-07-25 16:12:00
    创建Direct3D 11设备 首先创建一个窗口,当显示了一个窗口后,下面继续创建一个Direct3D 11设备,这个设备用于绘制3D场景。首先必须创建三个对象,包括设备,设备上下文,交换链。 当显示了一个窗口后,下面继续...
  • 在VS里面调试Direct2D图形
  • DirectX11 Direct3D初始化

    千次阅读 2015-09-27 22:03:30
    Direct3D初始化 1. Direct3D初始化步骤 下面将讲解如何初始化Direct3D。我们将Direct3D的初始化过程分为如下几个步骤:1.使用D3D11CreateDevice方法创建ID3D11Device和ID3D11DeviceContext。 2.使用ID3D11...
  • 今天程序出了一个bug,以为是OIS的问题,结果调试了一天,才发现不是,另外知道了,directinput不能单步调试,很低级的错误……
  • DirectX11 Direct3D基本概念

    千次阅读 2015-09-27 19:58:53
    Direct3D基本概念 1. Direct3D概述 Direct3D是一种底层绘图API(application programming interface,应用程序接口),它可以让我们可以通过3D硬件加速绘制3D世界。从本质上讲,Direct3D提供的是一组软件接口,...
  • 论文范文Direct3D应用程序分析与调试软件的研究与设计 第一章绪论 1.1论文的研究背景 Direct3D是微软公司在Microsoft Windows操作系统上所开发的一套3D绘l纠编程接口是 DirectX的二维部分目前广为各家显卡厂商所支持...
  •  在这个例子中,将要学习创建一个最小的Direct3D应用的基本元素,这些都是基本的功能属性...创建窗口和消息循环的初始步骤在Direct3D9,Direct3D10,和Direct3D11中都是一样的。     目前,我们有一个可以显示
  • 如果你得到了一个来自于其他进程或者其他模块的 Direct3D11 的共享资源,即 SharedHandle 句柄,那么可以使用本文提到的方法将其转换成 Direct3D11 的设备和纹理,这样你可以进行后续的其他处理。 本文内容...
  • 本节主要介绍Direct3D11两个最主要的接口,Device和Context. 1.4.1 Device Device和Device context 两个结构分别负责管理Direct3D11的可用功能,当资源被创建和交互的时候使用Device接口,当管线或者资源被操作的...
  • Direct3D11学习环境搭建

    千次阅读 2017-02-17 15:15:23
    Direct3D 11中,Effects框架已从D3DX库中移除,你必须包含一个单独的头文件(d3dx11Effect.h),链接一个单独的库文件(Effects11.lib用于release生成,而Effects11D.lib用于debug生成)。 而且,在Direct3D 11...
  • DirectX 11 编程指南 - Direct3D Device 简介   在D3D API 中, Device(设备)是一个核心的概念,Device是对一个图形硬件的抽象,它负责创建和销毁其他的对象,渲染图元等功能。D3D11中,Device对象...
  • DXUT11框架浅析(4)--调试相关

    千次阅读 2013-09-11 22:46:49
    DXUT11框架浅析(4)—辅助调试       D3D8/9和D3D10/11调试...这里可以将Direct3D 9设置为调试运行时(Debug D3D9 Runtime)或零售运行时(RetailD3D9 Runtime)。注意这里的设置是全局的,如果改成调试运行时,则所
  • 最近在做录音功能,用到了Microsoft.DirectX.DirectSound.dll和Microsoft.DirectX.dll两个dll,但是引入后,无法调试项目 具体解决方法: 修改app.config,在setup标签添加属性useLegacyV2RuntimeActivationPolicy...
  • 在DX11,要显示文字可以说是一件比较麻烦的事情。DX9诸如Id3dXFont用于显示文字的接口类都已经被抛弃掉了。目前行之有效的两种显示文字的方法如下: 使用包含文字的位图/矢量图,然后通过一定的方式来获取对应...
  • Directx11入门之第六章 使用Direct3D绘制 @(读书笔记)[读书笔记, 技术交流] Directx11入门之第六章 使用Direct3D绘制 6.1 顶点和输入布局(VERTICES AND INPUT LAYOUTS) 6.2 顶点缓冲(VERTEX BUFFERS) 6.3 目录...
  • Directx11入门之第四章 初始化Direct3D

    千次阅读 2018-02-25 16:08:04
    Directx11入门之第四章 初始化Direct3D @(读书笔记)[读书笔记, 技术交流] Directx11入门之第四章 初始化Direct3D 4.3.3 两帧的时间间隔 4.3.4 总时间 4.4 D3D程序Demo 4.4.1 D3D程序 4.4.2 非框架的函数 ...
  • 以及检查硬件功能,调试函数。可以认为是资源的提供者。 Device Context,ID3D11DeviceContext。使用资源。绑定资源,Shader对象,状态对象等到流水线。以及控制计算流水器的执行。 Immedite context。立即模式,...
  • 最近正在学习Directx 11的开发,上一次记录了Win32应用程序的基础,主要是注册窗体类,加载图标和鼠标,处理事件循环等,链接为:C++Directx11开发笔记...今天我们要介绍的是Direct3D基础,其中包括Direct3D 11的设备
  • 1.在windows7上编译程序,设置的是Debug版本,结果在执行第一步就失败了,无法创建设备。 ...跟踪到执行点,发现是Debug版本,显卡驱动程序不支持,无法创建支持调试Direct3D设备创建。
  • Direct3D

    千次阅读 2007-11-29 13:53:00
    这一章我们首先将描述direct3D的通用的架构,并且讨论Direct3D与windows GDI的联系,然后再引入Direct3D的一些抽象概念:devices, swap chains , surfaces和resources。 接下来,我们将描述IDirect3D接口,这个接口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,849
精华内容 10,739
热门标签
关键字:

direct11调试信息