跳轉到主要內容
從 2023 年 6 月版 GDK 開始,可以在 GPU 擷取中偵測擲回例外狀況的著色器。這會將著色器例外狀況即時偵錯功能延伸到 GPU 擷取。它會在整個 GPU 擷取中偵測擲回例外狀況的著色器,並以摘要報告的形式呈現結果。為此,PIX 的 GPU Capture 版面配置中新增了 Shader Exceptions 檢視。在 XBOX Series X|S 上,著色器例外狀況預設為遮罩。此功能可讓您取消遮罩,以便在整個畫面中偵測並偵錯擲回例外狀況的著色器。目前支援無效 (包括 NaN)、浮點數除以零、整數除以零、溢位與反向溢位例外狀況。

偵測例外狀況

Shader Exceptions 檢視會顯示 Detect Exceptions 面板。此面板會顯示您可以選擇的支援例外狀況類型。所有例外狀況類型預設皆已選取。面板也會顯示應納入例外狀況偵測考量的著色器階段清單。所有著色器階段預設皆已選取。請注意,偵測著色器例外狀況需要 pixie 分析。選取所需的例外狀況與著色器階段後,即可按下 Detect 按鈕以產生例外狀況摘要報告。 Detect Exceptions 面板

例外狀況摘要報告

例外狀況摘要報告會顯示所有已觸發之所選例外狀況的項目。每個例外狀況記錄項目會顯示著色器指令的位址 (PC)、例外狀況清單與觸發次數。請注意,PC 指向擲回例外狀況之指令的下一個指令。對於光線追蹤著色器,也會顯示函式名稱。如果已解析 PDB 且有可用的行對應,則會顯示對應於 PC 的 HLSL 檔名、函式簽章與 HLSL 行號。這些例外狀況項目會依每個所選著色器階段、每個 Global ID 顯示。每個例外狀況記錄項目都有 Open in Debugger 按鈕,讓您可以偵錯著色器並實際查看例外狀況。 例外狀況摘要報告 從 2023 年 10 月版 GDK 開始,只會針對計算著色器的每個例外狀況記錄項目列出群組 ID 值。Open in Debugger 按鈕會以這些群組 ID 值啟動偵錯工作階段,讓您可以使用著色器偵錯工具重現所列出的例外狀況。 詳細例外狀況

偵錯擲回例外狀況的著色器

可以在 PIX 中偵錯著色器,以調查著色器例外狀況。您可以按下要調查之著色器旁的綠色箭號來執行此動作。這會在偵錯工具中以取消遮罩例外狀況的方式開啟著色器。您可以使用與非例外狀況情境相同的方式偵錯著色器,但當 PC 到達記錄項目中所述的指令時,您會看到已觸發之例外狀況的通知。可以使用「Run to Exception」按鈕快速前往觸發例外狀況的那一行。請注意,它會停在擲回例外狀況之指令的下一個指令。也可以檢查 trapsts 暫存器中的例外狀況位元,以確認觸發的例外狀況。可以使用倒退逐步執行來找出例外狀況的來源。請注意,只有從 Shader Exceptions 檢視啟動的偵錯工作階段才會取消遮罩例外狀況。
取消遮罩數值例外狀況時,著色器的數值行為會有所不同。
請注意,在偵錯工具中開啟的著色器使用預設參數。記錄中所述的例外狀況可能不會由此特定著色器波觸發。目前無法找出擲回例外狀況的確切著色器波,但我們計劃在即將推出的 GDK 版本中新增此功能。在那之前,您可以嘗試更新著色器參數,以找出擲回您感興趣之例外狀況的波。

支援的例外狀況

目前可以在 GPU 擷取中偵測下列數值例外狀況:無效 (包括 NaN)、浮點數除以零、整數除以零、溢位與反向溢位。

無效例外狀況

當運算元對該運算無效時,就會擲回無效例外狀況。這會產生 QNaN。當任何運算元為 NaN 時,或在其他值的情況下,都可能發生無效例外狀況,例如: V_FRACT_F32 遇到 INF、V_SIN_F32/V_COS_F32 遇到 INF、V_MIN/MAX_F32 遇到 INF、V_LOG_CLAMP_F32 遇到負數輸入、V_LOG_LEGACY_F32 遇到負數輸入、V_RSQ/RSQ_CLAMP/RSQ_LEGACY_F32 遇到負數輸入、V_SQRT_F32 遇到負數輸入、V_FREXP_EXP_I32_F32 與 V_FREXP_MANT_F32 遇到 INF、V_CVT_U32_F32 遇到超出 UINT 範圍的值、V_CVT_I32_F32 遇到超出 INT 範圍的值、V_DIV_FIXUP_F32 遇到 0/0 與 INF/INF

浮點數除以零例外狀況

當任何浮點值除以零時,就會擲回浮點數除以零例外狀況。結果為 +/-INF。

整數除以零例外狀況

當任何整數值除以零時,就會擲回整數除以零例外狀況。結果未定義。

溢位例外狀況

當捨入後的結果大於 UINT/INT/float 時,就會擲回溢位例外狀況。結果為有號最大數或 INF。

反向溢位例外狀況

當確切或捨入後的結果小於最小可表示的正規 (非次正規) 數時,就會擲回反向溢位例外狀況。結果為次正規數或零。

備註

取消遮罩數值例外狀況時,著色器的數值行為會有所不同。 請注意,在偵錯工具中開啟的著色器使用預設參數。記錄中所述的例外狀況可能不會由此特定著色器波觸發。目前無法找出擲回例外狀況的確切著色器波,但我們計劃在即將推出的 GDK 版本中新增此功能。在那之前,您可以嘗試更新著色器參數,以找出擲回您感興趣之例外狀況的波。

另請參閱

著色器例外狀況的即時偵錯 XBOX 主機遊戲開發 (環境與工具)
最後修改於 2026年10月8日