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

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.

相关推荐
热点推荐
老罗为什么突然闭嘴了

老罗为什么突然闭嘴了

燕梳楼频道
2025-09-16 15:52:21
山口百惠现状:背弯的很明显,房贷压力没有了,和丈夫依旧恩爱

山口百惠现状:背弯的很明显,房贷压力没有了,和丈夫依旧恩爱

白面书誏
2025-09-18 11:13:43
A股跳水原因找到了!证券出现天量压盘,3.1万亿成交买入就被套

A股跳水原因找到了!证券出现天量压盘,3.1万亿成交买入就被套

看财经show
2025-09-18 16:50:51
不许援助俄罗斯,英制裁中国实体,不到24小时,中方直接下达通牒

不许援助俄罗斯,英制裁中国实体,不到24小时,中方直接下达通牒

南权先生
2025-09-18 14:00:09
6场5球!孙兴慜上演帽子戏法,助洛杉矶4-1大胜

6场5球!孙兴慜上演帽子戏法,助洛杉矶4-1大胜

懂球帝
2025-09-18 11:50:19
22岁绝症女孩宴请全村看电影,哽咽嘱托村民:“我走后,请替我关照父母”

22岁绝症女孩宴请全村看电影,哽咽嘱托村民:“我走后,请替我关照父母”

潇湘晨报
2025-09-18 15:00:20
七个中国老板在南非奴役员工每天工作11小时,被判20年

七个中国老板在南非奴役员工每天工作11小时,被判20年

历史总在押韵
2025-09-17 22:46:36
赵尚志将军牺牲的确切时间确认

赵尚志将军牺牲的确切时间确认

新华社
2025-09-18 16:56:04
中国留学生语出惊人:应该让某些人害怕表达自己的观点

中国留学生语出惊人:应该让某些人害怕表达自己的观点

通往远方的路
2025-09-18 07:48:11
全球反对浪潮汹涌!阻止以色列?有“六大狠招”

全球反对浪潮汹涌!阻止以色列?有“六大狠招”

看看新闻Knews
2025-09-18 19:16:05
在金正恩的治理下,去平壤高级饭店吃一碗冷面,需要花多少钱?

在金正恩的治理下,去平壤高级饭店吃一碗冷面,需要花多少钱?

明史专家
2025-09-17 19:49:48
杨毅力挺西贝:你们老百姓嫌预制菜贵,可以不吃啊

杨毅力挺西贝:你们老百姓嫌预制菜贵,可以不吃啊

花心电影
2025-09-18 13:37:16
香港黄金劫案有内鬼?传7人落网、追回贼赃、合伙人在逃 香港警方发言人:正核实

香港黄金劫案有内鬼?传7人落网、追回贼赃、合伙人在逃 香港警方发言人:正核实

红星新闻
2025-09-18 18:55:10
刚刚,台风“米娜”生成!预计在广东沿海登陆,暴雨+大风即将来袭!具体登陆时间地点最新预测→

刚刚,台风“米娜”生成!预计在广东沿海登陆,暴雨+大风即将来袭!具体登陆时间地点最新预测→

鲁中晨报
2025-09-18 15:15:03
武大杨某某发声了!称回归正常生活,中国农大将其论文作反面教材

武大杨某某发声了!称回归正常生活,中国农大将其论文作反面教材

明月杂谈
2025-09-18 05:42:27
“小兵张嘎”谢孟伟被捕!目无法纪,坑蒙老百姓,道歉竟甩锅网友

“小兵张嘎”谢孟伟被捕!目无法纪,坑蒙老百姓,道歉竟甩锅网友

有范又有料
2025-09-18 09:54:50
居然之家女销冠刘丽去世,年仅34岁,2月前还在旅行

居然之家女销冠刘丽去世,年仅34岁,2月前还在旅行

史书无明
2025-09-18 11:21:17
一家五口登机前30分钟狂吃11斤榴莲,当事人:这辈子都不想再听到榴莲两个字了

一家五口登机前30分钟狂吃11斤榴莲,当事人:这辈子都不想再听到榴莲两个字了

极目新闻
2025-09-17 21:07:50
4-0!3-1!欧冠狂欢夜:利物浦绝杀马竞 拜仁掀翻切尔西 巴黎狂胜

4-0!3-1!欧冠狂欢夜:利物浦绝杀马竞 拜仁掀翻切尔西 巴黎狂胜

侃球熊弟
2025-09-18 03:48:16
女子发帖称其父亲在美的工作期间一天工作14小时,离职后被欠薪

女子发帖称其父亲在美的工作期间一天工作14小时,离职后被欠薪

回旋镖
2025-09-18 08:11:06
2025-09-18 20:11:00
侑虎科技UWA incentive-icons
侑虎科技UWA
游戏/VR性能优化平台
1501文章数 984关注度
往期回顾 全部

科技要闻

DeepSeek称R1训练费200万,不依赖蒸馏对手

头条要闻

35岁儿子的智力停在2岁 56岁单亲妈妈自驾带他游中国

头条要闻

35岁儿子的智力停在2岁 56岁单亲妈妈自驾带他游中国

体育要闻

身高170的他,让196的博尔特坐不住了

娱乐要闻

最美央视才女,甩掉孙红雷嫁给张嘉益

财经要闻

起底多校“发臭午餐”供应商绿捷

汽车要闻

女神代言/新增配色/智能升级 26款腾势N9售38.98万起

态度原创

旅游
艺术
教育
本地
亲子

旅游要闻

热闻|清明假期将至,热门目的地有哪些?

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

教育要闻

别盯着计算机、金融了!这几个冷门专业竞争少,毕业轻松找到工作

本地新闻

云游中国|谁懂!在天下第一关拍到史诗感大片

亲子要闻

高骼:孩子的营养不是吃进去的,而是脾“给”的

无障碍浏览 进入关怀版