很多學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,選擇要debug的program:
這裏我們選了A single-frame模式,方便debug。
點擊start experiment。
打開選中的程序後按下F12就可以捕獲當前幀的所有數據。關掉選中的程序,PIX就會自動進入編輯調試模式
這裏我們可以選擇進入Render tab針對當前幀的某一像素進行debug;或者進入Mesh tab看頂點數據,包括頂點數據在進入vertex shader前後,進入geometry shader後的變化(這個必須在draw calls命令下才可以看)。
先試試選擇進入Mesh tab:隨便選中一個Draw()命令,點擊Mesh,就可以看到以下各個頂點的數據,截圖如下:
點擊PostVS的VTX或者PostGS的Prim,就可以進入計算這個頂點或者Primitive的shader代碼,這裏我們選擇了Prim下的P0,進入了調試P0的Geometry Shader狀態:
然後我們就可以開始逐行的調試shader代碼。
我們就大概做個入門總結到這裏,其他大家可以慢慢摸索了。