用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代碼。

    我們就大概做個入門總結到這裏,其他大家可以慢慢摸索了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章