使用shader实现一个图片旋转、某个点挖洞、偏移的功能

下面代码实现了Center作为旋转中心点和挖洞中心点,Offset是偏移

Shader "Custom/Spin" {
    Properties{
        _MainTex("Texture", 2D) = "white" {}
        _Speed("Speed", Range(0.1, 100)) = 1.0
        _Center("Center", Vector) = (0.5, 0.5, 0.0, 0.0)
        _Opacity("Opacity", Range(0, 1)) = 1.0
        _TransparentLength("TransparentLength", Range(0, 1)) = 0.2
        _Offset("Offset", Vector) = (0.5, 0.5, 0.0, 0.0)
    }
        SubShader{
            Tags {"Queue" = "Transparent" "RenderType" = "Opaque"}
            LOD 100

            Pass {
                Blend SrcAlpha OneMinusSrcAlpha // 启用混合模式
                CGPROGRAM
                #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;
                float2 _Center;
                float _Speed;
                float _Opacity;
                float _TransparentLength;
                float2 _Offset;

                v2f vert(appdata v) {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = v.uv;
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target{
                    float2 center = _Center;
                    float2 uv = i.uv - center;
                    float angle = _Time.y * _Speed;
                    float s = sin(angle);
                    float c = cos(angle);
                    float2 offset = _Offset;
                    float2 rotatedUV = float2((uv.x + offset.x) * c - (uv.y + offset.y) * s, (uv.x + offset.x) * s + (uv.y + offset.y) * c);
                    float dist = length(uv);
                    if (dist < _TransparentLength) {
                        discard;
                    }
                    fixed4 col = tex2D(_MainTex, rotatedUV + center);
                    col.a *= _Opacity;
                    return col;
                }


                /*fixed4 frag(v2f i) : SV_Target{
                    float2 center = _Center;
                    float2 uv = i.uv - center;
                    float angle = _Time.y * _Speed;
                    float s = sin(angle);
                    float c = cos(angle);
                    float2 rotatedUV = float2(uv.x * c - uv.y * s, uv.x * s + uv.y * c);
                    float dist = length(uv);
                    if (dist < _TransparentLength) {
                        discard;
                    }
                    fixed4 col = tex2D(_MainTex, rotatedUV + center);
                    col.a *= _Opacity;
                    return col;
                }*/


                //fixed4 frag(v2f i) : SV_Target {
                //    float2 center = _Center;
                //    float2 uv = i.uv - center;
                //    float angle = _Time.y * _Speed;
                //    float s = sin(angle);
                //    float c = cos(angle);
                //    float2 rotatedUV = float2(uv.x * c - uv.y * s, uv.x * s + uv.y * c);
                //    fixed4 col = tex2D(_MainTex, rotatedUV + center); // 采样纹理
                //    col.a *= _Opacity; // 乘以不透明度
                //    return col;
                //}
                ENDCG
            }
        }
            FallBack "Diffuse"
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值