Unreal中实现UV中心和边缘区别拉伸

本文介绍了在Unreal Engine中如何实现纹理UV在中心和边缘的差异化拉伸,创造出类似九宫格的效果。通过调整BorderWidth参数,可以控制边缘宽度,并分别设定中心和边缘的UVTiling值。实现方法主要是提取UV边缘,用if节点区分中心和边缘,然后使用Lerp节点混合TextureCoordinate。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


看标题估计会看哭一批人,其实要实现的效果非常简单:就是一张图片的中心和边缘有不同的UVTiling,具体效果可以参考上图的效果(可以指定边缘的宽度【红色表示】,同时可以分别控制中心和边缘的UVTiling的值)。非常类似于UI中九宫格的拉伸方式。

大致的实现思路是提取UV的边缘部分(根据所给的BorderWidth参数),借助if将中心部分设置为1,边缘部分设置为0。之后借助Lerp来进行TexutreCoordinate的混合即可。具体的材质节点可以参考下图。因为工程非常简单就不上传工程啦。


如果比较懒,可以直接粘贴下面的代码连接到BaseColor或者EmissiveColor端口即可。

Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name="MaterialGraphNode_0"
   Begin Object Class=/Script/Engine.MaterialExpressionTextureSampleParameter2D Name="MaterialExpressionTextureSampleParameter2D_0"
   End Object
   Begin Object Name="MaterialExpressionTextureSampleParameter2D_0"
      ParameterName="Texture"
      ExpressionGUID=A4991017434448E58053529CD436EE18
      Coordinates=(Expression=MaterialExpressionLinearInterpolate'MaterialGraphNode_16.MaterialExpressionLinearInterpolate_1')
      Texture=Texture2D'/Game/StarterContent/Textures/T_CobbleStone_Pebble_D.T_CobbleStone_Pebble_D'
      MaterialExpressionEditorX=208
      MaterialExpressionGuid=7E6521A84532807EBD525EA183015E06
      Material=PreviewMaterial'/Engine/Transient.Nine'
   End Object
   MaterialExpression=MaterialExpressionTextureSampleParameter2D'MaterialExpressionTextureSampleParameter2D_0'
   NodePosX=208
   bCanRenameNode=True
   NodeGuid=54F5BC6748E601159EA511AE481D57D4
   CustomProperties Pin (PinId=8B90F4104BEFFCEF862D34ADE4235FAF,PinName="UVs",PinType.PinCategory="optional",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_16 55660E7941786A34A0B3898AC6519093,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
   CustomProperties Pin (PinId=C58FB5384D6F08249467EDA758AE63E6,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinCategory="mask",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_Root_0 9F317E3B485EDA4C3BB18D919BF11765,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
   CustomProperties Pin (PinId=84D279184520F40E7188488AAB547885,PinName="Output2",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinCategory="mask",PinType.PinSubCategory="red",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
   CustomProperties Pin (PinId=904C2D7347A293194046CC89A9D871BC,PinName="Output3",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinCategory="mask",PinType.PinSubCategory="green",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
   CustomProperties Pin (PinId=52C672F6476E02F1D0709B8024DB8230,PinName="Output4",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinCategory="mask",PinType.PinSubCategory="blue",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
   CustomProperties Pin (PinId=0C8D1D2144651BC7E247B08354450B55,PinName="Output5",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinCategory="mask",PinType.PinSubCategory="alpha",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name="MaterialGraphNode_1"
   Begin Object Class=/Script/Engine.MaterialExpressionTextureCoordinate Name="MaterialExpressionTextureCoordinate_0"
   End Object
   Begin Object Name="MaterialExpressionTextureCoordinate_0"
      MaterialExpressionEditorX=-1008
      MaterialExpressionEditorY=48
      MaterialExpressionGuid=A83553DC43C83DB6FD4ACBA0076733B0
      Material=PreviewMaterial'/Engine/Transient.Nine'
   End Object
   MaterialExpression=MaterialExpressionTextureCoordinate'MaterialExpressionTextureCoordinate_0'
   NodePosX=-1008
   NodePosY=48
   NodeGuid=5588994B49C148AB762CD4A1EDD4EB53
   CustomProperties Pin (PinId=A1792B7542C6DB5A7428378F6F2FC95A,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_2 B7193ECA43FB35A86D54229FF2B3A224,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name="MaterialGraphNode_2"
   Begin Object Class=/Script/Engine.MaterialExpressionMaterialFunctionCall Name="MaterialExpressionMaterialFunctionCall_6"
   End Object
   Begin Object Name="MaterialExpressionMaterialFunctionCall_6"
      MaterialFunction=MaterialFunction'/Engine/Functions/Engine_MaterialFunctions02/Utility/BreakOutFloat2Components.BreakOutFloat2Components'
      FunctionInputs(0)=(ExpressionInputId=0FC5C56B4335798F20CB928CF1C87421,Input=(Expression=MaterialExpressionTextureCoordinate'MaterialGraphNode_1.MaterialExpressionTextureCoordinate_0',InputName="Float2"))
      FunctionOutputs(0)=(ExpressionOutputId=6BC893C247FCFC567178CE944E213385,Output=(OutputName="R"))
      FunctionOutputs(1)=(ExpressionOutputId=9720C81E449DF8E5514FCB8A80FD5FA3,Output=(OutputName="G"))
      MaterialExpressionEditorX=-848
      MaterialExpressionEditorY=48
      MaterialExpressionGuid=1A46253D466399725101C780422BCC5D
      Material=PreviewMaterial'/Engine/Transient.Nine'
      Outputs(0)=(OutputName="R")
      Outputs(1)=(OutputName="G")
   End Object
   MaterialExpression=MaterialExpressionMaterialFunctionCall'MaterialExpressionMaterialFunctionCall_6'
   NodePosX=-848
   NodePosY=48
   NodeGuid=5B2789E548CC1D559BCCC292AAA78F30
   CustomProperties Pin (PinId=B7193ECA43FB35A86D54229FF2B3A224,PinName="Float2 (V2)",PinType.PinCategory="optional",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_1 A1792B7542C6DB5A7428378F6F2FC95A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
   CustomProperties Pin (PinId=481DA17F443344F7C30DFA9E66C66FC9,PinName="R",Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_3 9CCE78B6497F72B1199E738180068C73,MaterialGraphNode_6 60BB1937423DF144D289F89F3FC08209,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
   CustomProperties Pin (PinId=9C686EF94F4DDC1913F3EE8FCE03BFD1,PinName="G",Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.bIsMap=False,PinType.bIsSet=False,PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_8 D5BC46D9425BE09A33100CA7B4684308,MaterialGraphNode_11 B8060662418BEFF13B2CC18D441B93F4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name="MaterialGraphNode_3"
   Begin Object Class=/Script/Engine.MaterialExpressionIf Name="MaterialExpressionIf_10"
   End Object
   Begin Object Name="MaterialExpressionIf_10"
      A=(Expression=MaterialExpressionMaterialFunctionCall'MaterialGraphNode_2.MaterialExpressionMaterialFunctionCall_6')
      B=(Expression=MaterialExpressionScalarParameter'MaterialGraphNode_17.MaterialExpressionScalarParameter_1')
      AGreaterThanB=(Expression=MaterialExpressionConstant'MaterialGraphNode_5.MaterialExpressionConstant
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值