Home - koturn/LilKustomShaders GitHub Wiki

簡単な説明書

lilToonカスタムシェーダー一覧

シェーダー名 説明
LilCrossFade Texture2DArrayをメインテクスチャの代わりにクロスフェード表示させるシェーダー
LilEmissionWave オブジェクト座標,またはワールド座標空間でエミッションの波をスクロールするようにしたシェーダー
LilHueShift マスクで指定した領域の色相を時間経過で変化させることができるシェーダー
LilOptimized lilToonの本体処理で最適化できそうな箇所を最適化したものに置換したシェーダー.他のカスタムシェーダーはこのシェーダーを参照している.
LilRefProbe Reflection Probeをブレンドすることができるようにしたシェーダー
LilTextOverray poiyomiのText Overrayと同等の機能を提供するシェーダー.ワールド入室からの経過時間,フレームレート,ワールド座標だけではなく,AudioLinkから現在時間取得して表示することも可能
LilWireframe エミッションによるワイヤフレームの各辺を時間経過によりバラバラに点滅表示させるシェーダー

ダウンロード

リリースページを参照してください.

lilToonのカスタムシェーダーとは

lilToonは本体のシェーダーを変更することなく,処理を追加,または変更を行ったシェーダーを別シェーダーとして簡単に作成できるようになっています. これを活用して作成したのが本シェーダー群となります.

Unityプロジェクトへの導入手順

  1. 予め,lilToonをインポートしておく
    • unitypackage版,VCC版のどちらでも問題ありません
  2. 対象のカスタムシェーダーのunitypackageをインポートする

本カスタムシェーダーはlilToon 1.5.0 を対象に作成・動作確認しております. 最新のバージョンまたは少し古いバージョンでも問題なく動作するとは思いますが,うまく動かない場合はlilToon本体のバージョン変更をご検討ください.

シェーダー適用手順

既に適用されているシェーダーがlilToonの場合

マテリアルを選択し,右クリックで表示されるコンテキストメニューから

koturn -> LilXXXXXXXX -> Convert material to custom shader

を左クリックで実行してください(LilXXXXXXXXはLilEmissionWaveやLilWireframeです).

img/ContextMenu.png

UTS2の場合

lilMaterialConverterを用いてlilToonを適用した後,前述の手順でカスタムシェーダーに変更してください. (前述のツールはある程度よしなにUTS2の設定をlilToonに引き継ぐためのものです)

その他の場合

マテリアルのシェーダー欄のコンボボックスから

  • koturn/LilEmissionWave/lilToon
  • koturn/LilWireframe/lilToon

等の目的のカスタムシェーダーを選択してください.

カスタムシェーダーから元のlilToonに戻す

マテリアルを選択し,右クリックで表示されるコンテキストメニューから

koturn -> LilXXXXXXXX -> Convert material to original shader

を左クリックで実行してください.

右クリックメニューでのカスタムシェーダーからカスタムシェーダーへの変更はサポートしていないため,別のカスタムシェーダーに変更する場合は一度オリジナルのlilToonを経由する必要があります.

LilCrossFade

カスタム設定項目一覧

項目名 プロパティ名 説明
メインテクスチャ配列 _MainTexArray Texture2DArrayを設定する
テクスチャ数 _NumTextures メインテクスチャ配列のテクスチャ数です
1テクスチャの表示時間(秒) _DisplayTime 1テクスチャを表示する時間.クロスフェード時間は含まない.
クロスフェード時間(秒) _CrossFadeTime クロスフェードにかける時間

Texture2DArrayはこのカスタムシェーダーに付属のエディタ拡張にて作成できるようになっています.

LilEmissionWave

img/LilEmissionWave01.gif img/LilEmissionWave02.gif

カスタム設定項目一覧

項目名 プロパティ名 説明
_EmissionWaveColor エミッションの色
ノイズ振幅 _EmissionWaveNoiseAmp ノイズの幅.0より大きい値にすると電流のようなギザギザの波になる
波の速度 _EmissionWaveSpeed 波の速度.0で移動しなくなる
初期位相 _EmissionWaveInitPhase 時間スケールが0のときの表示位置の調整に用いる
係数 _EmissionWaveParam 波の幅の調整に用いる.値が大きいほど波が鋭くなる(幅が狭くなる).
位置の最小値 _EmissionPosMin 波がどこから伝播するかの値.再生しながら調整するとよい
位置の最大値 _EmissionPosMax 波がどこまで伝播するかの値.再生しながら調整するとよい
位置計算空間 _WavePosSpace 波の移動がオブジェクト空間ベースかワールド空間ベースかの選択
波方向軸 _WaveAxis 波の移動方向がX, Y, Zのどの軸であるかを選択.自由軸を選択することも可能
波方向角度(度) _WaveAxisAngles 自由軸を選択した際の方向の調整

位置計算空間をオブジェクト空間ベースにした場合,オブジェクトの回転に追従して波の進行方向も変化します. 例えば,人型のアバターで頭から足にかけての波に設定しているのであれば,横にあおむけに寝転がっても頭から足にかけての波となります. 一方で,ワールド空間ベースであれば,波の進行はオブジェクトの回転に追従しません. 例えば,頭から足にかけての波であれば,横にあおむけに寝転がった場合,お腹から背中にむけての波となります.

ノイズ振幅は3Dモデルの頂点毎に適用しています. そのため,ポリゴン数が少ない3Dモデルに対しては折れ線が少ない波となり,電流感があまりないかもしれません.

時間スケールを負の値にすると,波の進行方向が逆になります. また,時間スケールを0にし,ノイズ振幅を0.25などの0より大きい値を設定すると,定位置でビリビリするエミッションとなります.

係数は単純な説明は上記の表の通りです. もう少し詳しく説明すると,波の正体は大雑把には下記の通りです.

$$ \left( \dfrac{1}{2} \cos af(t)\pi + \dfrac{1}{2} \right)^b $$

$f(t)$ がワールド入室してからの経過時間,位置の最小値・最大値から計算された値であり, $a$ と $b$ が設定項目の係数に当たります. $a$ は波そのものを拡げる・狭めるイメージ, $b$ は波の始点と終点を保ったまま波の勾配を急にする・緩やかにするイメージです.

設定例

下記の画像はそれぞれ最初に示したアニメーションGIF画像の設定です.

img/LilEmissionWaveConfig01.png img/LilEmissionWaveConfig02.png

LilHueShift

img/LilHueShift01.gif

カスタム設定項目一覧

項目名 プロパティ名 説明
マスク _HsMask 色相変化させる領域のマスク
時間スケール _HsSpeed 色相変化速度

マスクについて

マスクテクスチャは基本的に色相変化してほしい部分は白(RGB = (255, 255, 255)),変化してほしくない部分は黒(RGB = (0, 0, 0))にしてください.

実装詳細としては,マスクテクスチャはRチャンネルのみ参照しています. そのため,黒と赤のテクスチャにしても問題ありません.

また,色相の変化度合いは下記の計算で算出されます. (Rと色相値は0.0~1.0の値に正規化されています.色相の変化度合い1.0は0.0と同じ,すなわち変化なしで,1.5は0.5と等しくなります)

$$ \text{色相の変化度合い} = \text{マスクテクスチャのRの値} \times \text{時間スケール} \times \text{(ワールドに入室してからの経過時間)} $$

そのため,マスクテクスチャ内でRの濃度を異なるものにすることにより,ピクセル毎に異なる色相変化速度になります.

LilOptimized

カスタム設定項目一覧

なし

LilRefProbe

カスタム設定項目一覧

なし

項目名 プロパティ名 説明
マスク _RefProbeMask 適用する範囲のマスク
ブレンド率 _RefProbeBlendCoeff Reflection Probeをブレンドする割合

LilTextOverray

共通カスタム設定項目一覧

項目名 プロパティ名 説明
スプライトシート _SpriteTex 表示する数字のフォントになるテクスチャ

経過時間設定項目一覧

項目名 プロパティ名 説明
_ElapsedTimeColor 表示する数字の色
オフセット _ElapsedTimeOffset 表示位置
スケール _ElapsedTimeScale 表示サイズ
回転角 _ElapsedTimeRotAngle 表示回転角
数字個数 _ElapsedTimeDisplayLength 表示桁数
アラインメント _ElapsedTimeAlign 右寄せか左寄せか0埋めかを選択可能

オーディオリンク現在時刻設定項目一覧

項目名 プロパティ名 説明
_ALTimeOfDayColor 表示する数字の色
オフセット _ALTimeOfDayOffset 表示位置
スケール _ALTimeOfDayScale 表示サイズ
回転角 _ALTimeOfDayRotAngle 表示回転角
数字個数 _ALTimeOfDayDisplayLength 表示桁数
アラインメント _ALTimeOfDayAlign 右寄せか左寄せか0埋めかを選択可能
時間種別 _ALTimeOfDayKind ローカル時間(ユーザー各々が実行しているPCの現地時刻)かUTCかを選択可能
UTC非対応時のローカル時間へのフォールバック _EnableALTimeOfDayUtcFallback ワールドに組み込まれているAudioLinkが古く,UTCが利用できない場合にローカル時間を表示するようにするかどうか.
ローカル時間オフセット秒数 _ALTimeOfDayLocalTimeOffsetSeconds ローカル時間に加味するオフセット秒数.通常は0でよい.
UTCオフセット秒数 _ALTimeOfDayUtcOffsetSeconds UTCに加味するオフセット秒数.日本在住で日本時間にしたいなら32400を設定.

※オーディオリンクが組み込まれていないワールドではいかなる設定をしても非表示になります.

経過時間設定項目一覧

項目名 プロパティ名 説明
_FramerateColor 表示する数字の色
オフセット _FramerateOffset 表示位置
スケール _FramerateScale 表示サイズ
回転角 _FramerateRotAngle 表示回転角
数字個数 _FramerateDisplayLength 表示桁数
アラインメント _FramerateAlign 右寄せか左寄せか0埋めかを選択可能

ワールド座標設定項目一覧

項目名 プロパティ名 説明
X座標色 _WorldPosColorX X座標の数字の色
Y座標色 _WorldPosColorY Y座標の数字の色
Z座標色 _WorldPosColorZ Z座標の数字の色
オフセット _WorldPosOffset 表示位置
スケール _WorldPosScale 表示サイズ
回転角 _WorldPosRotAngle 表示回転角
数字個数 _WorldPosDisplayLength 表示桁数
アラインメント _WorldPosAlign 右寄せか左寄せか0埋めかを選択可能

オフセット,スケール,回転角はUV座標(0.5, 0.5)を中心とした下記のアフィン変換後のUV座標に対して,目的の数字を描画することを意味します.

$$ \begin{pmatrix} u' \ v' \ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & t_x \ 0 & 1 & t_y \ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} \cos \theta & -\sin \theta & 0 \ \sin \theta & \cos \theta & 0 \ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} s_x & 0 & 0 \ 0 & s_y & 0 \ 0 & 0 & 1 \end{pmatrix} \left( \begin{pmatrix} u \ v \ 1 \end{pmatrix} - \begin{pmatrix} \frac{1}{2} \ \frac{1}{2} \ 0 \end{pmatrix} \right) + \begin{pmatrix} \frac{1}{2} \ \frac{1}{2} \ 0 \end{pmatrix} $$

変数 説明
$t_x$ オフセットのX成分
$t_y$ オフセットのY成分
$s_x$ スケールのX成分
$s_y$ スケールのY成分
$\theta$ 回転角

LilWireframe

img/LilWireframeSample.gif

カスタム設定項目一覧

項目名 プロパティ名 説明
_WireframeWidth ワイヤフレームの幅(割合).割合なので0.0で非表示,1.0で完全に覆いつくす形になる.
色 / マスク _WireframeMaskAndColor ワイヤフレームの色とマスク.マスクで黒となっている領域はワイワフレームは描画されない.
色相のランダム化 _WireframeRandomizeColor チェックを付けるとワイヤフレームの辺ごとに色相がバラバラになる.
アニメーション周期(秒) _WireframeCycleTime アニメーションの周期.
発光減衰時間(秒) _WireframeDecayTime 1つのワイヤフレーム辺が発光してから消失するまでにかかる時間.Infinityを指定すると表示されたままになる.

1つのワイヤフレーム辺が発光するのは1アニメーション周期につき1回のみです. そのため,アニメーション周期(秒)はワイヤフレームの表示密度に関係するともいえます. 適用対象の3Dモデルのポリゴン数が多いなら長めの周期,短いなら短めの周期にするとよいでしょう.