本文最后更新于428 天前,其中的信息可能已经过时,如有错误请联系作者
UE纹理学习之路
溶解效果
1.在Materials文件夹中创建新的材质

2.从第二张图片中,我们可以了解到以下知识点

Clamp 确保值处于一个固定的范围
template< uint32 Num >
FORCEINLINE TAffine< float, Num > Clamp( const TAffine< float, Num >& x, float Min, float Max )
{
// Using Chebyshev approximation
float xMin = x.GetMin();
float xMax = x.GetMax();
float FuncMin = FMath::Clamp( xMin, Min, Max );
float FuncMax = FMath::Clamp( xMax, Min, Max );
if( Min <= xMin && xMax <= Max )
return x;
if( xMax <= Min )
return TAffine< float, Num >( Min );
if( xMin >= Max )
return TAffine< float, Num >( Max );
float Alpha = ( FuncMax - FuncMin ) / ( xMax - xMin );
float Gamma = 0.5f * ( 1.0f - Alpha ) * ( FuncMax + FuncMin );
float Delta = ( 1.0f - Alpha ) * FuncMax - Gamma;
TAffine< float, Num > Result;
Result.c = Alpha * x.c + Gamma;
Result.K = FMath::Abs( Alpha * x.K ) + Delta;
for( uint32 i = 0; i < Num; i++ )
Result.e[i] = Alpha * x.e[i];
return Result;
}
上面是Clamp的源码
该函数用于对输入的 TAffine<float, Num> 类型的对象 x 进行某种形式的“夹持”或“限制”操作。这里,TAffine 可能是一个表示仿射变换的类,它通常用于图形学和计算机视觉中,用来表示平移、旋转、缩放等变换。
- 输入参数:
x:一个TAffine<float, Num>类型的对象,表示待处理的仿射变换。Min和Max:两个浮点数,表示夹持的上下限。
- 核心逻辑:
- 首先,计算
x的最小值和最大值(通过调用x.GetMin()和x.GetMax())。 - 使用
FMath::Clamp函数将这两个值限制在Min和Max之间,得到FuncMin和FuncMax。 - 根据
x的最小值和最大值与Min和Max的关系,有几种不同的处理情况:- 如果
x的所有值都在Min和Max之间,直接返回x。 - 如果
x的最大值小于等于Min,返回一个所有元素都为Min的TAffine对象。 - 如果
x的最小值大于等于Max,返回一个所有元素都为Max的TAffine对象。
- 如果
- 如果以上条件都不满足,使用 Chebyshev 近似法计算
Alpha、Gamma和Delta。 - 使用这些计算出的值更新
TAffine对象Result的各个成员。
- 首先,计算
- 返回值:
- 返回处理后的
TAffine<float, Num>对象Result。
- 返回处理后的
这里并没有展示 TAffine 类和 FMath::Clamp 函数的实现细节 应当在之后的学习中指出
创建可复用的材质函数
我们如何创建可复用的材质函数
-
在Material中创建Material Function

-
将该函数暴露到库中,可以在蓝图中被反复调用


- 在为Subtract添加了新的输入后 其MF_HitFlashDemo会添加一个新的输入口

- 如下图,MF_HitFlashDemo等效原本的M_HitFlashDemo的功能,材料函数可以实现反复利用,大大提高了蓝图布局的简洁

为用户界面设计材质
- 创建一个新的材质,修改材质的Material Domain为User Interface



- 使用LinarGradient函数实现渐变效果

LinearGradient的蓝图实现,先进行系统学习,之后研究LinearGradient的实现源码

- 使用if函数实现进度条的颜色控制,其中将单向量转换为变量进行控制

- 进入控件PlayerHealth_Widget,创建Image 并使其变成变量,之后我们将在蓝图中使用


- 添加下面内容 即可大功告成

