找回密码
 立即注册
查看: 357|回复: 2

Unreal添加Shader属性

[复制链接]
发表于 2023-2-17 09:11 | 显示全部楼层 |阅读模式
前文讲了Unreal自定义ShaderModel和自定义Pass。对于ShaderModel,曾说到过可以自定义一些材质属性,通过预留的CustomData。在使用和 查看代码的过程中发现这个CustomData是一个float,如果你想额外添加一个Color,Position或者是Vector时,可能满足不了我们的需求(当时提了一嘴说可以添加自己想要的属性,没有想到有这么复杂)。特别是在自定义Pass中,我们虽然扩展了两个Pass,但是就一份材质属性,意味着两个Pass公用一份属性,肯定是远远不够的。以描边举例,我们至少需要控制描边样条(方向和偏移),描边颜色。
Unreal为什么不让你方便扩展材质属性呢?事实上,因为Unreal默认是延迟渲染,底层框架基本都是按照延迟渲染的框架进行设计,而对于延迟渲染来说,我们如果要增加材质属性,需要添加到GBuff中,GBuff在本来的设计中就已经非常吃紧,我们还要添加额外的属性,添加一个Vector就相当于多一个RT,这显然是不被允许的。对于我们移动平台,就不用考虑GBuff的一些东西了,可以适当添加一些我们想要的额外属性。
打开SceneType.h,在EMaterialProperty中添加声明



然后,你可以搜一下关于MP_MAX的几个断言,你可以直接全局搜static_assert(MP_MAX == 30,将他们变成31就可以了,Unreal这里之所以加断言,应该就是考虑到你添加属性一定要去这几个断言的地方去添加他们的方法或者接口。(下图我已经改成31了)



打开MaterialExpressionMakeMaterialAttributes.h,这里是实际存储属性的地方,添加我们自己的属性。



打开Material.h,添加Editor需要的Input,由于我们需要的是一个float3,我们申明成Vector。



打开HLSLMaterialTranslator.h,这个是蓝图生成HLSL的底层代码,先在构造函数中添加我们的Property。



然后,在Translate函数中,添加我们的Chunk(这个Chunk你可以理解为蓝图翻译获取这个属性的HLSL代码)。



打开Material.cpp,找到UMaterial::PostLoad()方法,这里是在加载材质后调用的地方,这里可以加上通知材质编辑器的一些代码。



接着在UMaterial::GetExpressionInputForProperty和UMaterial::GetAllReferencedExpressions中,我们 添加一些捕获编译我们这个的属性出现异常的地方。





然后,我们可以添加编译属性的HLSL代码的地方了,在UMaterial::CompilePropertyEx中


下面还有决定这个属性出现在哪个ShaderModel下,这个之前讲过,在IsPropertyActive_Internal中。



刚刚在上面编译HLSL代码实际会调用到MaterialExpressions.cp中,定位 到UMaterialExpressionMakeMaterialAttributes::Compile,添加Compile我们属性的代码。


然后在下面UMaterialExpressionBreakMaterialAttributes构造函数中添加属性默认值。



然后,在下面序列化中UMaterialExpressionBreakMaterialAttributes::Serialize序列化我们的属性。



在BuildPropertyToIOIndexMap()中设置属性的索引Index。



打开MaterialShared.cpp,在 FMaterialAttributeDefinitionMap::InitializeAttributeMap()设置我们的属性字典。


这里记得自己生成一份GUID,不要跟其他属性冲突了。
打开MaterialEditor,在FMaterialEditor::GetOnPromoteToParameterClass中添加我们属性对应的Parameter。



打开MaterialGraph.cpp,UMaterialGraph::RebuildGraph()方法中,添加属性在面板中的显示,这个也在ShaderModel的地方提过。


这里我弄成了一个函数,可以在不同ShaderModel上显示不同名字。


做完这些后,我们就能在编辑器上看到我们的属性了。



连接上去,然后修改我们的OutLine代码。



就能看到效果了。



本文没有处理MaterialBake,Lightmass等,并且只支持移动平台,并没有扩展到GBuff中。如果要支持这些,需要做更多额外工作。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-2-17 09:19 | 显示全部楼层
你好大佬,我想了解下关于GUID咋生成啊?
发表于 2023-2-17 09:28 | 显示全部楼层
有guid生成的网站,这里的话,你随便写应该就可以了,一般不会冲突
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-2 13:30 , Processed in 0.094777 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表