zoukankan      html  css  js  c++  java
  • 用Pix调试HLSL

         很多学Directx特别初学者最头痛应该是shader的调试问题了。一般的编译器包括vs都不支持shader的调试。还好微软出了个Pix,其功能相当强大,而不仅仅是debug。这里我们入门主要总结下其debug的功能。

        Pix的调试原理和一般的调试很不一样,它是先把程序运行一遍,然后把中间每一步所有的shader变量,寄存器等等都记录下来,然后再调出来看,以此模拟Directx的过程。

        在用Pix调试shader代码前,要注意下几个问题。

        1是必须在Directx11的编译hlsl函数加上下面的几行代码(注意加粗部分代码):

    DWORD dwShaderFlags=D3DCOMPILE_ENABLE_STRICTNESS;

    #if defined( DEBUG ) || defined( _DEBUG )

    // Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.

    // Setting this flag improves the shader debugging experience, but still allows 

    // the shaders to be optimized and to run exactly the way they will run in 

    // the release configuration of this program.

    dwShaderFlags |= D3DCOMPILE_DEBUG;

    dwShaderFlags |= D3DCOMPILE_SKIP_OPTIMIZATION;

    #endif

    hr=D3DX11CompileFromFile(L"basicEffect.hlsl",pDefines,NULL,szEntryPoint,szShaderModel,dwShaderFlags,NULL,NULL,ppBlobOut,&pErrorBlob,NULL);

    如果是Directx10,则变成:

    DWORD shaderFlags = D3D10_SHADER_ENABLE_STRICTNESS;

    #if defined( DEBUG ) || defined( _DEBUG )

        shaderFlags |= D3D10_SHADER_DEBUG;

    shaderFlags |= D3D10_SHADER_SKIP_OPTIMIZATION;

    #endif

        2是注意文件的路径问题,比如hlsl,纹理等。因为Pix默认这些文件是和Exe放在同一个文件夹里面。在读入这些文件时,如果是用系统的绝对路径,那么问题不大。否则就把这些文件放到和exe同一个文件夹下。

        然后我们开始使用Pix了。打开Pix,打开file->New Experiment,选择要debugprogram:

       

        这里我们选了A single-frame模式,方便debug

        点击start experiment

        打开选中的程序后按下F12就可以捕获当前帧的所有数据。关掉选中的程序,PIX就会自动进入编辑调试模式

        这里我们可以选择进入Render tab针对当前帧的某一像素进行debug;或者进入Mesh tab看顶点数据,包括顶点数据在进入vertex shader前后,进入geometry shader后的变化(这个必须在draw calls命令下才可以看)。

      先试试选择进入Mesh tab:随便选中一个Draw()命令,点击Mesh,就可以看到以下各个顶点的数据,截图如下:

         点击PostVSVTX或者PostGSPrim,就可以进入计算这个顶点或者Primitiveshader代码,这里我们选择了Prim下的P0,进入了调试P0Geometry Shader状态:

        然后我们就可以开始逐行的调试shader代码。

        我们就大概做个入门总结到这里,其他大家可以慢慢摸索了。

  • 相关阅读:
    mysql数据库基本类型
    常用辅助类【转】
    Java 并发笔记】并发机制底层实现整理[转发]
    关于PROPAGATION_NESTED的理解
    线程数设置
    c# Expression 扩展[转]
    Net定时器 【转载】
    【转】高可用设计-58沈剑
    【转】委托的三种调用示例(同步调用 异步调用 异步回调)
    [coursera OA] acme match
  • 原文地址:https://www.cnblogs.com/bester/p/3255793.html
Copyright © 2011-2022 走看看