Unity Shader之uv旋转

本文详细探讨了如何在Unity中使用Shader实现UV纹理坐标围绕Z轴的旋转,重点介绍了旋转公式和中心点调整的方法,帮助开发者创建动态纹理效果。

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

uv旋转,注意按照z轴变换的时候旋转公式,还有中心点的设置


Shader "Custom/UV rotation"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
	_Angle("Angle", Range(-5.0,  5.0)) = 0.0
	}
		SubShader
	{
		Tags{ "RenderType" = "Opaque" }

		Pass
	{
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

		struct v2f {
		float4 pos : SV_POSITION;
		float2 uv : TEXCOORD0;
	};

	float _Angle;

	v2f vert(appdata_base v)
	{
		v2f o;
		o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

		float2 pivot = float2(0.5, 0.5);         //中心点

		float cosAngle = cos(_Angle);
		float sinAngle = sin(_Angle);
		float2x2 rot = float2x2(cosAngle, -sinAngle, sinAngle, cosAngle);  //确定以z轴旋转

		float2 uv = v.texcoord.xy - pivot;
		o.uv = mul(rot, uv);      
### 如何在 Unity 中使用 Shader 实现 UI 元素的旋转效果 为了实现在 Unity 中通过 Shader 对 UGUI 进行旋转的效果,可以基于已有的 `UIEffect` 组件进行扩展。由于普通的 Shader 不适用于直接应用于 UI 上,因此需要特别定制适合于 UGUI 的着色器逻辑。 #### 创建自定义旋转 Shader 创建一个新的 Unlit 类型的 Shader 文件,在其中加入矩阵变换以支持旋转变换: ```csharp Shader "Custom/UIRotate" { Properties { _MainTex ("Texture", 2D) = "white" {} _RotationAngle("Rotation Angle", Range(0,360)) = 0 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} Blend SrcAlpha OneMinusSrcAlpha Cull Off ZWrite Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 pos : SV_POSITION; }; sampler2D _MainTex; float _RotationAngle; v2f vert(appdata_t IN) { v2f o; // 计算中心点偏移量 float2 centerOffset = IN.vertex.xy - mul((float2x2)unity_ObjectToWorld, float2(0.5, 0.5)); // 将角度转换成弧度制用于计算sin cos函数 float radian = radians(_RotationAngle); // 构建旋转矩阵并应用到顶点坐标上 float s = sin(radian), c = cos(radian); float2x2 rotationMatrix = float2x2(c,-s,s,c); float2 rotatedPosition = mul(rotationMatrix,centerOffset)+mul((float2x2)unity_ObjectToWorld,float2(0.5,0.5)); o.pos = UnityObjectToClipPos(float4(rotatedPosition.x,rotatedPosition.y,IN.vertex.zw)); o.uv = IN.uv; return o; } fixed4 frag(v2f i) : COLOR { return tex2D(_MainTex,i.uv); } ENDCG } } } ``` 此段代码实现了基本的功能需求,即允许用户输入一个角度值 `_RotationAngle` 来控制图像绕其自身的几何中心发生相应程度的旋转[^1]。 #### 应用与测试 完成上述 Shader 编写之后,将其挂载至目标 UI 图像组件之上,并确保该对象已经设置了合适的材质球引用了新编写的 Shader 资源。此时可以在 Inspector 面板中调整 Rotation Angle 参数观察即时渲染变化情况[^2]。 对于更复杂的交互场景下可能还需要考虑性能优化以及与其他特效之间的兼容性等问题;另外值得注意的是当涉及到多层嵌套布局时可能会遇到一些额外挑战,比如子项相对于父级定位关系的影响等[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值