1. 程式人生 > >【Shader】簡單的螢幕噴血漸溶效果

【Shader】簡單的螢幕噴血漸溶效果

一般FPS中的螢幕濺血效果可以使用UI貼圖製作,簡單,缺點是效果生硬,不夠逼真。這邊提供一種方案思路,可以隨機生成血液噴濺並慢慢溶解的效果。

首先是全屏特效的實現。可以用OnPostRender實現,但是消耗太大,有點浪費。我們可以在相機前放置一個Quad面片,然後其渲染至整個螢幕。再在這個面片上進行紋理繪製即可。

	v2f vert(appdata_base v)
	{
		v2f o;
		o.pos = v.vertex;
		o.vertex = fixed4(v.vertex.x * 2, v.vertex.y * 2, 0, 1);
		return o;
	}

然後就正題:隨機的血液效果了。根據螢幕座標採集噪聲影象值,跟顏色疊加,將半透的alpha值剔除即可。

首先是噪聲生成。這邊山寨了一個超快的value噪聲函式。https://www.shadertoy.com/view/4sfGzS

	float noise(float3 x)
	{
		x *= 4.0;
		float3 p = floor(x);
		float3 f = frac(x);
		f = f*f*(3.0 - 2.0*f);
		float2 uv = (p.xy + float2(37.0, 17.0)*p.z) + f.xy;
		float2 rg = tex2D(_NoiseOffsets, (uv + 0.5) / 256.0).yx;
		return lerp(rg.x, rg.y, f.z);
	}

	float noise_sum(float3 p)
	{
		float f = 0.0;
		f += (1.0000 * noise(p)); p = 2.0 * p;
		f += (0.5000 * noise(p)); p = 2.0 * p;
		f += (0.2500 * noise(p)); p = 2.0 * p;
		f += (0.1250 * noise(p)); p = 2.0 * p;
		
		//f += 0.06255 * noise(p); 
		return f;
	}

_NoiseOffsets是一個噪聲影象,可以在這邊下載:http://www.blog.sirenix.net/s/NoiseOffsets.asset

然後,簡單的顏色疊加即可:

	fixed4 frag(v2f i) :SV_Target
	{
		fixed4 c;
		c = _Color * noise_sum(i.pos * _NoiseSize + _NoisePos);
		if (c.a <= _Fade)
		{
			c.a = 0f;
		}
		return c;
	}


對NoisePos隨機取值就可以隨機出不同的血液效果,改變Color的alpha值,我們就能慢慢溶解繪製出來的血液。

public class CamBlood : MonoBehaviour
{
    float startVal;

    Material curMat;
    int propIdColor;
    int propIdNoisePos;

    float durTime;
    float curTime;

    static CamBlood _inst;
    public static CamBlood Inst
    {
        get
        {
            if (_inst == null)
            {
                GameObject gobj = Instantiate(Resources.Load<GameObject>("Prefabs/effect/CamBlood")) as GameObject;
                _inst = gobj.GetComponent<CamBlood>();
            }
            return _inst;
        }
    }

    void Awake()
    {
        curMat = renderer.sharedMaterial;
        propIdColor = Shader.PropertyToID("_Color");
        propIdNoisePos = Shader.PropertyToID("_NoisePos");
    }

    void Update()
    {
        if (curTime <= durTime)
        {
            //顯示中
            curTime += Time.deltaTime;
            float val = (1 - (curTime / durTime)) * this.startVal;
            curMat.SetColor(propIdColor, new Color(0.19f, 0.03f, 0.03f, val));
        }
        else if(durTime > 0)
        {
            curMat.SetColor(propIdColor, new Color(0.19f, 0.03f, 0.03f, 0f));
        }
    }

    public void Create(Camera camera, float val, float durTime)
    {
        this.startVal = val;
        _inst.transform.parent = camera.transform;
        _inst.transform.localPosition = new Vector3(0f, 0f, 1f);
        _inst.transform.localEulerAngles = Vector3.zero;
        curMat.SetVector(propIdNoisePos, new Vector4(0, 0, Random.Range(0f, 1f), 1));
        curMat.SetColor(propIdColor, new Color(0.19f, 0.03f, 0.03f, val));

        this.durTime = durTime;
        curTime = 0f;
    }
}

需要建立時,呼叫即可
CamBlood.Inst.Create(cam, startVal, dur);

完整的專案資源下載:點選開啟連結

相關推薦

Shader簡單螢幕效果

一般FPS中的螢幕濺血效果可以使用UI貼圖製作,簡單,缺點是效果生硬,不夠逼真。這邊提供一種方案思路,可以隨機生成血液噴濺並慢慢溶解的效果。 首先是全屏特效的實現。可以用OnPostRender實現,但是消耗太大,有點浪費。我們可以在相機前放置一個Quad面片,然後其渲染

Unity Shader簡單積雪效果的實現

1.前言 公司的專案進入真機除錯階段,體驗了一個月的996模式的正式結束,放假第一天來寫篇部落格  2.實現思路 1.積雪的實現 一般由模型的紋理貼圖和一張積雪的紋理圖混合而成。 //2個取樣結果的差值(1.模型紋理,2.積雪紋理/顏色) color.rgb =

分治簡單說說快排

ostream stdout ++i rand() oid fclose cnblogs clu 快排 說到快拍,大家都會首先想到sort函數這個神奇的東西 但是,我們總得知道快拍主要用的分治思想 所以就說一說快拍吧 首先是分類 快拍主要有三種方式: 一、以第一個數為基準排

Swoole簡單安裝與創建TCP服務器

客戶 編寫程序 lac nco 版本 size sock ear light pecl install swoole PHP的異步、並行、高性能網絡通信引擎,使用純C語言編寫,提供了php語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL

收藏簡單方便的自助106短信群發工具

ima 群發 line com 短信群發 二維碼 麻煩 營銷 沒有 個人或者小規模店家要做短信營銷或者短信通知,如何選擇一家合適的短信群發平臺,需要考慮以下幾點。 1. 是否能發出去,到達率高,速度快。 根據短信內容性質不同,如果是廣告營銷,各個平臺都要進行審核。需要提供證

4 簡單繪圖(二)

dispose alt draw bsp rom 形狀 .html yellow tex 在上一篇裏已經向大家介紹了如何使用GDI+繪制簡單的圖像,這一篇繼續向大家介紹其它一些繪圖知識. 1.首先我們來看下上一篇中我們使用過的Pen. Pen的屬性主要有: Color(顏色

BZOJ2683簡單題 [分治][樹狀數組]

math 所有 操作數 def 正整數 || lap ref 維護 簡單題 Time Limit: 50 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description   你有一個N*N的棋盤,每

python簡單的購物車

python#!/usr/bin/env python #-*- coding:utf-8 -*- #簡單的購物車 #知識點: #1:優雅的enumerate函數,返回一個生成器對象:(index,item)的元組 #2:print(‘product list :’.center(50,’-‘)) 可以居中

12簡單SQL語句

刪除數據 簡寫 ide lte ons color order 整理 引用 -------------------------------------------- -- SQL語句 --------------------------------------------

簡單電路實現電源防接反,再也不用挨老板罵了

分享圖片 bmc lazy 方向 src 要點 jpg 兩個 cbi 我們在使用外接電源類產品時,可能會因一時疏忽將將電源線接反,導致產品被燒壞。從產品的設計角度來講,如果把電源做成防反接的,那就大大提高了產品的人性化設計。從技術角度來講,實現電源防反接的技術並不復雜,其實

XSY2032簡單粗暴的題目 組合數

sca online line end string align for ret pan 題目描述   給你\(n,k,a_1\ldots a_n\),設 \[ ans_n=\sum_{i=1}^n{(\sum_{j=i}^ns(j))}^k\\]   求\(ans_1\l

zookeeper簡單安裝

zookeeper1.安裝java#!/bin/bash # rpm -ivh jdk-8u144-linux-x64.rpm # java -version java version "1.8.0_144"2.安裝zookeeper下載地址 : http://zookeeper.apac

kafka簡單安裝kafka單機版

kafka topic 1.安裝kafka下載地址 : https://www.apache.org/dyn/closer.cgi?path=/kafka/0.9.0.0/kafka_2.11-0.9.0.0.tgzrz tar zxf kafka_2.11-0.9.0.0.tgz mv kafka_

jar簡單導入jar包

java lib zookeeper import 1.將jar包放入統一目錄中2.工程裏創建一個文件夾lib,保存jar包3.復制需要的jar包到lib文件夾下4.配置jar包5.導入zookeeper的jar包6.import導入包【jar】簡單導入jar包

jar簡單導入jar包2

java lib libs org jar 1.project中進行build path2.Libraries中添加額外的jar(add External JARs)3.Apply 然後 Apply and Cloese4.測試導入org.apache包【jar】簡單導入jar包2

MySQL簡單命令總結

MySQL查看數據庫 SHOW DATABASES; 創建數據庫 CREATE DATABASE IF NOT EXISTS 數據庫名; 選擇數據庫 USE 數據庫名; 查看數據庫中的數據表 SHOW TABLES; 刪除數據庫 DROP DATABASE IF EXISTS 數據庫名; 創建一個簡單的數據庫

LOJ6053簡單的函數(min_25篩)

ios can long ring -s In IV Go else 題面 LOJ 題解 戳這裏 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstr

XSY3156簡單計數II 容斥 DP

不為 std def ans amp sum nom pro 假設 題目大意   定義一個序列的權值為:把所有相鄰的相同的數合並為一個集合後,所有集合的大小的乘積。   特別的,第一個數和最後一個數是相鄰的。   現在你有 \(n\) 種數,第 \(i\) 種有 \(c_i

java簡單實現數據庫連接池

zed cal lean jdbc stat eof LEDE import thread 一直在想java事務是怎麽實現的,在原聲jdbc的時候級別下,我們可以通過關掉autocommit 然後再手動commit。但是項目開發中基本上是看不見conection的。所以自己

bzoj3687簡單

#3687. 簡單題 記憶體限制:512 MiB 時間限制:10 Sec 提交 提交記錄 討論 題目描述 小呆開始研究集合論了,他提出了關