一日一Shader·矩阵变换【SS_19】

今天整理一下矩阵变换的通用公式,其实主要是控制旋转的方式。

用了一个shader作为工具,展示不同矩阵变换的效果。

Shader "MyShader/SS_19"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_Height("Height",float)=0.5
		_Matrix1("Matrix1",vector)=(1,0,0)
		_Matrix2("Matrix2",vector)=(0,1,0)
		_Matrix3("Matrix3",vector)=(0,0,1)
        [Toggle(ROT)]_Rot("Rot",Float)=0
    }
    SubShader
    {       
        Pass
        {
            CGPROGRAM
            #pragma shader_feature ROT
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

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

            sampler2D _MainTex;
            float4 _MainTex_ST;
			fixed _Height;
			fixed3 _Matrix1;
			fixed3 _Matrix2;
			fixed3 _Matrix3;
            
			float4 fun(float4 _v){	
                float3x3 mat=float3x3(
					_Matrix1.x,_Matrix1.y,_Matrix1.z,
					_Matrix2.x,_Matrix2.y,_Matrix2.z,
					_Matrix3.x,_Matrix3.y,_Matrix3.z
				);
                #if ROT
                float s=sin(_Time.y);
				float c=cos(_Time.y);               
				float3x3 mat1=float3x3(
					 c,0,s,
                     0,1,0,
                    -s,0,c
				);
                mat=mul(mat,mat1);
                #endif
				return float4(mul(mat,_v.xyz),0);
			}
            v2f vert (appdata v)
            {
                v2f o;              
                o.vertex = UnityObjectToClipPos(fun(v.vertex));
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {               
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}
  • 缩放的通用公式:
                           float3x3 mat=float3x3(//s=size
                                  s,0,0,
                                  0,s,0,
                                  0,0,s
                           ); 
  • 反向:
                           float3x3 mat=float3x3(
                                  0,0,1,
                                  0,1,0,
                                  1,0,0
                           );   
  • 旋转的通用公式:
                           float3x3 mat=float3x3(//z轴为轴心      
                                 s,-c,0,                                 
                                 c,s,0,                                  
                                 0,0,1                           
                            );       

                           float3x3 mat=float3x3(//x轴为轴心
                                  1,0,0,
                                  0,s,c,
                                  0,-c,s
                           );     

                           float3x3 mat=float3x3(//y轴为轴心
                                  c,0,s,
                                  0,1,0,
                                  -s,0,c
                           );   
  • 其中的特殊角度:
    • 不变
    • 沿z轴往左翻90°
    • 沿z轴往右翻90°
    • 沿x轴往前翻90°
    • 沿x轴往后翻90°
    • 沿y轴往右翻90°
    • 沿y轴往左翻90°

返回目录:https://blog.csdn.net/yzy1987523/article/details/106676451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值