【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 提交 提交記錄 討論 題目描述 小呆開始研究集合論了,他提出了關