【博物納新】是UWA重磅推出的全新欄目,旨在為開發者推薦新穎、易用、有趣的開源項目,幫助大家在項目研發之餘發現世界上的熱門項目、前沿技術或者令人驚嘆的視覺效果,並探索將其應用到自己項目的可行性。很多時候,我們並不知道自己想要什麼,直到某一天我們遇到了它。

導讀

今天給大家安利一個keijiro的光環特效項目Isaura(Aura effect with a isoline shader),工程結構非常簡單,只有必要的測試資源,代碼量也不大,對新手非常友好。

一、效果展示

二、項目概述

作者利用等值線Shader,將普通的粒子系統效果轉化成絢麗漂亮的不規則圓環效果,調整美化後最終得到上圖中「跟隨角色招式的光環效果」,實現思路值得借鑒。

三、實現步驟

接下來,帶大家簡單看一看項目中漂亮的光環效果是如何實現的。

準備基礎模型及動作

首先準備一個人形模型及對應的動作,由於希望在角色的左右手上製作出光環效果,故項目中保留了模型上的左右手節點使其暴露出來,並在節點下添加了兩個紫色點光源。效果如下圖:

在角色手上添加粒子特效

第二步,在角色的右手節點(希望有特效的部位)下創建兩個粒子特效,項目中使用了一個Billboard粒子和一個Mesh粒子,效果如下:

將粒子系統效果渲染到一張RenderTexture上

新建一個RenderTexture資源Aura,格式設為R8,Size設為1920x1080。

新建Layer,命名為Isaura,並將第二步添加的粒子系統的Layer設為Isaura。

新建一個Camera 命名為Isaura Camera,並將其CullingMask設為Isaura層,TargetTexture設為Aura。

完成上述步驟後,第二步創建的粒子系統的渲染效果就被以R8格式存儲在Aura這張RenderTexture上了。

編寫等值線Shader,用於將圖像轉換成「等值線圖」

項目中IsauraEffect.shader的部分代碼:

Shader "Hidden/Isaura/Isaura Effect"
{
Properties
{
_MainTex("", 2D) = "" {}
_AuraTex("", 2D) = "" {}
_Color("", Color) = (1, 1, 1)
}

HLSLINCLUDE

#include "PostProcessing/Shaders/StdLib.hlsl"

TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);

TEXTURE2D_SAMPLER2D(_AuraTex, sampler_AuraTex);
float4 _AuraTex_TexelSize;

half _Threshold; //等值線檢測值
half _Thickness; //等值線厚度(粗細)
half4 _Color; //等值線顏色

half Contour(float2 uv)
{
float4 duv = _AuraTex_TexelSize.xyxy * float4(1, 1, -1, 0) * _Thickness;

half3x3 m = half3x3(
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv - duv.xy).r,
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv - duv.wy).r,
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv - duv.zy).r,
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv - duv.xw).r,
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv ).r,
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv + duv.zw).r,
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv + duv.zy).r,
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv + duv.wy).r,
SAMPLE_TEXTURE2D(_AuraTex, sampler_AuraTex, uv + duv.xy).r
);

m = m > _Threshold;

half gx = m._11 + m._12 * 2 + m._13 - m._31 - m._32 * 2 - m._33;
half gy = m._11 + m._21 * 2 + m._31 - m._13 - m._23 * 2 - m._33;

return saturate(sqrt(gx * gx + gy * gy));
}

float4 Fragment(VaryingsDefault input) : SV_Target
{
float4 src = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.texcoord);
return src + Contour(input.texcoord) * _Color;
}

ENDHLSL

SubShader
{
Cull Off ZWrite Off ZTest Always
Pass
{
HLSLPROGRAM
#pragma vertex VertDefault
#pragma fragment Fragment
ENDHLSL
}
}
}

這個Shader的原理類似於邊緣檢測演算法,通過計算周圍點的色值梯度值,判斷是否是等值線上的點。以第三步中的RenderTexture截圖為例,Shader中的Contour(input.texcoord) * _Color輸出結果如下圖右:

新建PostProcessEffect,將粒子效果的等值線渲染到屏幕上

項目使用Post Processing v2添加後處理效果:

  • 首先使用第4步中的Shader新建一個棧前(Before Stack)後處理效果,MenuItem設為「Isaura/Isaura

    Effect」(具體代碼可查看項目中的IsauraEffect.cs)。

  • 新建Layer,命名為Post Fx。
  • 新建一個GameObject PostFx,Layer設為Post Fx,並添加Post Process Volume組件,在PostProcess Volume上添加之前定義好的「Isaura/Isaura Effect」效果,如下圖:

在MainCamera上添加Post Process Layer組件,Layer選擇Post Fx(必須和Post Process Volume的Layer相同),如下圖:

最後,為了避免MainCamera重複拍攝粒子系統效果,將Isaura層從Main Camera的Culling Mask中去除。運行一下可以得到如下的效果,至此已經基本實現了光環效果:

添加Bloom等效果,並適當調整參數

最後,在Post Process Volume組件上添加Unity的Bloom等效果,讓光環更好看。

四、性能測試

作為負責任的小編,當然要測一測項目的性能。趁著UWA GOT Online還在打折,小編不惜花費了5塊軟妹幣,使用小米8做了2分鐘的性能測試,得到了一份這樣的數據。

為了讓數據更有說服力,我又做了兩個版本共三個版本進行性能對比:

原版:原工程未做修改。

無特效版:關閉PostProcess和Isaura Camera,只保留基礎角色動畫和點光源。

優化版:修改Auara的尺寸為960x540,關閉Post Process Volume組件中對效果影響不大的特效如下圖:

使用三個版本分別進行測試,再通過UWA GOT Online解析數據,最終得到對比數據如下:

從數據圖標中可以看出,雖然優化版的Isaura效果幀率已接近60幀,但考慮到測試場景簡單的因素,更應該關注Camera.Render的渲染耗時。而在Camera.Render耗時均值的對比圖表中可以看到,即使是優化版也比無特效版多出11.29ms耗時,說明這個效果還是非常吃性能的。

因此,不建議大家在中低端設備上直接使用Isaura效果,可以進一步優化或在高端設備上使用。

五、總結

綜上所述,給你三個下載它的理由:

  • 這是一個有顏有料易上手的小例子,適合也許是新手的你;
  • 這是一個不需要複雜美術資源就能做出的漂亮特效,適合也許需要新思路的你;
  • 這是一個Post Processing Stack v2的簡單小例子,適合也許需要它的你。

此外,Isaura的渲染開銷較高,建議開發者謹慎使用。

推薦使用版本:Unity 2018.1或更高版本。

打包注意事項:將IsauraEffect.shader添加到Always-Included-Shaders中。

該項目來自UWA開源庫,您可以下載、收藏或評論Isaura項目。


推薦閱讀:
查看原文 >>
相关文章