【Unity】イメージエフェクトを使用しない簡易GlowShader
なるべく軽量にするため、イメージエフェクトを使用せずに光の玉を表現させる一例です。
一枚の板で、円をぼかし拡大縮小して
光っている風に見せかけてます。
vertex
どこから見ても同じように見せるようにビルボードにします。
Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }
・・・
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
・・・
v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_P,
mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))
+ float4(v.vertex.x, v.vertex.y, 0.0, 0.0)
* float4(0.5, 0.5, 1.0, 1.0)); // XYのスケーリング
}
ビルボードについての詳細はこちらの記事が詳しいです。
常にカメラを向くオブジェクトをGPUで実装
fragment
四角形からはみ出ない程度に円を描いて良い感じにぼかし、アニメーションさせています。
形状によってはテクスチャのほうがきれいに表現できるかと思います。
fixed4 frag (v2f i) : SV_Target
{
float4 col = _Color;
float dist= length(i.uv - 0.5) * 2;
// 外に行くほど薄くなるようぼかす
col *= saturate(1 - dist);
// 中心の光具合を強調・拡縮アニメーション
col *= (1 - dist) * lerp(1, 3, sin(_Time.z) * 0.5 + 0.5);
col = saturate(col);
clip(col.a - 0.0001);
return col;
}
アルファブレンド
背景と馴染むようこれもよい感じに調整。
サンプルの場合は
Blend SrcAlpha DstAlpha
ちなみに確認時は以下のようにしておくとmaterialで調整ができるので便利です。
Properties
{
[Enum(UnityEngine.Rendering.BlendMode)]_BlendSrc("Blend Src", Float) = 0
[Enum(UnityEngine.Rendering.BlendMode)]_BlendDst("Blend Dst", Float) = 0
}
・・・
Blend [_BlendSrc][_BlendDst]
利用できる場面
結局板なので、角度によって他のオブジェクトに板が遮られたりすると
切れ目が不自然に見えたりしまいます。
近距離のオブジェクトとの兼ね合いでどのくらい許容できるか次第かと思います。
Author And Source
この問題について(【Unity】イメージエフェクトを使用しない簡易GlowShader), 我々は、より多くの情報をここで見つけました https://qiita.com/oudont3/items/07de5bbcc1e8f61459a4著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .