鼠标点击的涟漪效果(unity&shader)

原文地址:http://www.manew.com/thread-106798-1-1.html

------------------------------------------------------------------------------------------------------

一、前言

    又是一个好久没有更新了,还是因为太忙,生活苟且云云,当然有好的东西还是需要拿出来和大家分享一下的。
    使用的是.5.0版本,惯例,先上效果图,如图所示:该效果是响应每一次鼠标点击时候,在鼠标的点击的位置处产生一个颜色随机的



二、实现方法

1、重点的Shader部分:

    首先,是最难的颜色转换函数,代码:

本帖隐藏的内容
[C#] 纯文本查看 复制代码

//转换颜色的方法

fixed3 shift_col(fixed3 RGB, half3 shift)

{

fixed3 RESULT = fixed3(RGB);

float VSU = shift.z*shift.y*cos(shift.x*3.14159265 / 180);

float VSW = shift.z*shift.y*sin(shift.x*3.14159265 / 180);



RESULT.x = (.299*shift.z + .701*VSU + .168*VSW)*RGB.x

+ (.587*shift.z - .587*VSU + .330*VSW)*RGB.y

+ (.114*shift.z - .114*VSU - .497*VSW)*RGB.z;



RESULT.y = (.299*shift.z - .299*VSU - .328*VSW)*RGB.x

+ (.587*shift.z + .413*VSU + .035*VSW)*RGB.y

+ (.114*shift.z - .114*VSU + .292*VSW)*RGB.z;



RESULT.z = (.299*shift.z - .3*VSU + 1.25*VSW)*RGB.x

+ (.587*shift.z - .588*VSU - 1.05*VSW)*RGB.y

+ (.114*shift.z + .886*VSU - .203*VSW)*RGB.z;



return RESULT;

}

属性部分为:
[PerRendererData]命令的意思是直接会将该物体的其他材质上的纹理加载进来
[Toggle]命令的意思是一个可以显示在面板上的可勾选项
[C#] 纯文本查看 复制代码
        Properties

{

[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}

[HideInInspector]_StartTime("StartTime", Float) = 0

_Time("AnimationTime", Range(0.1, 10.0)) = 1.5

_Width("Width", Range(0.1, 3.0)) = 0.3

_StartWidth("StartWidth", Range(0, 1.0)) = 0.3

[Toggle] _isAlpha("isAlpha",Float) = 1

[Toggle] _isColorShift("isColorShift",Float) = 1

[MaterialToggle] PixelSnap("Pixel snap", Float) = 1

}

顶点和片段着色器代码:
[C#] 纯文本查看 复制代码
v2f vert(appdata_base IN)

{

v2f OUT;

OUT.vertex = UnityObjectToClipPos(IN.vertex);

OUT.texcoord = IN.texcoord;

return OUT;

}

fixed4 frag(v2f IN) : SV_Target

        {

                fixed4 color = tex2D(_MainTex, IN.texcoord);

                float2 pos = (IN.texcoord - float2(0.5,0.5)) * 2; //宽度

                float dis = (_Time.y - _StartTime) / _AnimationTime + _StartWidth - length(pos);



                //大于最大宽度以及小于0都去掉这部分的像素

                if (dis < 0 || dis > _Width)

                return fixed4(0,0,0,0);



                //如果开启了透明度渐变就让透明度进行插值

                float alpha = 1;

                if (_isAlpha == 1)

                {

                        alpha = clamp((_Width - dis) * 3, 0.1, 1.5);

                }



                fixed3 shiftColor = color;

                if (_isColorShift == 1)

                {

                        half3 shift = half3(_Time.w * 10, 1, 1);

                        shiftColor = shift_col(color, shift);

                }



                return fixed4(shiftColor, color.a * alpha);

        }




2、创建波纹预设体

有了Shader之后,创建该Shader的材质球,我一般都会直接选中该Shader,然后右键创建材质,这个材质就直接赋值了这个Shader,并且命名也会和该Shader的名字相关。创建完材质之后,创建一个空物体,并且给这个空物体添加Sprite Renderer属性。将下面的贴图给Sprite Renderer的Sprite。



编写该预设体的控制脚本,代码如下:

[C#] 纯文本查看 复制代码
using System.Collections;

using System.Collections.Generic;

using UnityEngine;





[RequireComponent(typeof(SpriteRenderer))]

[RequireComponent(typeof(Collider2D))]

public class Ripple : MonoBehaviour

{

    SpriteRenderer mSpriteRenderer;

    Collider2D mCircleCollider;



    void Awake()

    {

        mSpriteRenderer = transform.GetComponent<SpriteRenderer>();

        mCircleCollider = transform.GetComponent<Collider2D>();

    }



    void Start()

    {

        Invoke("unenabledTrigger", 0.05f);



        mSpriteRenderer.material.SetFloat("_StartTime", Time.time);



        float animationTime = mSpriteRenderer.material.GetFloat("_AnimationTime");

        float destroyTime = animationTime;

        destroyTime -= mSpriteRenderer.material.GetFloat("_StartWidth") * animationTime;

        destroyTime += mSpriteRenderer.material.GetFloat("_Width") * animationTime;

        Destroy(transform.gameObject, destroyTime);

    }



    public void unenabledTrigger()

    {

        mCircleCollider.enabled = false;

    }



    public void OnTriggerEnter2D(Collider2D collider)

    {



    }

}



3、最后写一个总控脚本

控制预设体点击创建,代码如下:

[C#] 纯文本查看 复制代码
using System;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.EventSystems;

using UnityEngine.UI;



[RequireComponent(typeof(Image))]

public class Control : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler

{

    public GameObject prefabRippleEffect;



    public void OnDrag(PointerEventData eventData)

    {



    }



    public void OnPointerDown(PointerEventData eventData)

    {

        CreateNewRipple(eventData.position);

    }



    public void OnPointerUp(PointerEventData eventData)

    {



    }



    // Use this for initialization

    void Start() {



    }



    // Update is called once per frame

    void Update() {

        CheckTap();

    }

    private void CheckTap()

    {

        foreach (Touch item in Input.touches)

        {

            if (item.phase == TouchPhase.Began)

            {

                CreateNewRipple(item.position);

            }

        }

    }

    /// <summary>

    /// 创建新的波纹

    /// </summary>

    /// <param name="pos"></param>

    private void CreateNewRipple(Vector2 pos)

    {

        Vector2 worldPos = Camera.main.ScreenToWorldPoint(pos);

        GameObject tempNewRipple = Instantiate(prefabRippleEffect, worldPos, Quaternion.identity, transform);

    }

}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
unity涟漪shader是一种在游戏开发中用于实现涟漪效果的渲染技术。该技术利用shader编程和图形计算的原理,通过对顶点位置或纹理进行变换,在渲染过程中加入了水波纹的效果,从而实现了真实的水面效果。 在涟漪shader中,首先需要定义水面的网格,可以是一个平面或者是任意形状的网格,然后通过shader程序对该网格进行顶点偏移或UV纹理变换,从而实现水面上波纹的扩散效果。可以通过修改shader中的参数和噪声纹理,来调整波纹的强度、速度和密度等属性,使得波纹看起来更加真实。 涟漪shader通常包括增量波函数、法线计算、纹理坐标偏移等关键步骤。增量波函数用于计算每个顶点的波纹偏移量,可以通过正弦或余弦函数模拟波浪效果。法线计算用于描述水面的倾斜方向,并将波纹效果应用到法线上,增加水面的真实感。纹理坐标偏移则是将波纹效果应用到纹理上,使得水面的纹理随着波浪的扩散而发生变化。 涟漪shader在游戏中可以用于实现水面、池塘、湖泊等水域场景的真实表现。同时,通过与环境光遮蔽、折射、反射等技术结合,可以进一步增强水面效果,使得游戏场景更加生动逼真。 总之,unity涟漪shader是一种用于实现水面波纹效果的渲染技术,通过shader编程和计算图形变换,能够使游戏场景中的水域表面产生真实的涟漪效果,增强游戏的视觉效果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值