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

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.

相关推荐
热点推荐
78岁王刚:头发染黑也显老态,他不敢老,背负人生两大重任

78岁王刚:头发染黑也显老态,他不敢老,背负人生两大重任

细品名人
2026-04-21 07:31:12
4月21日A股猛料:国务院高层重要发言!利好3板块将迎价量齐升!

4月21日A股猛料:国务院高层重要发言!利好3板块将迎价量齐升!

丁丁鲤史纪
2026-04-21 10:36:26
树倒猢狲散!武亮直播哭红眼眶,20余天的人事动荡,让他心力憔悴

树倒猢狲散!武亮直播哭红眼眶,20余天的人事动荡,让他心力憔悴

火山詩话
2026-04-20 06:31:57
人民日报24小时内改称何润东,四字之差印证其言

人民日报24小时内改称何润东,四字之差印证其言

孤单是寂寞的毒
2026-04-21 14:52:28
商业航天“10大订单王”出炉!第二波行情刚起,抓紧上车!

商业航天“10大订单王”出炉!第二波行情刚起,抓紧上车!

风风顺
2026-04-21 03:05:03
古巴证实与美国代表团举行会晤

古巴证实与美国代表团举行会晤

每日经济新闻
2026-04-21 07:29:29
附加赛苦战换来一轮游?上海虽强不可怕,季后赛冷门终会诞生

附加赛苦战换来一轮游?上海虽强不可怕,季后赛冷门终会诞生

生活新鲜市
2026-04-21 17:17:08
美国劳工部长被解职

美国劳工部长被解职

第一财经资讯
2026-04-21 08:17:07
2105km续航!比亚迪官宣:新车上市

2105km续航!比亚迪官宣:新车上市

手机评测室
2026-04-21 11:51:31
万斯及美国代表团将在数小时内抵达伊斯兰堡,特朗普:若有进展愿同伊朗领导人会面

万斯及美国代表团将在数小时内抵达伊斯兰堡,特朗普:若有进展愿同伊朗领导人会面

界面新闻
2026-04-20 23:12:06
男子婚内买彩票中奖5340万,转给一女子2100万,前妻起诉返还950万及购车款,法院判了:返还属于前妻份额及一半购车款

男子婚内买彩票中奖5340万,转给一女子2100万,前妻起诉返还950万及购车款,法院判了:返还属于前妻份额及一半购车款

扬子晚报
2026-04-20 21:41:05
美军公海开火拦中国货船!不到24小时,中方表态,这事没那么简单

美军公海开火拦中国货船!不到24小时,中方表态,这事没那么简单

趣味八卦
2026-04-21 10:24:09
最后48小时,赖清德将登机离台,大陆斩钉截铁,郑丽文判断准确

最后48小时,赖清德将登机离台,大陆斩钉截铁,郑丽文判断准确

闻识
2026-04-20 11:25:39
1950年,广州七个帮派大佬旅馆中毒身亡,叶剑英:十天之内破案!

1950年,广州七个帮派大佬旅馆中毒身亡,叶剑英:十天之内破案!

历来都很现实
2024-06-12 21:40:40
黑龙江省公安厅原二级警务专员史衍芳接受审查调查

黑龙江省公安厅原二级警务专员史衍芳接受审查调查

界面新闻
2026-04-21 16:01:12
李小冉称《心愿便利贴》让她哭了两个晚上:不知道我唱歌那么难听

李小冉称《心愿便利贴》让她哭了两个晚上:不知道我唱歌那么难听

红星新闻
2026-04-21 12:22:12
激烈交锋!解放军全军待命,日本恐重蹈二战覆辙,岸田文雄已扛旗

激烈交锋!解放军全军待命,日本恐重蹈二战覆辙,岸田文雄已扛旗

书纪文谭
2026-04-21 15:06:28
菲利斯要回来的消息杜宾不做回应,看着5岁女儿写起小作文

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

九方鱼论
2026-04-21 10:46:18
2027斯诺克世锦赛总奖金上涨至300万英镑,冠军独揽62.5万

2027斯诺克世锦赛总奖金上涨至300万英镑,冠军独揽62.5万

懂球帝
2026-04-21 08:46:09
油价下跌!92汽油涨至8.9元/升后预跌超6.4毛/升,今晚24时调价!

油价下跌!92汽油涨至8.9元/升后预跌超6.4毛/升,今晚24时调价!

猪友巴巴
2026-04-21 09:08:59
2026-04-21 19:03:00
侑虎科技UWA incentive-icons
侑虎科技UWA
游戏/VR性能优化平台
1569文章数 987关注度
往期回顾 全部

科技要闻

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

头条要闻

男子买"随用随取"保险后得知百岁才能取本金 法院判了

头条要闻

男子买"随用随取"保险后得知百岁才能取本金 法院判了

体育要闻

62岁,成为中国足坛最火的人

娱乐要闻

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

财经要闻

现实是最大的荒诞:千亿平台的冲突始末

汽车要闻

全新坦克700正式上市 售价42.8万-50.8万元

态度原创

健康
游戏
本地
亲子
公开课

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

万代大作摆烂放弃D加密?刚被破解三周

本地新闻

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

亲子要闻

高龄备孕如何提高生育力?备孕辅酶q10需要吃多久?

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版