写一个自己的移动端shading model!

先说一下这个是基于UE4 4.24版本的,貌似每个版本的API都有点小改动。

由于项目需要做一些定制化的shader,又是UE4手游,找了下大部分文章都是deferred管线的自定义shading model,刚好研究了一周搞定了一个基础版本的效果,在此做一下记录。

关于各向异性头发的算法网上一搜一大堆,由于本篇的核心内容在于如何自定义一个移动端的shading model故在shader部分不会过多进行解释。

 

EngineTypes.h

首先开始我们自定义shading model的第一步,添加一个枚举成员。

记得要写在MSM_NUM前面,枚举可以转换为整形。

 

Material.cpp

找到switch (InProperty){},将customdata0~1的接口开放给我们的自定义shading model

 

HLSLMaterialTranslator.h

 

MaterialGraph.cpp

这里是用来修改材质列表显示的名字的地方。 例如Customdata0和Customdata1,我不喜欢这两个默认的名字,所以我把它们改成了我自定义的名字:

自此C++部分就修改完成了,你可以直接编译引擎,等待一阵子后打开该引擎创建的项目,随便创建一个材质球就可以看到:

已经有我们的自定义shading model啦!

有没有发现我有些接口名也变了?其实道理是一样的,你可以把这些默认的接口名都改成你自己想要自定义的名称!

 

MobileBasePassPixelShader.usf

前面我们自定义界面UI已经做完了,接下来就是写shader的部分了。移动端其实蛮简单的,C++部分完了就直接来这里写自己想要的效果即可,延迟渲染部分其实还要设置很多地方,比如将数据传给Gbuffer就需要额外修改几个ush文件,这里暂时不做赘述。

观察一下,官方的水shading model原来在移动端也有定义,而它怎么分辨这一段shader是属于水的是靠我们之前在HLSLMaterialTranslator.h中的定义:

看到这串眼熟的代码 ,是不是和我们定义的那段字符串很像?

所以如果想单独对我们的shading model进行全部/部分着色器的定制化,也可以直接使用这个宏:

如果要写shader,必须写在Main函数里面。 用过unity的小伙伴应该知道,顶点着色器和像素着色器里面是不能写函数方法的,要写的话只能写在外面。其实DX的原理是一样的,把Void Main(){}当做是顶点着色器和像素着色器就好,方法写在Main函数外面即可。

因为我这个案例是各向异性头发,其实涉及不到顶点部分,所以这里只修改到了MobileBasePassPixelShader.usf, 如果有需求要修改到顶点着色器部分,则在MobileBasePassVertexShader.usf部分。

 

MaterialTemplate.ush

一个比较有用的接口库,可以在这里找到大部分想要的涉及到shader光照计算的数据以及材质UI的接口函数。

例如这三个GetMaterial函数,其实就是获取的

这三个地方的输入值,相当于unity中 float4 Color : TexCoord3的意思,texcoord存储器。这些get函数可以很容易的在MaterialTemplate.ush文件中找到。

此外还可以找到顶点色,世界法线,顶点法线,灯光方向等等信息。

 

最后,我自己的shading model初版

希望这篇文章对你写自己的移动端shading model有所帮助。

<think>好的,我现在需要解释r.Mobile.UseClusteredDeferredShading这个控制台命令,主要用于Unreal Engine的移动平台渲染优化。首先,我要回忆一下Unreal Engine的渲染技术,尤其是移动端的优化策略。 Clustered Deferred Shading(集群延迟着色)是什么?它和传统的延迟着色有什么区别?传统延迟着色可能会遇到性能和内存问题,特别是在处理大量灯光时。而集群延迟着色通过将屏幕空间划分为更小的“集群”来优化灯光计算,减少每个像素需要处理的灯光数量,从而提高性能。这对于移动设备尤其重要,因为硬件资源有限。 接下来,r.Mobile.UseClusteredDeferredShading这个命令的作用是启用或禁用移动端的集群延迟着色。默认情况下,Unreal Engine可能在移动端使用其他渲染路径,比如Forward Shading(前向着色)或者传统的Deferred Shading。但启用这个命令可以切换到集群延迟模式,以改善多光源场景的性能。 需要考虑用户可能的疑问,比如这个命令如何影响画质和性能?启用后,是否会导致某些设备不兼容?需要说明适用的引擎版本,因为不同版本可能实现不同。例如,可能在UE4的某个版本后引入此功能,或者UE5中有改动。 另外,应该提到如何正确使用这个命令。用户可能需要在控制台输入,或者在项目设置中配置。如果该命令需要特定硬件支持,比如需要支持某些Shader Model或GPU特性,也需要指出。例如,某些低端移动GPU可能不支持集群延迟着色,导致回退到其他渲染路径。 还需要比较集群延迟着色与其他渲染方法的优缺点。比如,前向着色在处理少量光源时效率高,但光源多时性能下降明显。延迟着色可以处理更多光源,但内存占用高。集群延迟在两者之间找到平衡,优化内存和计算量,适合移动端的多光源场景,如开放世界游戏或动态光照环境。 可能的问题:用户启用后没有效果,可能原因是什么?比如项目设置冲突,或设备不支持,需要检查日志或使用其他调试命令。此外,性能提升的具体案例或数据是否有官方文档支持?可能需要引用Unreal官方文档或社区的最佳实践。 总结回答结构:先定义命令的作用,解释集群延迟着色技术,比较与其他技术的区别,说明启用方法、适用场景、潜在影响和注意事项。确保步骤清晰,帮助用户逐步理解并正确应用该命令。</think>关于Unreal Engine中的控制台命令`r.Mobile.UseClusteredDeferredShading`,以下是逐步解释: --- ### **1. 命令作用** `r.Mobile.UseClusteredDeferredShading` 是Unreal Engine(UE)中用于**移动端渲染路径优化**的控制台变量(Console Variable)。它控制移动平台是否启用**集群延迟着色(Clustered Deferred Shading)**技术。 --- ### **2. 技术背景:集群延迟着色** - **传统延迟着色(Deferred Shading)**: 将几何体信息(位置、法线、材质等)先渲染到G-Buffer,再逐光源计算光照。适合处理多光源场景,但内存和带宽消耗较高。 - **集群延迟着色**: 将屏幕空间划分为多个“集群”(Cluster),每个集群仅计算影响该区域的光源。显著减少冗余光照计算,**优化移动端多光源性能**。 --- ### **3. 启用与禁用** - **启用**: 在控制台输入 `r.Mobile.UseClusteredDeferredShading 1` 或在项目配置文件(如 `DefaultEngine.ini`)中添加: ```ini [SystemSettings] r.Mobile.UseClusteredDeferredShading=1 ``` - **禁用**: 设为 `0` 或移除配置,引擎可能回退到前向着色(Forward Shading)或其他优化方案。 --- ### **4. 适用场景** - **多动态光源**:如角色携带手电筒、爆炸特效、动态环境光等。 - **中高端移动设备**:需支持足够的计算能力和带宽(低端设备可能性能提升有限)。 --- ### **5. 性能与画质影响** - **性能提升**: 减少每像素的光照计算量,尤其在复杂光照场景下帧率更稳定。 - **潜在代价**: - 增加GPU内存占用(需存储集群数据)。 - 低端设备可能因带宽限制出现卡顿。 --- ### **6. 注意事项** - **版本兼容性**: 该功能需UE 4.24+版本支持,不同版本实现细节可能不同。 - **设备兼容性**: 部分老旧GPU可能不支持,需实际测试。 - **调试工具**: 使用 `r.Mobile.VisualizeLightCulling 1` 可可视化光源剔除效果,验证集群划分是否合理。 --- ### **7. 对比其他渲染路径** | 渲染路径 | 优势 | 劣势 | |-------------------------|-------------------------------|-------------------------------| | 前向着色(Forward) | 低内存,适合简单光照 | 多光源性能差 | | 传统延迟着色(Deferred)| 支持多光源 | 高内存占用,移动端效率低 | | 集群延迟着色(Clustered)| 平衡性能与多光源支持 | 需要合理配置集群参数 | --- ### **总结** 通过启用 `r.Mobile.UseClusteredDeferredShading`,可在移动端高效处理多光源场景,但需结合目标设备性能和项目需求权衡。建议在UE编辑器中实测不同配置下的帧率与画质表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值