GPU Shader 程序调试方法
轉(zhuǎn)載自: http://blog.csdn.net/pizi0475/article/details/7573939
內(nèi)容提要:手動調(diào)試和使用工具PIX調(diào)試Direct3D程序。
????? 3D繪圖中常見問題:
1.模型消失,沒有出現(xiàn)在畫面上;
2.模型在畫面上失真、變形或者閃爍;
3.貼圖出現(xiàn)不正常拉扯;
4.使用了錯誤的貼圖、Shader或者RenderState .
?????? 沒有固定方法來查找錯誤的原因,一般嘗試改變繪圖設(shè)置,慢慢縮小問題可能發(fā)生的范圍。
?????? 模型消失時,第一步檢查轉(zhuǎn)換矩陣,尤其是投影矩陣。如果投影矩陣的Z near和Z far范圍不夠大,3D對象就會落在屏幕坐標(biāo)系之外而被忽略。可以試著改變投影矩陣的可視范圍,看看消失的對象是否會重新出現(xiàn)。必要時檢查頂點位置和轉(zhuǎn)換矩陣的相乘結(jié)果,看看它們是否會落在畫面范圍中。還可以把透視投影的矩陣暫時改成正交投影,這樣可以查看3D對象的位置是否正確。
?????? 確認(rèn)矩陣沒有問題后,如果畫面仍然不正確,問題應(yīng)該出在模型數(shù)據(jù)和紋理的正確性上。這時可以暫時把紋理簡化。第一個簡化通常是關(guān)閉光照功能。如果模型在畫面上看起來過暗,甚至是完全黑色時,可能是光照的設(shè)置出了問題,這時只有關(guān)閉光照功能,就可以讓模型重新出現(xiàn)。簡化紋理還可以把Alpha Test和Blending功能關(guān)閉,有時可能貼圖的Alpha層完全是黑色,或者紋理使用了錯誤的Alpha Test比較值,這些錯誤都有可能讓整個對象消失。
?????? 如果關(guān)閉Alpha Test和Blending功能后,畫面上仍然看不到3D對象,就把紋理做最終的簡化,移除所有的貼圖,讓物表紋理固定地輸出單一顏色。如果這個步驟可以讓模型出現(xiàn)在畫面上,那就可以肯定問題出在貼圖設(shè)置或Pixel Shader的代碼上。
?????? 經(jīng)過前面3個步驟后,如果模型仍然沒有出現(xiàn)在正確的位置上,就在檢查模型數(shù)據(jù)的正確性。第1步在畫出模型時,把幾何圖形的種類由三角形Triangle暫時改成點Point,因為創(chuàng)建三角形數(shù)據(jù)的Index Buffer有可能發(fā)生錯誤,所以無法組合出正確的模型。暫時先把模型用點Point的類型來畫,最起碼可以在畫面上看到模型的大致形狀,如果連大致形狀都是錯誤的,那代表最原始的模型數(shù)據(jù)就已經(jīng)出現(xiàn)問題了。
?????? 模型數(shù)據(jù)的問題有可能出現(xiàn)在GPU讀取數(shù)據(jù)的部分,也有可能在設(shè)置頂點數(shù)據(jù)字段時出現(xiàn)錯誤。這個部分比較難確認(rèn),比較好的方法是通過工具來檢查,在C++部分所能做到的檢查工作如下:
1.確定頂點數(shù)據(jù)的大小size正確,
2.確認(rèn)頂點數(shù)據(jù)字段設(shè)置,讓GPU能夠獲得所以需要用到的數(shù)據(jù)。
3.在測試時,也可以先把數(shù)據(jù)簡化,暫時只傳入頂點的位置Position,忽略發(fā)線Normal、顏色Color,以及貼圖坐標(biāo)等,先只使用頂點位置把整個模型用點的方法畫出來,只要看到模型的大致形狀,再試著去傳入其它數(shù)據(jù)。
??????? 使用上述的方法應(yīng)該可以把問題范圍縮小,這時也許還沒有找出真正的原因,但是先把范圍縮小后,再通過工具,應(yīng)該就可以發(fā)現(xiàn)問題所在。
??????? Direct3D調(diào)試工具PIX(Performance Investigate for Xbox) for Windows.在Direct SDK的工具下可以找到這個程序。PIX可以查看貼圖和模型,繪圖結(jié)果,頂點和像素著色器調(diào)試等功能。注意PIX啟動要調(diào)試的程序路徑必須是英文,否則出現(xiàn)不能運行錯誤“PIX Experiment File Version Mismatch”。
???????? 使用PIX分為2大步驟:第1步是通過PIX來啟動想要調(diào)試的程序,并在程序啟動后,按工具設(shè)置來截取某個畫面所使用的Direct3D指令;第2步是在截取畫面后關(guān)閉繪圖程序,PIX接下來應(yīng)該會切換到回放Direct3D指令的模式。
???????? PIX先把某個畫面中的Direct3D繪圖指令截取下來,再把每個指令都視為1個斷點,程序員可以從Event窗口中選擇其中指令,再通過Render窗口來查看繪圖的結(jié)果。Render窗口顯示的是,從這個畫面的起點開始一直運行到說選擇斷點為止的3D繪圖結(jié)果。
???????? PIX可以查看程序中所使用的貼圖和模型數(shù)據(jù)。在Event窗口中找到相對應(yīng)的SetTexture函數(shù)調(diào)用,雙擊函數(shù)的第2個參數(shù),即藍(lán)色文字的參數(shù),右下方的窗口中就會顯示所使用的貼圖。如果要查看模型,選擇Event窗口中畫出模型的DrawPrimitive和DrawIndexedPrimitive函數(shù)調(diào)用(單擊工具Event窗口最上邊的按鈕D也可以上下移動到函數(shù)調(diào)用),再在Detail窗口中選擇Mesh,窗口中就會顯示坐標(biāo)轉(zhuǎn)換前和轉(zhuǎn)換后的的模型,還會顯示出一個列出所有的頂點數(shù)據(jù)的列表。雙擊其中1個頂點,就可以進(jìn)入Vertex Shader的調(diào)試模式。其中查看坐標(biāo)轉(zhuǎn)換前后的模型非常實用,馬上可以看出加載模型是否正確,以及VS處理后是否正確,顯示是否超出。Mesh中PreVS的頂點為原始輸入坐標(biāo)值,而PostVS的頂點為處理后的坐標(biāo)值,即原始輸入坐標(biāo)值XWorld_View_Proj矩陣=處理后的坐標(biāo)值,其中矩陣為世界,視圖,投影三個矩陣的乘積。
??????? 調(diào)試Pixel Shader。在Detail窗口的Render模式,在要調(diào)試的像素上右擊,彈出一個快捷菜單,選擇菜單上的Debug This Pixel選項,進(jìn)入Pixel Shader的調(diào)試模式。
??????? 具體的調(diào)試操作可以查閱SDK.
??????? Visual Studil也提供了Shader的調(diào)試模式,不過不太實用,Microsoft也沒有再對它更新。PIX所提供的調(diào)試功能比較完整,也比較實用。
??????? OpenGL調(diào)試工具有g(shù)lslDevil,GLIntercept和gDEBugger等。
?????? 摘選于彭國倫的《3D繪圖程序設(shè)計》.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的GPU Shader 程序调试方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Newton Method in Mac
- 下一篇: Boltzmann Machine 入门