URP-利用矩阵在Shader中实现物体的平移和缩放
一、平移
方法一:
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_ENDstruct 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}}}