【USparkle專欄】如果你深懷絕技,愛“搞點研究”,樂于分享也博采眾長,我們期待你的加入,讓智慧的火花碰撞交織,讓知識的傳遞生生不息!
這是侑虎科技第1800篇文章,感謝作者徐門子美供稿。歡迎轉發分享,未經作者授權請勿轉載。如果您有任何獨到的見解或者發現也歡迎聯系我們,一起探討。(QQ群:793972859)
作者主頁:
https://www.zhihu.com/people/BloodyGuys
每次稍微改一下引擎的Shader源碼,隨便修改一行USH文件,引擎都要十幾分鐘編譯Shader,非常影響開發效率,后來開始嘗試在RenderDoc里開發Shader,任何USH文件都是秒編譯,修改馬上就能看到,確實很方便,只恨之前不早早養成這個習慣。
而且Unreal Engine即使不使用引擎源碼,也可以直接打開引擎的ShaderDebug功能,直接修改Shader源碼。
一、打開Shader調試
修改源碼中的配置文件以調試著色器源碼ConsoleVariables.ini。
打開ShaderDevelopmentMode時,Shader編譯報錯不會直接Crash引擎,改一改還能重新編譯:
r.ShaderDevelopmentMode=1
打開Shaders.Optimize和Shaders.Symbols可以在Debugger中顯示Shader源碼:
r.Shaders.Optimize=0 r.Shaders.Symbols=1
更加硬核一點,如果需要使用類似GLSLC命令行來手動編譯Shader,那么加上“-g”就可以保留Shader源碼:
glslc -g base.frag -o base_frag.spv
在UE5.2之后,可以在[Platform]Engine.ini定義配置,詳情見:
《Shader Debugging Workflows》
https://dev.epicgames.com/documentation/en-us/unreal-engine/shader-debugging-workflows-unreal-engine?application_version=5.2
比如:
;DefaultEngine.ini [ShaderCompiler] r.Shaders.Symbols=1 r.Shaders.GenerateSymbols=1 [ShaderCompiler_BuildMachine] r.Shaders.WriteSymbols=1 r.Shaders.WriteSymbols.Zip=1
二、Shader開發流程
在引擎里搭一個簡單測試場景,然后RenderDoc截一幀,記得先打開RenderDoc插件:
命令行:renderdoc.CaptureFrame
如果需要開發和調試GlobalShader或者ComputerShader,這個Shader不是每幀都會被調用或者正常的Capture都無法捕獲到,那么就需要在代碼里手動捕獲:
#include "RenderCaptureInterface.h" ... // 在GameThread中創建FScopedCapture然后持續監聽叫“Xk-MyDrawCallName”的Event, // 一旦RenderThread開始繪制,就會捕獲到這個DrawCall。 RenderCaptureInterface::FScopedCapture RenderCapture(true, TEXT("Xk-MyDrawCallName")); ENQUEUE_RENDER_COMMAND(MyCustomGlobalShader)([](FRHICommandListImmediate& RHICmdList) { TRACE_CPUPROFILER_EVENT_SCOPE(MyCustomGlobalShader_Render); FRDGBuilder GraphBuilder(RHICmdList, RDG_EVENT_NAME("Xk-MyDrawCallName")); // Do something... GraphBuilder.Execute(); }); ...
這里創建的RenderCaptureInterface::FScopedCapture,第一個參數是是否開啟Capture,第二個參數是需要捕獲的DrawCall的EventName,一旦這個DrawCall開始繪制,就會自動被RenderDoc截幀并打開軟件。
找到要渲染的物體,我想直接改它的Shader源碼,需要先定位到這個DrawCall:
Find the DrawCall
然后去Pipeline State這個窗口,選擇需要修改的Shader類型,這里想要修改Vertex Shader,點擊Edit。注意,在Vertex Shader Edit窗口,修改Pixel Shader的文件,是不生效的:
然后找到你要修改的文件,比如LocalVertexFactory.ush,直接在RenderDoc寫代碼,修改完點擊Apply changes,修改就直接應用到Shader上了,注意Errors窗口的編譯報錯:
Shader修改了,Apply changes之后,在Texture Viewer里可以直接查看結果:
Texture Viewer
因為我改了Vertex Shader,所以改變的是頂點的數值,直接去Mesh Viewer中查看下變化,鼠標右鍵可以直接選擇頂點,挨個檢查數值:
Mesh Viewer
當渲染都正確之后,把RenderDoc里修改的代碼部分,拷貝到引擎的Shader源碼里,再重新編譯一下引擎檢查一下結果:
Unreal Engine Viewport
三、截取其他應用程序
1. 在Tools->Settings里開啟Global Process Hook:
Tools-Settings
2. 指定應用程序啟動路徑,開啟Global Hook:
Enable Global Hook
3. 手動啟動應用程序,在File->Attach to Running Instance里重新掛載程序:
File-Attach to Running Instance
4. From now on,應該可以正常截幀了:
Capture Frame
5. 如果你發現RenderDoc無法正常掛載需要截獲的程序,那么有可能是你的電腦開啟了安全啟動(Secure Boot),你需要重啟電腦,進入BIOS/UEFI設置:在計算機啟動時,你通常需要按下某個特定的鍵(如F2、F10、F12、Delete或Esc)來進入BIOS/UEFI設置。在BIOS/UEFI設置中,找到“安全啟動”或“Secure Boot”選項。這個選項通常位于“啟動”、“安全”或“高級”菜單下,然后禁用它。
四、小記
實際使用RenderDoc開發Shader后,發現真的香,之前寫Shader需要一遍一遍的編譯引擎,非常痛苦,尤其是去修改那幾個通用的USH文件,還是在RenderDoc一次寫完,然后把代碼寫回引擎更快。唯一的問題就是RenderDoc的IDE非常簡陋。
快捷鍵【Ctrl+Shift+,】,打開GPU Visualizer,渲染管線的RenderPass,去找源碼中對應的代碼:
引擎基本架構方便理解引擎代碼層級:
工具層(Tool Layer)
地形Landscape工具、植被Foliage工具等
功能層(Function Layer)
多線程,GameThread Tick,RenderThread Submit,RHIThread Submit等
資源層(Resource Layer)
UObject、UStaticMesh、UTexture、USound等
核心層(Core Layer)
數學庫FMath,數據結構,內存管理,引擎基礎
平臺層(Platform/RHI Layer)
操作系統、GraphicsAPI、硬件架構
主要渲染管線入口
Console & PC Renderer入口:
void FDeferredShadingSceneRenderer::Render(FRDGBuilder& GraphBuilder) { }
Mobile Renderer入口:
void FMobileSceneRenderer::Render(FRDGBuilder& GraphBuilder) { //... if (bDeferredShading) { RenderDeferred(GraphBuilder, SortedLightSet, ViewFamilyTexture, SceneTextures); } else { RenderForward(GraphBuilder, ViewFamilyTexture, SceneTextures); } //... }
Mobile Forward Shading入口:
void FMobileSceneRenderer::RenderForward(FRDGBuilder& GraphBuilder, FRDGTextureRef ViewFamilyTexture, FSceneTextures& SceneTextures) { }
Mobile Deferred Shading入口:
void FMobileSceneRenderer::RenderDeferred(FRDGBuilder& GraphBuilder, const FSortedLightSetSceneInfo& SortedLightSet, FRDGTextureRef ViewFamilyTexture, FSceneTextures& SceneTextures) { }
文末,再次感謝徐門子美 的分享, 作者主頁: https://www.zhihu.com/people/BloodyGuys, 如果您有任何獨到的見解或者發現也歡迎聯系我們,一起探討。(QQ群: 793972859 )。
近期精彩回顧
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.