插件网址:
GitHub - Yeyap2513/Texture_EA: Texture Sets is a plugin developed by SEED for Unreal Engine 5, and provides an opt-in framework for building advanced, streamlined texture pipelines. · GitHub
为什么要用EA?EA使用的好处是?
指令通常返回一个float4。但这不代表它一定真的在显存里存了 4 个有效通道,也不代表 GPU 对每个通道分别采样了一次。
真正的浪费主要有三种:
贴图格式浪费
如果你的贴图实际被存成RGBA8 / BC7 / BC3这类 4 通道格式,但只有R有用,那GBA就在浪费显存、磁盘、streaming 带宽。采样次数浪费
如果你有很多单通道图:Roughness.r、Metallic.r、AO.r、Cavity.r、FuzzMask.r每张都单独采样,就会增加纹理采样数量。把它们打包进一张
RGBAmask 贴图,可以从多次采样变成一次采样。母材质维护浪费
Substrate 下参数和贴图方向很多,如果手动维护一堆贴图通道,很容易乱。Texture Set 的价值是把“逻辑贴图”和“物理打包”分开:材质里还是叫Roughness、Metallic、Normal,但底层可以自动打包到合适的通道。
使用流程:
安装好插件打开编辑器,右键content空白区域
点击创建TextureSetDefinition资产。
.
这里设置需要放进去的图片具体是什么
这里就把你所需要的通道重组成了三张贴图,而且还有很多空余位置,你还可以往里面放更多的mask图,来减少总的采样贴图的次数
在材质里面创建出来对应的TextureSet材质函数,并把刚才的Definition放进材质函数的插槽里面,就可以正常使用了
我们可以看到正好就采样了3次PS级别的贴图
总共三个贴图在这里合成
如何自定义channel:
创建两个自定义module
数据定义就有对应的名称和贴图可以放了
当你要用多个texture set sample的时候,你会发现,相同的材质函数下,材质函数内的变量名称完全相同,最终只能用到一个材质变量,不能每个材质函数中都对应一个材质函数变量
外卖找到对应的TextureSetSample函数,找到里面的parameter name的变量,不同材质函数填写不同材质变量它会给每个材质函数中的变量进行parameter name的字符串添加,从而每个材质函数的变量能够名字不同,从而显示到材质实例里面每个进行单独调整
简单说一下原理:
EA 的Parameter Name不需要修改引擎源码,因为 EA 的 Texture Set 节点并不是普通材质函数节点,而是插件用 C++ 创建的自定义材质表达式。
它的类是:
UMaterialExpressionTextureSetSampleParameter : public UProceduralMaterialFunction插件自行添加了:
UPROPERTY(EditAnywhere, Category="Parameter") FName ParameterName;所以 Details 面板里能看到Parameter Name。[源码位置 (line 21)](D:/UEProject/SubstrateTest/Plugins/Texture_EA-main/Source/TextureSets/Public/MaterialExpressionTextureSetSampleParameter.h:21)
它再根据这个名称生成内部纹理参数:
TEXSET_<ParameterName>_PACKED_0 TEXSET_<ParameterName>_PACKED_1普通材质函数使用的是引擎内置的UMaterialExpressionMaterialFunctionCall,这个类本身没有每次调用独立的ParameterName属性。
如何自定义一个module?
每次都要自己写一大堆内容,我将我的最小的substrate材质和其他最小的substrate材质进行bsdf混合的时候,我希望换对应texture set sample对应的输入,我就会换掉对应的Default Texture Set,但是这个Default Texture Set和资产是强绑定的,需要重新创建一个Texture Set Definition,新的Texture Set Definition创建过后又需要重写写Custom Element Module,会导致很麻烦
所以有一个资产叫Texture Set Element Collection
打开创建自己的一套模板
然后在Texture Set Definition中module里面选择Texture Set Element Collection Module
把之前设置好的Texture Set Element Collection Module放进去,就可以直接把数据定义给筛进去,不用重复写了
当你修改了Default Texture Set的贴图,贴图没生效,如何解决?
1、暴力重启引擎
2、找到对应修改后贴图的Default Texture Set对应的材质函数Texture Set Sample,去把Texture Set Definition撤回重新放进去即可生效(推荐)
不要为了塞满通道,把采样条件不同的数据硬塞一起。
比如这些不适合强行打包在一张图里:
- 一个需要 UV0,一个需要 UV1
- 一个需要高分辨率,一个低分辨率就够
- 一个需要 sRGB,一个必须 Linear
- 一个是 Normal 压缩,一个是 Mask 数据
- 一个需要三平面采样,一个只需要普通 UV 采样
- 一个需要频繁变化,一个是静态贴图
尤其 Normal:如果用 UE 的 Normal 压缩,通常更适合 BC5,只可靠存 XY。你不能指望 Normal 的 B/A 顺便塞 Roughness,因为压缩格式和解码逻辑不适合。
所以你的结论可以这样整理:
Texture Set 很适合做:
- 自动通道打包
- 自动压缩格式管理
- 减少贴图数量
- 减少无效 Alpha 存储
- 统一角色/武器/布料/皮肤的贴图规范
- 给 Substrate 母材质提供稳定输入
但它不适合幻想成:
- 运行时让 GPU 只采 RGB 不采 A
- 一个 Texture Set 覆盖所有材质类型
- 把所有 Substrate 特性都塞进一个超级母材质
- 任意通道混装都没有代价