1.虚幻4渲染编程(Shader篇)【第十七卷:Geometry shader in UE4】
2.Re:从零开始的渲染渲染UE渲染学习-5延迟渲染管线流程
3.UE4豆知识 - CustomDepth及相关数值
4.UE4技术杂谈——多Pass渲染描边 与 细节面板扩展
5.UE4学习笔记 使用插件添加一个ShadingModel
6.剖析虚幻渲染体系(04)- 延迟渲染管线(3/3)
虚幻4渲染编程(Shader篇)【第十七卷:Geometry shader in UE4】
在进行GI相关的研究时,我利用了UE4的管线管线GeometryShader功能,以绘制一些Debug辅助线。源码原理尽管UE4自带了画辅助线的渲染渲染接口,我还是管线管线研究了GeometryShader,这篇文章便是源码原理稳健抄底指标源码记录了这次探索。
值得注意的渲染渲染是,GeometryShader仅在SM4或更高版本的管线管线硬件上支持,因此移动游戏开发者可能无法利用这一功能。源码原理尽管GeometryShader能够减轻带宽压力,渲染渲染但对光栅器的管线管线负载仍然存在。
在UE4中,源码原理Input Assembler从顶点缓冲区接收顶点数据,渲染渲染并将其转换为规范格式。管线管线这些数据随后进入顶点着色器。源码原理如果顶点着色器输出包含SV_POSITION语义,则硬件会自动进行归一化处理,以便在光栅阶段使用。若管线中绑定了几何着色器,数据还将进一步经过处理。
以下是我使用的GeometryShader代码示例,`[maxvertexcount(n)]` 是属性语法的一部分,用于指定几何着色器每次调用时允许输出的最大顶点数量。`triangle`用于指定输入图元类型,支持的关键字包括但不限于 Line 和 Triangle。
针对不同的图元类型,如线(Line),参数`input`可由用户自定义。其元素数目取决于之前声明的图元类型。
输出方面,输出对象需标记为`inout`类型,并作为类模板使用。模板参数指定了输出类型。流输出对象具有特定的方法和功能。
通过细分模型数据,实现的效果如下图所示。实现步骤包括:在主渲染管线逻辑中编写VS和PS,创建`MyGS.cpp`和`MyGS.usf`文件并生成。然后,在延迟管线渲染器中添加渲染函数。接着,在渲染主函数中调用渲染动作。对接游戏试玩源码在`MyGS.cpp`中实现VS和PS的C++类和绘制函数。最后,完成Shader部分的代码。
完整代码包含在渲染器.h、渲染器主渲染函数.cpp、`MyGS.cpp`和`MyGS.usf`文件中。通过这些步骤,GeometryShader可以有效减少顶点数据传输,降低带宽压力,实现更高效的数据处理。
总结与展望,GeometryShader在UE4中展现出强大的潜力,适用于需要精细控制和优化的场景,例如绘制辅助线或进行复杂图形处理。享受这一功能带来的高效与便捷。
Re:从零开始的UE渲染学习-5延迟渲染管线流程
本文记录UE5.3版本下延迟渲染管线流程,旨在梳理学习,不涉及实现细节。错误之处,欢迎指正。所有配图可访问GitHub查看。
游戏引擎启动后,Tick()函数不断循环执行,一帧内处理逻辑、物理与渲染等。重点关注与渲染相关的步骤。
Tick()中的关键部分涉及标记设置、更新渲染数据与帧同步。进入视口绘制阶段。
视口绘制流程包括创建视口、配置矩阵、构建渲染器进行渲染与绘制元素。实现自定义渲染逻辑,如继承FSceneRenderer并重写Render()函数。UE渲染器主要为FDeferredShadingSceneRenderer与FMobileSceneRenderer。
聚焦FDeferredShadingSceneRenderer,其名为“延迟渲染”,但通过开关可切换为前向渲染模式。FMobileSceneRenderer同样支持延迟渲染。
附UE4时延迟渲染管线图,流程大致相似,小程序源码医疗用于流程梳理与快速定位使用。感兴趣部分已加粗标注。
本文主要梳理流程,帮助快速定位相关内容,未深入解释延迟渲染原理或UE光照计算细节。推荐参考其他大佬文章,共同学习。
参考内容未列于本文,建议探索更多资源。
UE4豆知识 - CustomDepth及相关数值
本文将详细解释Unreal Engine 4中的CustomDepth及相关数值,包括PixelDepth、SceneDepth、CustomDepth和CustomStencil,以帮助理解这些关键概念在材质编辑和渲染管线中的应用。
首先,了解这些概念的前提是对UE4材质编辑器的基本操作和渲染管线有所认识。PixelDepth,即像素深度,是当前像素点与摄像机的距离,但无法获取特定位置的深度,主要用于像素着色器处理。
SceneDepth,场景深度,是屏幕上的深度信息映射,适用于半透明材质的后处理,由于图形渲染顺序,它能获取深度Buffer。CustomDepth则是自定义深度通道,通过开启“Render Custom Depth”功能,将特定物体的PixelDepth映射到单独Buffer,仅显示开启区域,其他区域用大值填充。
CustomStencil,又称CustomDepthStencil,实际上是一个模板值,用于物体分类处理,而非深度值。SceneDepth与CustomDepth的差异在于前者是全局的深度信息,后者则能排除非目标区域。而CustomDepth与CustomStencil的区别在于,后者允许根据模板值对不同物体进行个性化处理。谍影虫虫源码
在实践中,你可以通过视口的缓冲显示菜单查看CustomDepth和CustomStencil的可视化,同时,别忘了在项目设置中启用自定义深度和模具通道。如果遇到模板可见但可视化图像缺失的情况,记得检查项目设置以解决问题。
UE4技术杂谈——多Pass渲染描边 与 细节面板扩展
同时关注公众号,更多精彩内容不错过。 在《UE4技术杂谈——后处理 之 遮挡描边》中,我们了解了如何通过屏幕后处理技术实现场景对象的描边效果。然而,此方法对GPU带宽要求较高,不太适合移动设备。本文将介绍一种基于网格体多Pass渲染技术的描边实现,无需修改引擎源代码,更适合移动端或前向渲染管线。 UE4引擎受限于其架构,不能直接在材质代码中编写多Pass渲染逻辑,也没有类似UE5的“Overlay Material”功能。因此,我们通过插件方式支持多Pass渲染框架,该插件允许动态添加或删除StaticMesh材质。在本教程中,将展示如何定制细节面板,以及如何实现描边效果。 效果展示如下:圆锥体与球体分别使用两个材质渲染,一个用于主体颜色(红色),另一个用于描边效果。此外,扩展了静态网格体组件中的材质部分细节面板,添加按钮用于快速添加或删除材质。 以下是实现描边效果的关键知识点和步骤,重点在于如何利用引擎接口动态管理材质,以及如何定制细节面板:描边材质实现(%)
StaticMesh动态添加材质(%)
定制引擎StaticMeshComponent组件材质部分的细节面板(%)
接下来,我们逐步实现上述目标。 描边材质实现采用“法线外扩 + 正面剔除”的算法,通过设置材质参数实现背面剔除,仅渲染背面部分,达到描边效果。具体包括设置材质域、混合模式、互帮网交易源码着色模型和双面属性等。 StaticMesh动态添加材质的关键在于,通过创建新的网格体描述(FMeshDescription)并构建新的StaticMesh实例,从而添加额外材质。同时,实现删除材质功能,而不影响原有模型。 定制细节面板涉及扩展组件显示,实现添加或删除材质按钮。此功能通过继承IDetailCustomization接口并实现CustomizeDetails函数完成。 总结:本文通过插件方式扩展了UE4引擎功能,实现了多Pass渲染下的描边效果,并展示了如何定制组件细节面板。实现过程中,关键在于理解引擎接口并灵活应用,以达到高效渲染和用户友好界面的目标。UE4学习笔记 使用插件添加一个ShadingModel
此文章借鉴了以下三篇文章,在此对分享者表示感谢。
1. [UE4]插件添加ShadingModel
2. Ue4 使用MaterialCustomOutput自定义ShadingModel
3. UE4(虚幻)学习笔记--虚幻4.自定义shadermodel
在学习UE4渲染管线过程中,发现添加ShadingModel时,通常需要修改源码版引擎的源码。本文介绍一种无需修改引擎源码的方式,添加自定义ShadingModel,并定制延迟渲染的光照计算。
第一篇文章已详细介绍了修改思路,本文重点记录插件创建与添加模块的步骤。
以4..2版本为例,首先新建一个插件,模板选择Blank。新建完成后,打开plugins所在位置,进入source文件夹。
将ToonShader文件夹复制一份,改名为ToonShaderBootstarp,并将ToonShaderBootstarp文件夹中的ToonShader全部改成ToonShaderBootstarp(包括文件名与其中变量名)。
注意:在ToonShaderBootstrap.Build.cs文件中,需要在PrivateDependencyModuleNames.AddRange中加入"Projects","DeveloperSettings",否则在之后的修改和编译中会产生错误。
之后在插件根目录中的ToonShader.uplugin中添加该模块,然后重新生成sln,该模块就添加完成了。
编译成功后,将ToonShader.uplugin中ToonShaderBootstarp模块的Type改为"UncookedOnly",LoadingPhase改为"EarliestPossible",否则会报关联不上插件源码的错误。
编译成功后,进入引擎,新建C++ Class,选择MaterialExpressionCustomOutput类,再新建一个Class,选择developerSettings类。
接下来修改ToonShaderOutput.h与ToonShaderOutput.cpp,编译通过后,继续修改ToonShaderBootstarp.cpp。
修改ToonShaderBootstrapSettings.h,增加插件的启动和关闭参数,然后修改配置文件的方法和正常修改源码添加ShadingModel的方法相似。
插件成功加载后,可以在Material里面看见ToonShader节点。
自定义ShadingModel添加完成。
总结:
1. ToonShader模块实现了UMaterialExpressionCustomOutput的子类,为运行时模块。
2. ToonShaderBootstrap模块在引擎启动Shader编译前加载,用以向虚幻引擎Shader文件夹中替换默认Shader文件。
ShadersOverride文件夹下存放了shader文件,Default文件用来恢复,Override用来做替换,新增的Shader文件都需要存放在Toon目录下。
本文记录了在UE4中踩的坑,希望对大家有所帮助。
剖析虚幻渲染体系()- 延迟渲染管线(3/3)
本文深入剖析了虚幻引擎(UE)的延迟渲染体系,特别关注了延迟渲染管线中的几何通道(BasePass)、光照通道(LightingPass)、半透明渲染(Translucency)以及后处理阶段(PostProcessing)。
在BasePass中,UE的BasePass处理不透明物体的几何信息,如法线、深度、颜色、AO、粗糙度、金属度等,并将这些信息写入GBuffer中。BasePass的渲染逻辑与Pre Pass类似,使用的是网格自身的材质,但在shader中不启用光照计算,类似于Unlit模式。
LightingPass阶段负责计算开启阴影的光源的阴影图、光源对屏幕空间像素的贡献量、光源对透明体积的光照贡献等,核心逻辑在RenderLights中。渲染光源时,会先绘制无阴影的光源,再绘制带阴影的光源,无阴影光源支持Tiled和Clustered。最终,所有光源在屏幕空间执行绘制,提升光照计算效率。
Translucency阶段处理半透明物体的渲染,所有半透明物体在视图空间由远到近逐个绘制到离屏渲染纹理中,然后用单独的pass计算和混合光照结果。UE4中,半透明渲染队列有标准队列和分离队列,分离队列需要在工程设置中开启,所有半透明物体默认在分离队列中渲染。
PostProcessing阶段包含不需要GBuffer的Bloom、色调映射、Gamma校正等以及需要GBuffer的SSR、SSAO、SSGI等。后处理阶段使用GraphBuilder管理Pass之间的依赖关系和资源生命周期,自动裁减无用的Pass并优化资源、PSO、渲染指令。所有后处理在EPass中指定,UE提供了自定义后处理材质。
本文总结了延迟渲染管线在UE中的实现,解释了各阶段的关键概念、技术细节以及它们之间的关系。通过本文,读者能对延迟渲染管线有更全面的理解。
随着硬件技术与软件技术的不断进步,延迟渲染管线将在PC平台持续发挥重要作用,并有望在移动平台得到支持。未来,延迟渲染的变种技术与更高效的算法、工程技术将被引入商业游戏引擎,结合现代轻量级图形API、RDG、GPU驱动管道等技术,将使延迟渲染管线展现出更耀眼的光芒。
对于想要深入理解UE延迟渲染管线的读者,本文提供了一些思考问题,以助于深化对延迟渲染管线的理解与掌握。
UE4移动端Modulated Shadow渲染管线改进
UE4移动端的Modulated Shadow技术采用Per-Object方式,为每个投影物体独立计算阴影,相较于Cascaded Shadow Maps的共用资源,其在提高阴影精度上更具优势。这个优势源于对阴影深度图采样精度的提升,Per-Object方式可以直接控制物体在阴影深度图中的区域占比,减少视锥分割带来的阴影距离降低问题。
然而,这种独立计算方式也带来挑战,即阴影重叠问题。在UE4(4..1)移动端的Modulated Shadow中,尚未处理阴影混合,导致角色手持武器时,角色和武器的阴影会相互重叠,影响视觉效果。为解决这一问题,本文将探讨如何改进渲染管线。
解决思路在于调整渲染流程:首先,通过在全局GRenderTargetPool中创建一个中间RenderTarget(MobileScreenShadowMask),将其作为每个Per-Object阴影视锥的输出目标。然后,将原ShadowColor与背景颜色的相乘过程移到这个中间RenderTarget上,使用屏幕空间延迟阴影计算,以减少阴影重叠的影响。具体步骤包括:1) 申请并关联中间RenderTarget;2) 切换渲染目标到MobileScreenShadowMask;3) 绘制阴影视锥并将结果输出到中间Target;4) 对中间Target进行颜色处理,消除重影区域;5) 融合处理后的阴影颜色与背景颜色;6) 恢复渲染流程并确保后续内容正常绘制。
完整修改后的引擎库,包括了上述步骤,能够有效改善Modulated Shadow的阴影融合问题。此外,为了进一步提升阴影质量,可以考虑在移动端实现WorldNormal的计算,参照非移动端的Per-Object阴影实现方法。
UE4理论介绍梳理
深入解析UE4理论:蓝图与3D渲染技术详解 对于UE4新手来说,蓝图是一个强大且直观的逻辑构建工具。无需编写代码,只需通过拖拽和连接节点,蓝图就能在虚拟机环境中运行,修改后无需重新编译。详细了解蓝图的运作原理和使用方法,可以访问官方文档:UE4蓝图指南。 蓝图采用直观的拖拽式编程,主要区分于宏、函数和事件。C++与蓝图的交互主要通过事件或特定标记的函数。蓝图间的通信机制包括直接操作、事件调度器以及接口,特别在处理渲染和3D流程时显得尤为重要。 揭秘3D渲染管线 UE4的3D渲染过程涉及数据准备、顶点处理、光栅操作和像素处理四个关键阶段。其中,屏幕映射、光栅化和片元着色器是决定画面效果的关键步骤。像素点的显示则包含裁切、透明、模板和深度测试后的混合写入遮罩,每个环节都影响着最终视觉效果。 渲染流程从顶点着色器生成图元,经过片元着色器计算颜色,再到细分曲面和几何着色器扩展形状。UE4的渲染功能包括遮挡处理、几何体渲染、路径选择、剔除与渲染命令,以及GPU渲染技术,如延迟渲染、半透明处理和PostProcess后处理。游戏线程优化同样重要,如Tick操作、蓝图处理、资源管理和类间通讯,均直接影响性能表现。 为了深入剖析性能瓶颈,你可以利用GPU分析器(Ctrl+Shift+,)、调整光照复杂度(Alt+7,)、静态光重叠查看(视口左上角)和光照贴图密度(Alt+0,),以及理解反射计算方式。UHT解析C++头文件和UBT收集信息,是理解类型系统的关键,如UStruct、UFunction、UScriptstruct、UClass和UEnum等,以及接口和元数据的设计。 深入编译与内存管理 UE4的编译系统由UHT解析头文件和UBT编译链接组成。类型系统设计精细,如UField统一处理数据,便于遍历和封装属性和方法。C++Static自动注册简化了注册过程,而UE4的Static自动注册扩展则能收集更多类型信息。内存管理方面,UE4支持内置的垃圾回收(UObject)和智能指针(非UObject),包括追踪式、非实时等多种回收策略,通过簇化技术如UMaterial和UParticleSystem提升性能。 最后,了解标记宏的使用规范,如UCLASS、UPROPERTY和UFUNCTION,以及元数据的meta=()标记,能优化编辑器行为并控制资源打包。通过这些技术,你将能更深入地掌握UE4的理论基础,为你的游戏开发之旅打下坚实的基础。