网易首页 > 网易号 > 正文 申请入驻

Unreal Engine Shader 开发技巧

0
分享至

【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.

相关推荐
热点推荐
为什么全国人民都在拒接电话?

为什么全国人民都在拒接电话?

黯泉
2026-04-18 17:00:56
杜兰特为何突然受伤?答案曝光,令人痛心,郭艾伦也曾深受其害

杜兰特为何突然受伤?答案曝光,令人痛心,郭艾伦也曾深受其害

萌兰聊个球
2026-04-21 09:22:31
带队首季就拿三冠王!足坛都该给长约,巴萨为何对弗里克犹豫了?

带队首季就拿三冠王!足坛都该给长约,巴萨为何对弗里克犹豫了?

徐纗老表哥
2026-04-21 07:27:35
阿拉格齐闯下大祸,伊朗内部爆发冲突,革命卫队宣布:有条件封海

阿拉格齐闯下大祸,伊朗内部爆发冲突,革命卫队宣布:有条件封海

古史青云啊
2026-04-21 09:51:28
中国高校只剩7年窗口期 学生数量断崖式塌方后一半高校都得死

中国高校只剩7年窗口期 学生数量断崖式塌方后一半高校都得死

六子吃凉粉
2026-04-20 19:10:49
爆冷1-1!老鹰大逆转,库明加立功,CJ狂轰32+6,尼克斯绝杀失败

爆冷1-1!老鹰大逆转,库明加立功,CJ狂轰32+6,尼克斯绝杀失败

老侃侃球
2026-04-21 10:55:26
48岁大S在东京离世,临终留紫檀佛珠,京都神社通灵师揭转世秘密

48岁大S在东京离世,临终留紫檀佛珠,京都神社通灵师揭转世秘密

诡谲怪谈
2025-02-26 23:01:37
张馨予眼光不错!何捷出席学校活动,颜值爆表!当过兵就是不一样

张馨予眼光不错!何捷出席学校活动,颜值爆表!当过兵就是不一样

娱乐团长
2026-04-20 19:08:47
许家印认罪后,恒大前美女高管曝惊人内幕,一众大佬集体翻车

许家印认罪后,恒大前美女高管曝惊人内幕,一众大佬集体翻车

哄动一时啊
2026-04-20 19:30:32
亚马尔劳伦斯颁奖礼发声:梅西是历史最佳,我渴望追随他的脚步

亚马尔劳伦斯颁奖礼发声:梅西是历史最佳,我渴望追随他的脚步

老玮是个手艺人
2026-04-21 11:03:20
6月1日起看病大变天,3类小病不再收,社区医院成主力

6月1日起看病大变天,3类小病不再收,社区医院成主力

老特有话说
2026-04-19 15:10:09
北青:苏超要求U22球员须始终过半,倒逼各队培养年轻球员

北青:苏超要求U22球员须始终过半,倒逼各队培养年轻球员

狗哥是一名内拉
2026-04-21 09:28:10
邱毅向金小刀开战,金溥聪喊冤不是亲美派,这次可能要死在狱中

邱毅向金小刀开战,金溥聪喊冤不是亲美派,这次可能要死在狱中

爱看剧的阿峰
2026-04-20 19:00:15
不管在哪里上班一定要记得:同事排挤、孤立你,你就直接这样做

不管在哪里上班一定要记得:同事排挤、孤立你,你就直接这样做

细说职场
2026-04-16 21:18:40
金螳螂连收3个涨停板

金螳螂连收3个涨停板

证券时报
2026-04-21 10:44:26
未公开的1972年尼克松访华全套高清照

未公开的1972年尼克松访华全套高清照

深度知局
2026-04-15 00:16:09
后悔了!皇马最大错误浮现,高层内部质疑老佛爷,不该放走真核

后悔了!皇马最大错误浮现,高层内部质疑老佛爷,不该放走真核

祥谈体育
2026-04-20 19:47:56
菲利斯要回来的消息杜宾不做回应,看着5岁女儿写起小作文

菲利斯要回来的消息杜宾不做回应,看着5岁女儿写起小作文

九方鱼论
2026-04-21 10:46:18
2028美国总统大选预演!70%民主党人力挺黑马,纽森要失宠了?

2028美国总统大选预演!70%民主党人力挺黑马,纽森要失宠了?

史智文道
2026-04-21 10:00:25
无惧美伊不确定性?高盛:美股涨势将延续,比年初更利于科技股!

无惧美伊不确定性?高盛:美股涨势将延续,比年初更利于科技股!

财联社
2026-04-21 09:52:10
2026-04-21 11:44:49
侑虎科技UWA incentive-icons
侑虎科技UWA
游戏/VR性能优化平台
1569文章数 987关注度
往期回顾 全部

科技要闻

重磅官宣:库克卸任,特努斯接任苹果CEO

头条要闻

7岁男孩高烧40℃浑身"黑化"面临截肢 只因父母1个疏忽

头条要闻

7岁男孩高烧40℃浑身"黑化"面临截肢 只因父母1个疏忽

体育要闻

“被优化”8年后,国乒方博决定换一条路重新上场

娱乐要闻

周润发时隔16年再卖楼,变现数亿资产

财经要闻

减速机订单已排到明年!

汽车要闻

把天门山搬进厂?开仰望U8冲上45度坡的那刻 我腿软了

态度原创

健康
数码
本地
房产
军事航空

干细胞抗衰4大误区,90%的人都中招

数码要闻

米家电饭煲内胆开放单独选购:不锈钢/钛复合胆可选,169元起

本地新闻

春色满城关不住|白鹃梅浪漫盛放,吴山藏了一片四月雪

房产要闻

大规模商改住!海口西海岸,这波项目要赢麻了!

军事要闻

特朗普:美舰向伊朗货船开火炸出个洞

无障碍浏览 进入关怀版