一、平移
方法一:


v.positionOS.xyz += _Translate.xyz;
方法二:
利用矩阵实现平移:



二、缩放
方法一:

v.positionOS.xyz *= _Scale.xyz*_Scale.w; _Scale.w实现全局缩放
方法二:


Shader"unity/Translation"
{
Properties
{
_Color("Color",Color)=(0,0,0,0)
_Translate("Translate",Vector)=(0,0,0,0)
_Scale("Scale",Vector)=(1,1,1,1)
}
SubShader
{
Tags
{
"RenderPipeline" = "UniversalPipeline"
}
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
CBUFFER_START(UnityPerMaterial)
float4 _Color;
float4 _Translate;
float4 _Scale;
CBUFFER_END
struct Attributes
{
float4 positionOS : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
};
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
//平移
// v.positionOS.xyz += _Translate.xyz;
//平移矩阵
float4x4 T = float4x4(
1,0,0,_Translate.x,
0,1,0,_Translate.y,
0,0,1,_Translate.z,
0,0,0,1
);
v.positionOS = mul(T,v.positionOS);
//缩放:将向量的每个分量分别与对应的缩放因子相乘
//(v.positionOS.x,v.positionOS.y,v.positionOS.z) * (_Scale.x,_Scale.y,_Scale.z)
//=(v.positionOS.x*Scale.x,v.positionOS.y*_Scale.y,v.positionOS.z*_Scale.z)
// v.positionOS.xyz *= _Scale.xyz*_Scale.w; _Scale.w实现全局缩放
//缩放矩阵
float3x3 Scale = float3x3(
_Scale.x,0,0,
0,_Scale.y,0,
0,0,_Scale.z
);
v.positionOS.xyz = mul(Scale,v.positionOS.xyz)*_Scale.w;
o.positionCS = TransformObjectToHClip(v.positionOS);
return o;
}
float4 frag(Varyings i):SV_Target
{
return _Color;
}
ENDHLSL
}
}
}