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代码。

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

  • 相关阅读:
    题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子,假如兔子都不死,问M个月时兔子的数量,M为键盘读入的正整数。(请用java语言作答)
    无聊游戏随笔--学院篇
    Java数组冒泡,选择,插入三种常用排序法及自带的快速排序法
    js写年月日三级下拉列表框
    查询避免Unknown column ‘xxx’ in ‘where clause’
    MyEclipse运行web程序报错,先检查这几点!
    Servlet开发之中线程安全问题
    取消Eclipse等号、分号、空格代码自动补全
    try/catch、finally语句的执行顺序测试
    02-MySQL双机热备的搭建
  • 原文地址:https://www.cnblogs.com/bester/p/3255793.html
Copyright © 2011-2022 走看看