GPU Shader 程序调试方法
轉載自: http://blog.csdn.net/pizi0475/article/details/7573939
內容提要:手動調試和使用工具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繪圖程序設計》.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的GPU Shader 程序调试方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Newton Method in Mac
- 下一篇: 减肥吃柠檬可以吗