逐步解說:因裝置狀態而遺漏的物件
本逐步解說示範如何使用 Visual Studio 圖形診斷檢查因為裝置狀態設定不正確而遺失的物件。
這個逐步解說會示範如何:
使用 [圖形事件清單] 尋找此問題的潛在來源。
使用 [圖形管線階段] 視窗檢查 DrawIndexed Direct3D 應用程式開發介面呼叫的作用。
使用 [圖形像素記錄] 視窗找出更明確的問題。
檢查裝置狀態以找出潛在問題或錯誤組態。
情節
在 3D 應用程式中,物件可能不會如預期出現的其中一個原因是圖形裝置組態不正確,這造成物件在轉譯中遭到排除,例如,當捲繞順序導致三角形揀選錯誤時,或是當深度測試功能造成物件中的所有像素遭拒時。
在本逐步解說所述的情節中,您已到達 3D 應用程式開發的第一個里程碑,並準備開始進行第一次測試。 不過,當您執行應用程式時,只有使用者介面呈現至螢幕。 使用圖形診斷,就可以將問題擷取至圖形記錄,讓您可以偵錯應用程式。 這個問題在應用程式中如下所示:
如需如何在圖形記錄中擷取圖形問題的詳細資訊,請參閱擷取圖形資訊。
調查
使用圖形診斷工具,您可以載入圖形記錄檔,檢查測試期間所擷取的框架。
檢查圖形記錄中的框架
在 Visual Studio 中,載入包含顯現遺漏模型之框架的圖形記錄。 新的 [圖形診斷] 索引標籤隨即出現在 Visual Studio 中。 這個索引標籤的上半部是所選取框架的轉譯目標輸出。 下半部是 [框架清單],顯示每個擷取的框架為縮圖影像。
在 [框架清單] 中,選取示範未顯示模型的框架。 更新呈現目標反映選取的框架。 在這個情節中,圖形記錄索引標籤如下所示:
在選取示範問題的框架後,您可以使用 [圖形事件清單] 進行診斷。 [圖形事件清單] 包含每個會呈現使用中框架的 Direct3D 應用程式開發介面呼叫,例如設定裝置狀態的應用程式開發介面呼叫,建立和更新緩衝區的應用程式開發介面呼叫和繪製顯示在框架 (Frame) 中的物件的應用程式開發介面呼叫。 許多類型的呼叫都很有趣,因為當應用程式如預期般運作 (例如,繪製、分派、複製或清除呼叫) 時,轉譯目標中通常 (但不一定) 會有對應的變更。 由於每一個繪製呼叫會表示應用程式所轉譯的幾何 (分派呼叫也可以轉譯幾何),因此繪製呼叫特別值得注意。
確定已進行繪製呼叫
開啟 [圖形事件清單] 視窗。 在 [圖形診斷] 工具列上,選擇 [事件清單]。
在 [圖形事件清單] 中查看繪製呼叫。 若要使這項工作更容易執行,請在 [圖形事件清單] 視窗右上角的 [搜尋] 方塊中輸入「繪製」。 這會篩選清單,使其只包含標題中含有「繪製」的事件。 在這個情節中,您會發現進行了幾次繪製呼叫:
確認正在進行繪製呼叫之後,您可以判斷哪一個事件對應至遺漏的幾何。 因為您知道遺漏的幾何沒有繪製到轉譯目標 (在此例中),您可以使用 [圖形管線階段] 視窗判斷哪一個繪製呼叫對應至遺漏的幾何。 不論呈現目標的效果如何, [圖形管線階段] 視窗顯示已傳送至每個繪製呼叫的幾何資料。 當您瀏覽繪製呼叫時,管線階段會更新以顯示與該呼叫相關聯的幾何,而轉譯目標輸出會更新以顯示轉譯目標在呼叫完成後的狀態。
尋找遺失幾何的繪製呼叫
開啟 [圖形管線階段] 視窗。 在 [圖形診斷] 工具列上,選擇 [管線階段]。
在 [圖形管線階段] 視窗中查看遺漏模型時,瀏覽每個繪製呼叫。 [輸入組合語言] 階段顯示原始模型資料。 [端點著色器] 階段顯示轉換後的模型資料。 [像素著色器] 階段顯示像素著色器輸出。 [輸出合併] 階段顯示這個繪製呼叫和所有繪製呼叫的合併呈現目標。
當您到了對應到遺失模型的繪製呼叫時請停止。 在這個情節中,[圖形管線階段] 視窗顯示幾何已轉譯,但未在轉譯目標中出現:
確認應用程式轉譯了遺漏的幾何而找到對應的繪製呼叫之後,您可以選取應顯示遺漏幾何之轉譯目標輸出的部分,然後使用 [圖形像素歷史記錄] 視窗查明已將像素排除的原因。 像素記錄包含可能會每個對特定像素產生效果的繪製呼叫清單。 [圖形像素歷史記錄] 視窗中的每個繪製呼叫是以數字來識別,這個數字也會顯示在 [圖形事件清單] 視窗中。 這可以協助您確認像素應顯示缺少的幾何,並且找出排除像素的原因。
判斷排除像素的原因
開啟 [圖形像素歷史記錄] 視窗。 在 [圖形診斷] 工具列上,選擇 [像素歷史記錄]。
根據 [像素著色器] 縮圖,在應該含有遺漏幾何之一部分的框架緩衝區輸出中選取像素。 在這個情節中,像素著色器輸出涵蓋大部分轉譯目標。選取像素之後,[圖形像素歷史記錄] 視窗如下所示:
比對您 (在 [圖形事件清單] 視窗中) 檢查的繪製呼叫數目與 [圖形像素歷史記錄] 視窗中的繪製呼叫數目,確認選取的轉譯目標像素包含幾何的一部分。 如果 [圖形像素歷史記錄] 視窗中沒有任何呼叫符合您所檢查的繪製呼叫,請重複這些步驟 (除了步驟 1) 直到您找到相符項目。 在這個情節中,相符的繪製呼叫如下所示:
當您找到相符項目時,請展開 [圖形像素歷程記錄] 視窗中相符的繪製呼叫,並確認已排除像素。 [圖形像素歷史記錄] 視窗中的每個繪製呼叫會對應至因為對應物件之幾何而與該像素交集的一個或多個幾何基本圖形 (點、線或三角形)。 每個這樣的交集都可能形成像素的完稿色彩。 因為深度測試失敗而排除的基本圖形是以在由左至右向下傾斜之箭頭上顯示 Z 字母的圖示來表示。
展開排除的基本圖形以進一步檢查導致它被排除的狀態。 在 [輸出合併] 群組中,將指標移至 [結果] 上方。 工具提示會指出為何排除基本圖形的原因。 在這個情節中,檢查顯示基本圖形因為在深度測試失敗而遭到排除,因此不是像素完稿色彩的成因。
在判定幾何沒有出現的原因是其基本圖形未通過深度測試,您可能會懷疑這個問題與裝置狀態設定不正確有關。 您可以使用 [圖形物件表],檢查裝置狀態和其他 Direct3D 物件資料。
檢查裝置狀態
開啟 [圖形物件表] 視窗。 在 [圖形診斷] 工具列上,選擇 [物件表]。
在 [圖形物件表] 中找出 [D3D10 裝置] 物件,然後開啟 [D3D10 裝置] 物件。 新的 [d3d10 裝置] 索引標籤隨即在 Visual Studio 中開啟。 要讓這項工作更容易進行,您可以依[型別] 排序 [圖形物件表]:
檢查 [d3d10 裝置] 索引標籤中顯示的裝置狀態,找出可能的問題。 由於幾何因為其基本圖形在深度測試失敗而沒有出現,您可以專注於影響深度測試的裝置狀態,例如深度樣板。 在這個情節中,[深度樣板描述] (在 [輸出合併狀態] 下) 包含深度函式成員 D3D10_COMPARISON_GREATER 不常見的值:
在您判斷轉譯問題的原因可能是深度函式設定不正確,您可以使用這項資訊以及您對程式碼的了解,找出深度函式中設定錯誤的位置,然後解決問題。 如果您不熟悉程式碼,您可以使用偵錯時收集到的線索來搜尋這個問題,例如您可以根據這個情節中的 [深度樣板描述],在程式碼中搜尋像 "depth" 或 "GREATER" 的文字。 修正程式碼之後,重建並再次執行應用程式來確認轉譯問題已解決: