日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GPU Shader 程序调试方法

發(fā)布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GPU Shader 程序调试方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。