Unity-使用 Visual Studio 來調(diào)試 DirectX 11/12 著色器
使用 Microsoft Visual Studio(2012 版或更高版本)中的圖形調(diào)試器從 Unity Editor、Windows 獨(dú)立平臺(tái)或通用 Windows 平臺(tái)等平臺(tái)捕獲應(yīng)用程序的各個(gè)幀以進(jìn)行調(diào)試。
要安裝 Visual Studio 中的圖形調(diào)試器,請(qǐng)執(zhí)行以下操作:
1.選擇?Tools?>?Get Tools and Features

2.在?Individual components?選項(xiàng)卡上,滾動(dòng)到?Games and Graphics__,并選中?Graphics debugger and GPU profiler for DirectX__ 的復(fù)選框
3.單擊?Modify
4.等待安裝,然后按照說明重新啟動(dòng)計(jì)算機(jī)
使用 Visual Studio 來捕獲 DirectX 著色器
應(yīng)使用已構(gòu)建的 Unity 應(yīng)用程序版本來捕獲幀,而不是使用 Unity Editor 中運(yùn)行的版本。這是因?yàn)?Editor 可能同時(shí)打開多個(gè)子窗口,而圖形調(diào)試器可能會(huì)從非預(yù)期窗口捕獲幀。
從 Unity Editor 或 Windows 獨(dú)立平臺(tái)中捕獲幀的步驟
要在這兩個(gè)平臺(tái)中的任何一個(gè)平臺(tái)上使用圖形調(diào)試器,您需要?jiǎng)?chuàng)建一個(gè)虛擬的 Visual Studio 項(xiàng)目:
1.啟動(dòng) Visual Studio 2017
2.選擇?File?>?New?>?Project?>?Visual C++?>?Empty Project
3.選擇?Project?>?Properties?>?Configuration Properties?>?Debugging
4.在?Command?字段中,將 $(TargetPath) 替換為 Unity Editor 或 Windows 獨(dú)立平臺(tái)的路徑(例如?C:\MyApp\MyApp.exe)
5.如果要強(qiáng)制 Windows 獨(dú)立平臺(tái)或 Unity Editor 在 DirectX 11 下運(yùn)行,請(qǐng)選擇?Command Arguments?并輸入?-force-d3d11。

6.選擇?Debug?>?Graphics?>?Start Graphics?Debugging
7.如果全部配置都正確無誤,Unity 會(huì)在應(yīng)用程序的左上角顯示以下文本:

8.要捕獲幀,請(qǐng)使用鍵盤上的 Print Screen 鍵,或單擊 Visual Studio 界面左側(cè)的?Capture Frame?框

使用 Visual Studio 來調(diào)試 DirectX 著色器
要調(diào)試著色器,必須使用調(diào)試符號(hào)進(jìn)行編譯。為此,需要插入?#pragma enable_d3d11_debug_symbols。
著色器應(yīng)如下所示:
Shader "Custom/NewShader" { ?
?Properties { ? ? ?
? ?_MainTex ("Base (RGB)", 2D) = "white" {} ?
?} ? ?
?SubShader { ?
? ?Tags { "RenderType"="Opaque" } ?
? ?LOD 200 ? ? ? ?
? ?CGPROGRAM ? ?
? ?#pragma surface surf Lambert ? ?
? ?#pragma enable_d3d11_debug_symbols
? ?sampler2D _MainTex; ? ? ?
? ?struct Input { ? ?
? ? ?float2 uv_MainTex; ? ?
? ?}; ? ? ?
? ?void surf (Input IN, inout SurfaceOutput o)
? ?{ ? ? ? ? ?
? ? ?half4 c = tex2D (_MainTex, IN.uv_MainTex); ?
? ? ?o.Albedo = c.rgb; ? ?
? ? ?o.Alpha = c.a; ? ? ?
? ?} ? ?
? ?ENDCG ?
?} ? ?
?FallBack "Diffuse"
}
示例工作流程
讓我們創(chuàng)建一個(gè)基本示例來展示整個(gè)過程:
1.創(chuàng)建新的 Unity 項(xiàng)目(請(qǐng)參閱準(zhǔn)備開始文檔)。
2.在頂部菜單中,選擇?Assets?>?Create?>?Shader?>?Standard Surface Shader。此時(shí)將在?Project?文件夾中創(chuàng)建一個(gè)新的著色器文件。
3.選擇著色器文件,然后在 Inspector 窗口中單擊?Open。此時(shí)將在腳本編輯器中打開著色器文件。將?#pragma enable_d3d11_debug_symbols
?插入到著色器代碼中的其他?#pragma
?行下面。
4.創(chuàng)建新的材質(zhì)(菜單:__Assets__ >?Create?> __Material__)。
5.在 Material Inspector 窗口中,選擇?Shader?下拉選單,選擇 __Custom__,然后選擇剛創(chuàng)建的著色器。
6.創(chuàng)建 3D 立方體游戲?qū)ο螅ú藛危篲_GameObject__ >?3D Object?> __Cube__)。
7.將新材質(zhì)分配給新的游戲?qū)ο?。要?zhí)行此操作,請(qǐng)將材質(zhì)從?Project?窗口拖到 3D 立方體上。
8.構(gòu)建適用于 Windows 獨(dú)立平臺(tái)的項(xiàng)目。請(qǐng)注意,實(shí)際項(xiàng)目可能非常大,以至于每次要調(diào)試著色器時(shí)構(gòu)建它們都會(huì)很低效;在這種情況下,請(qǐng)?jiān)?Editor 中進(jìn)行調(diào)試,但要確保您的捕獲已分析正確的窗口。
9.按照前面__使用 Visual Studio 來捕獲 DirectX 著色器__部分描述的步驟捕獲幀。
10.捕獲的幀出現(xiàn)在 Visual Studio 中。右鍵單擊該幀,然后選擇?Pixel。

11.單擊 Vertex Shader 旁邊的 Play 按鈕(以上截屏中圈出)。此時(shí)將打開頂點(diǎn)著色器文件:

在使用 DirectX 12 時(shí)存在一個(gè)已知問題導(dǎo)致 Play 按鈕不可用,并顯示以下錯(cuò)誤:此繪制調(diào)用使用干擾像素歷史記錄計(jì)算的系統(tǒng)值語義 (This draw call uses system-value semantics that interfere with pixel history computation)。如果遇到此問題,請(qǐng)使用?PIX?來調(diào)試著色器。
通用 Windows 平臺(tái)
在進(jìn)行通用 Windows 平臺(tái)的調(diào)試時(shí),不需要?jiǎng)?chuàng)建虛擬 Visual Studio 項(xiàng)目,因?yàn)?Unity 會(huì)創(chuàng)建該項(xiàng)目。
捕獲幀和開始進(jìn)行著色器調(diào)試的步驟與 Unity Editor 或 Windows 獨(dú)立平臺(tái)的步驟相同。
備用著色器調(diào)試技術(shù)
還可以使用?RenderDoc?來調(diào)試著色器。在 RenderDoc 中,從 Editor 中捕獲__場(chǎng)景__,然后使用獨(dú)立平臺(tái)工具進(jìn)行調(diào)試。
PIX?的工作方式與 Visual Studio 的圖形調(diào)試器相似。請(qǐng)使用 PIX 而不是圖形調(diào)試器來調(diào)試 DirectX 12 項(xiàng)目。