unity 使用shader加rendertexture實現刮刮樂效果

NO IMAGE

本文轉自: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);
}
}
}

經過測試可以實現效果,但是當滑鼠移動過快時會出現不連續的情況,還是原博想的周到啊!