Unity噴墨效果Shader實現

2021-08-03 13:05:15 字數 2952 閱讀 2168

筆者介紹:姜雪偉,it公司技術合夥人,it高階講師,csdn社群專家,特邀編輯,暢銷書作者,已出版書籍:《手把手教你架構3d遊戲引擎》電子工業出版社和《unity3d實戰核心技術詳解》電子工業出版社等。

對於遊戲中使用的類似噴墨效果,在射擊類遊戲中經常使用比如玩家射擊的子彈會在牆上出現類似噴墨效果,效果如下所示:

在預設情況下,螢幕的整個alpha通道都是黑色的,直到玩家開始噴射油墨,才會使被油墨濺到區域的alpha通道變為白色。然後影象效果就是其原有顏色與灰度進行混合。

實現方式如下所示:

從上圖可以看出,使用projector將噴漆繪製到物體表面並建立顏色遮罩。每個projector都使用程式化動態生成,在子彈(空中飛行的白點)接觸到某個表面時進行初始化。projector帶有乙個盒式碰撞體,當子彈落在projector上時,不會初始化新的projector,而是讓原先的projector變大。這樣漆量會變多,而場景中的projector數量卻保持不變。

預設情況下,unity標準著色器會為所有不透明物件的alpha通道寫入1。所以下面使用自定義著色器來替換unity標準著色器。新建乙個標準表面著色器,將其表面函式替換為如下:

void surf(input in, inout su***ceoutputstandard o)

下面這行很重要,用於避免unity更改自定義的alpha值。將#pragma那行**改為如下:

cgprogram

#pragma su***ce surf standard fullforwardshadows keepalphs

注意,該技巧不可用於unity中的延遲渲染管線,因為它重寫了g-buffer中的alpha通道來儲存遮罩資料。

當子彈撞擊某個表面時就會在撞擊處動態生成unity projector。這些projector帶有自定義材質與自定義著色器。材質紋理是一張帶有alpha通道噴濺形狀圖,本文示例使用的紋理如下圖:

注意,紋理匯入設定中要將wrap mode設為「clamp」而非「repeat」。用於projector材質的著色器從unity提供的projectorlight修改而來,**如下:

shader "projector/projectalpha"

} subshader

pass

; struct v2f

;float4x4 unity_projector;

float4x4 unity_projectorclip;

v2f vert(input v)

sampler2d _shadowtex;

sampler2d _fallofftex;

fixed4 frag(v2f i) : color

edncg

} }}

再介紹一下,關於混合的部分:

當著色器計算某個畫素的顏色時,該顏色必須作用於螢幕上該點已經存在的畫素顏色之上。預設情況下,新的畫素會完全覆蓋原有畫素,但新畫素也可以與原有畫素進行混合。混合通常用於讓物件呈透明或半透明效果,當然也可以實現很多其它的炫酷特效。

關鍵字blend可以包含在subshader或pass標籤中,甚至對同乙個著色器的不同pass進行混合。新增blend關鍵字後,必須寫入混合因子。混合因子如下:

src指向著色器用於計算的顏色。dst指向螢幕上已有的畫素顏色。著色器用於計算的顏色會與第乙個因子相乘,而螢幕上已有顏色會與第二個因子相乘。將兩個結果相加,就是最終寫到螢幕的顏色。

用於projector的著色器就是「blend zero one, one one」,「zero one」移除了飛濺紋理的顏色,使用子彈所飛濺到的表面顏色。「one one」將飛濺物的alpha值與表面alpha值相加。

現在使用上面的著色器與材質來生成projector,應該將場景檢視的alpha通道設為白色。

現在可以隨意修改alpha通道,但還未達到最終效果。下面利用alpha遮罩來建立遊戲所需的影象特效。

首先,建立要使用影象特效的著色器。在unity中新建預設的image effect shader,然後將片段**替換為如下:

fixed4 frag(v2f i) : sv_target

可以隨意更改bnw(black&white)變數以達到理想的混合效果。最後還需要新建指令碼來執行該影象特效。指令碼非常簡單,**如下:

using system.collections;

using system.collections.generic;

using unitystandardassets.imageeffectbase;

[executeineditmode]

[imageeffectallowedinsceneview]

public class alphacolorswitch : imageeffectbase

}

注意,這裡用到了imageeffectbase,該資源在unity標準資源庫中(unity 5.5及以上版本推薦使用post processing stack資源庫代替imageeffects)。匯入標準資源庫後,將指令碼繫結到相機(確保將相機的渲染模式設為forward)上,並將公共的著色器變數設為前面提到的著色器。

到此就可以向場景中噴射油墨啦!

unity雜訊消融效果Shader實現

這個shader可以做慢慢消失的效果,就是消融效果 shader shader kaima dissolve edgecolor noisetex noise 2d white threshold threshold range 0.0,1.0 0.5 edgelength edge length ...

shader 玻璃效果

玻璃效果主要是折射效果的計算和反射效果的計算。折射 1.利用grass pass對當前螢幕的渲染影象進行取樣 2.得到法線貼圖對折射的影響 3.對採集的螢幕影象進行關於法線方向上的扭曲和偏移,以模擬折射效果 反射 主要利用環境貼圖產生反射的殘影,並和主貼圖取樣結果混合 得到反射和折射的結果後,以乙個...

Shader 各種Shader效果的合集

1.the fresnel effect 參考 實用的shader shader heroshader character a通道標記陣營區域,1 表示有陣營顏色區域,0 表示非陣營顏色區域 emission emission range 0,1 0 自發光 shadowlevel shadow l...