unity 使用shader加rendertexture实现刮刮乐效果

本文转自:http://www.manew.com/thread-113128-1-1.html,请点击链接查看原文。

具体效果如下:
 
要点:

1.我们首先设置两个摄像机,一个是专门渲染笔刷图层(笔刷就是一个挂载spriterender的物体,用来生成rendertexture的渲染),命名为brushCamera,并且要设为dont clear模式:
 


 
之所以要设置为dont clear是为了能够将笔刷的轨迹在rendertexture中记录下来。
然后我们要创建一个笔刷预设体,这个笔刷预设体主要实现笔刷效果:
 

2.然后我们写一个遮罩shader,shader中需要两张图,一张是遮罩的图片(就是图中的蓝色图片),另一张是用于剔除刮痕处遮罩像素的图片,我们将渲染出的rendertexture作为剔除遮罩的图片。输出的像素就是masktexcolor,通过maskcolor.a通道来控制masktexcolor.a通道,实现鼠标滑过的masktex的像素被剔除,从而显示出底层的图片。

个人想法:

     原文的思路是随着鼠标的滑动通过bezier曲线不断生成笔刷来填充rendertexture,个人觉的只需正在鼠标滑动时,将鼠标的屏幕位置转为世界坐标下的位置,然后激活笔刷,将转化后的位置坐标z轴分量调整到遮罩和相机之间的位置,赋值给笔刷即可。

代码比较简单如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DrawRail : MonoBehaviour {

    public GameObject brush;
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            brush.SetActive(true);
        }
        if (Input.GetMouseButtonUp(0))
        {
            brush.SetActive(false);
        }
        if (Input.GetMouseButton(0))
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            brush.transform.position = new Vector3(pos.x, pos.y, -2);
        }
	}
}

经过测试可以实现效果,但是当鼠标移动过快时会出现不连续的情况,还是原博想的周到啊!


猜你喜欢

转载自blog.csdn.net/xsheen/article/details/79183251