バニラのデータの素材を使用して魔法を作り始めて半年…長い間、設定項目の多さからか、敬遠しつづけてきた『EffectShader』に挑戦してみました!
その結果……「もっと早く取り組んでおけばよかった!!」…魔法づくりの新たな可能性が開花しました。
wikiの解説に日本語が無く、項目が多いために変更箇所がEffectのどういったところに反映されるのかが分かりづらかったので、試行錯誤しながら…ある程度、こうなのかな?と分かってきた部分をまとめておこうと思います。
先日製作したアシスの同胞団専用PerkのCloak魔法ですが、元にするパワー『先人の憤怒』が身体から燃え上がるエフェクトは、〇〇のマントのnifファイル(アニメーション付き)の仕組みとは異なり、驚くべきことに…全て『EffectShader』のみを活用して表現されていました!アニメーションではないけれど、「テクスチャファイルの加工や出し方、色と陰影の調整」によってメラメラと燃えているように見せていたのです!!
新規のEffectShaderを作成できるようになれば…もっと色々な表現が可能になりそうです。そこで今回は、製作過程を振り返りながら…『EffectShader』の有効的な利用方法について探って行こうと思います。
【EffectShaderとは?】
MagicEffectに設定できるエフェクトの項目の一つです。魔法が命中したときに設定したEffectが現れます。Hit ShaderはSpellを使用したときに現れるエフェクト、Enchant Shaderは付呪された武器に描かれるエフェクトを表しているようです。炎ダメージを受けたときにしばらく炎上する様子や、エンチャント付きの武器の表面にキラキラとした色のついた光が出ているのも、この効果によるものらしいです。
【EffectShaderの設定画面】
先人の憤怒に設定されているHit Shaderを複製しIDを以下のものに変更しました。「aaaFRKDarkElfAncestorsWrathFXShader」を探して、EffectShaderの画面を開いてみると―――「うわ…コレは無理だ…。」というのが第一印象でした。
EffectShaderは『Membrane』と『Particle』という項目群に分けられています。先人の憤怒のCloak効果は、主に画面右のParticleの項目の設定が中心なので…今回はそちらを詳細に見ていくことにし、画面左のMembraneについては後でまとめようと思います。
【EffectShaderの役割】
2つの大まかな役割についてですが、『Membrane』はメッシュの表面上に描かれるエフェクト、『Particle』は表面から立ち昇るエフェクトを表しているようです。
個人的には以下の図のようなイメージを持っています。
Meshはオブジェクトの形を決めるもの。TextureはMeshに色と質感を与えるもの。EffectShaderのMembraneは、Textureの貼られたMesh上にさらに色と陰影を与えるもの。Perticleは、Meshの表面から放出される粒子の単位。
MembraneのColorが「オレンジ色」を設定しているので、パワー発動中はオレンジ色のオーラ(陰影)が付くようになっています(黒にすれば消失する)。Perticleは粒子の単位であり、銀魔法の製作の時に、『一つのddsファイルには見えない区画がある』と推測していましたが、区画にごとに区切ったものが実はPerticle(?)の可能性があり、Objectから秒単位で設定した数の粒子を放出させることで、炎や煙が立ち上る様子を描写することができるようです。また、MembraneとParticleは下に貼られているTextureの色を完全に上書きして見えなくならないように、ソースとなるddsファイルとShaderによって編集する情報の『※Alpha値(透過情報)』を上手くブレンドすることによって、視覚的な表現に幅を持たせているようです。
※画像処理に関する専門的な知識が無いので「加算」、「減算」などのAlpha値に関する設定があまりよく分かりませんでした。赤青緑
のライトを重ねて照らすと…「加算」なら白に近づき、「減算」なら黒に近づく…とか、勝手に想像しています。この辺りは既存の設定と見比べて推測し、試行錯誤でなんとかするしかなさそうです…(汗)
工夫次第で、Membraneでは透過性を活かして霊体を模したり、透過性を打ち消して肌や防具を不透明に染めることができます(例:オークのパワー・狂戦士の血しぶき、氷雪を受けたときの霜)。
Particleでは視界が見えなくなるほどの煙や泡、大量のガスなども表現できそうです(例:煙、炎上、魔法によって身体から出るオーラ状のものは、大抵こちら。画像の様子は、カイウス指揮官の頭にマダナックの弟子のシャウト「銀粉(ぎんぷん)」がヒットした時の様子です。)
【EffectShaderを使用するメリット】
鎧の“肩の部分だけ”などといった、局所的な部位の選択まではできませんが、上述のように…すでに完成された魔法やオブジェクト全体の色を変えるなどの応用もできるみたいです。また、魔法をデザインする際にEffectShaderの機能によって、一つのddsファイルから多用なエフェクトを生み出すことができます。例えば、あるエフェクトの色を赤から青へ変えたいと思った時に、BSABrowserで該当するファイルを抜き出し、GIMPやPhotoshopで着色処理するのではなく、CK上のEffectShaderを利用して行える場合もあります。なるべくEffectShaderで調整し、バニラのデータの素材を組み合せて使い回すことで…新たなddsファイルを用意する必要が無くなり、製作するmodの容量を削減することができます(1ファイルあたり100~300kb)。
ただし、メッシュ自体が動きを持っている物(例:吸収魔法の身体に追従するモヤ、ミサイル系魔法の発射体など)の色を変えたい場合は、EffectShaderからは行えないかもしれません(おそらく、Hit Effect ArtやEnchant Art)。そちらは、該当するnifファイルを探し、NifSkopeで開き、各部位に指定されているShaderの色を改変したddsファイルに置き換えて指定する必要があります。Art系の色変更は、魅力的ですが…たくさん作ると結構…容量が増えます。
【Particle Shaderの各項目】
「どこを変えれば、どんな変化をするのか?」、この記事の重要な部分です。
青枠のところが例のあまり分からない『アルファ値』の設定です。CKwikiから引用すると…
典型的なデフォルトのようなエフェクトを作りたい時は、
Source Brend Mode:Source Alpha、Dest Brend Mode:Source Inverted Alpha、Brend Operation:Add
明るいエフェクトを作りたい時は、
Source Brend Mode:One、Dest Brend Mode:One、Brend Operation:Add
既存のテクスチャの上から変調したい時は、
Source Brend Mode:Dest Color、Dest Brend Mode:Zero、Brend Operation:Add
のように変えると良いみたいです。
ZTestは、デフォルトではNormalになっています。壁を貫通してエフェクトが見えるような特殊なものを作成する時に設定するようです。(例:生命探知のエフェクト)
<各項目の機能>
⓪Particle Shaderのチェックボックス。 ON/OFFの切り替え。
①Texutreには、エフェクトの模様を決めるテクスチャ(ddsファイル)を指定する。炎、煙、泡、光弾、結晶などのParticleの形の元になる画像。
②Texture Countは、おそらく「一枚のテクスチャファイルをどのように分割するか」を示している。水平方向の面数(U)と、垂直方向の面数(V)。分割された一つの面がParticleになる模様。
例:「FXFireAtlas02.dds」には、よく見ると炎の模様が「横4×縦2=合計8つ」描かれているため、U=4、V=2とするのが適切。下図は、U=1、V=1にした時との比較。一枚のテクスチャがそのままParticleになるので、炎が細かくなる。
③Palette Textureは、①のテクスチャにさらに別のテクスチャ(グラデーション)を上乗せするための項目。
④GrayScaleToPaletteは、Colorにチェックするとddsファイルの「色を除く役割」で、Alphaにチェックすると「アルファ値を除く役割」。
Colorのみにチェックを入れると…オレンジの反対色「青紫色」に変わるようです。
Alphaにチェックを入れると…模様と陰影のない四角になるようです。(試してみると…Particleの現れ方が見えて面白い!)色々な角度から見ると…Particleは平面ではなく…キューブ状の形として現れることが分かりました。(六面がきちんと分割されたテクスチャによってカバーされているのかも)
⑤Particle Birth Ramp Up Timeは、「最大(Full)粒子数に到達するまでの時間」。
⑥Full Particle Birth Timeは、「最大粒子数に到達してからの継続時間」。最も発光が強くなる。
⑦Particle Birth Ramp Downは、「最大粒子数から持続(Persistent)粒子数になるまでの時間」。
例:今回の設定におけるPerticle(粒子)の挙動
⑤で0.25秒間かけて光がだんだん強くなり最大に到達→⑥粒子が1秒の間、最も光り輝く→⑦光が2秒間かけて弱まっていき、持続的な火力を維持するステージへ移行する。
Particle Countは、「一度の処理で、79個の粒子を放出できる」ように定義されている。(←処理の速さなどの指標?意味が違うかもしれませんが…)
⑧Full Particle Birth Countは、「発生する粒子の最大数」を決定する。
元の値15を5倍、10倍にした時のエフェクトの変化。ものすごい勢いで炎が吹き上がった。だが…一瞬だけカッと出たあと、時間が経つと普通の量になった。(⑥で設定する秒数に依存する。現在の設定だと1秒で終了するため。)
⑨Persistent Particle Birth Countは、「持続的な粒子数」を決めているらしい。(⑦のステージが2秒で終了した後、粒子の放出量はこの割合に落ち着く。例えば⑧の値が150、⑨の値が15の時は…先程の画像右のような状態から画像左の状態のように火力が弱まっていく変化を描ける。)
⑩Scene Graph Emit Depth Limitは、「シーングラフに基づく放出深度の制限?」……理解不能の項目。
⑪Particle Lifetimeは、「粒子の寿命」。粒子が放出されてから消えるまでの秒数。前の粒子寿命が尽きないと後の粒子が出てこないので、大きな値にすると粒子がポツリポツリ出る感じになり、出は悪くなる。それぞれの粒子が規則的すぎても不自然なようなので、バラつきを持たせるために+/-が用意されている。(Lifetimeを0.45→4.5にすると…粒子が消えるまでの時間が10倍長くなるため、出現した場所からより遠くまで移動した後に消える。)
⑫Birth Potision Offsetは、「粒子が発生する基準点からの距離」……理解不能だったけれど、検証で役割が判明。値を0→100にすると…画像左のようにアクターを中心として球状に炎が広がった(⑧の値を75にして少し火力を出しました)。Offset Rangeを0→100にすると…画像右のように炎の発生場所が球状ではなくなり、バラつきが生じる。おそらく、Lifetimeの+/-と同じような役割。
⑬Initial Speed Along Normalは、「法線初速度」。
⑭Acceleration Along Normalは、「法線加速度」。正の値は加速、負の値は減速。
※数学の知識がいるようで…正直さっぱり分かりません…。影響を観察していると、100くらいの値すると身体から離れて拡散するようになりました。例えるなら…ガスバーナーのガス量は変えずに空気量を増やした時…火の勢いが強くなるような感じと似ています(元気な火になる)。
「先人の憤怒」は、Object(魔法をキャストする人)から比較的近い位置で粒子が動く設定であったため、速度の変化を感じにくい気がします。ドラゴンなどの壮大な規模のエフェクトを作成する時にこの差異が重要になるのかもしれません。体感的にですが、時間を一定に決めて測った時に…⑪のLifetimeによって消失するまでに速度を得られる分、⑬の初速度が大きければ大きいほど、粒子がより遠くまで飛んでいき、⑭の加速度が大きければ大きいほど粒子が素早く(勢いよく)飛んでいくと予想しています。→もし本当にそうなら、この項目は⑤~⑦や⑪のTimeとの関係を考慮してどのあたりまで飛ばすかを設定する必要が出てくるかもしれません。
⑮Initial Velocity XYZは、「XYZ軸方向へ移動する際の初速度」。カッコ内の値を(+/-)とすると…X(前/後)、Y(左/右)、Z(上/下)。X:100、Y:-100、Z:100に設定した場合、画像のように「身体の前方かつアクターから見て右方向」へ炎の流れが変化する。
⑯Acceleration XYZは、「XYZ軸方向へ移動する際の加速度」。上述の⑭の影響の仕方に非常に良く似ている。
※火の流れを徐々に変化させるのに必要な項目の可能性があります。最初に右方向へ勢いよく燃えていた火が、時間経過とともに左方向へ勢いが強まって…あたかも風になびいている様子を描けたりするのかも?!
⑰Initial Rotationは、「初期回転」。⑱Rotation Speedは、「回転速度」。
※これらの項目はParticleの回転に関わるものだと思います。炎のエフェクトでは違いが分かりにくかったため、ハッキリとは断定できませんが…テクスチャファイル(dds)のみで表現するEffectShaderは、メッシュファイル(nif)のEffectArtとは異なり、時々ある角度から平べったい感じに見えてしまうことがあります。「ヒラヒラの物を回転させると立体的に見える現象」のように、Particleに回転を与えることで、テクスチャ感を打ち消してナチュラルな炎に見せることができるかもしれません。今後、別のエフェクトで確認していこうと思います。
⑲Scale Key 1は、「Particleの大きさ」を表し、サイズ0から指定した大きさに近づいていく。Timeは、「それに何秒かかるか」。Scale Key 2も同様。
※Particleは…“ある座標”の場所(発生点)を起点とし、0(=見えないくらい小さいので、事実上そこから出現したように見える)の大きさからKey1の大きさへTime(※※割合)かけて拡大していき、続けてKey1が発生した“ある座標”を起点とし、再び0の大きさからKey2で設定した大きさへTimeかけて拡大する。⇒これで1ループと推測しています。
※※Timeは秒単位ではなく、0~1の『寿命の割合』を示しているようです。⑪LifeTimeで設定したものと混同してしまわないように注意が必要ですが、ここでも粒子の寿命が定義されています。
Scaleを大きくすると、ParticleのCount(数)を大きくした時とは変化の仕方が異なり、より強力に明るくなる印象。炎で例えると…一粒のParticleを見たときに内炎(白色に近く、明度が高い)の割合が外炎(色が付いており、暗度が高い)よりも大きいからだと考えられる。また、Scaleが大きすぎると…Particle同士が『重なり合って』しまい、外炎を内炎の明るさが打ち消してしまうので、全体としてのエフェクトの形がぼやける問題が起こる(“柔らかな炎”を表現したい場合などはこちらの方が良さそう)。あまり目立たないけれど…Scaleを大きくすると引き延ばす分、Countで増やす場合よりもエフェクトが荒くなる気もする。
Scale Keyの役割は粒子の大きさを変えるだけでなく、以下のような応用もできる。
Key1<Key2の場合…『炎を放出する』エフェクトになる。
Key1>Key2の場合…『炎を吸収する』エフェクトになる。
…工夫次第で、アクターの身体から“炎が出ている”のではなく、身体に“炎が吸い込まれていく”ような印象のエフェクトも作ることができて、とても不思議!!
⑳Explosion Wind Speed
これも⑮、⑯と同様に炎の位置が変わり、「放出されたParticleが風でなびいている」ようにすることができるものだが、こちらはアクター基準ではなく、『ロケーション基準』になっている気がする…。+の値は西風(東になびく)、-の値は東風(西になびく)。
例:Wind Speed=-100の時、アクターが向いている方角が北の場合、東風を受けてエフェクトが身体の右から左へなびく。南を向けば逆に身体の左から右へなびく。西を向けば追い風を受けているように身体の前方になびき、東を向けば向かい風を受けて身体の後方へなびく。
…というように、⑮、⑯とは違って…「アクターの正面方向を基準とした位置」になびかないようになっている。向いている方角に関わらず、常に一定の方向にParticleを移動させることで、プレイヤーに(実際には風は存在しないが)ある方向から吹く『風』の存在を錯覚させるために設定する項目だと考えられる。
㉑Color Scaleは、「色の強度」。テクスチャに対して上乗せする強度を決めている。値を大きくすると、Color Keyで指定した各色が強く出るようになる。
㉒Color keyは、テクスチャに上乗せしたい色を指定する。Color AlphaはParticleのアルファ量。Color Key Timeは指定した色やアルファが発生する時間。
※好みのColorを選択し、CKの設定値とスカイリム上の見え方を比べながら調整しています。
<エフェクトの色作り>
アシスのCloak魔法は「先人の憤怒」を元にして作りましたが、元々はオレンジ色だった炎のエフェクトを「青白色」に変更しました。実際に行った手順を振り返ってみたいと思います。
この記事の最初の方に出てきた『青枠のアルファ値の設定』は“明るい色のエフェクトにしたい時”の方法に近いです。たぶん、指定したテクスチャファイルの色合いを活かしながら、Color Keyによって明るくする処理を施しています。④GrayScaleToPaletteのColorにチェックを入れると、元々のオレンジの反対色になることを利用して「薄青色」にしました。…一つ目完成です。
今度は元々の色を塗りつぶして、Color Keyで自分の好きな色にしてみようと思います。
Color ScaleとColor Alphaを大きくして、Particleが色濃く描写されるようにしました。Color Key Timeの調整についてはあまり良く分かっていないのですが…一応、LifeTime(Particleの寿命)以下になるように設定しておきました(値が大きいとColorが反映されなくなったため)。また、Key Timeが0に近いほど身体の近くにParticleが集中するような気がします(Key Timeが大きいと走った時などにParticleの追従が遅くなる=身体からより離れた位置)。上記の設定だと、全身の炎のベースが青色で、ポツポツ…と身体により近い部分で、タイミングがずれるようにオレンジ色の火が出てくるようなエフェクトになりました。
デフォルトと、自作エフェクト2つとの比較です。
動いているところを見ると画像とはだいぶ印象が変わってきますが…“ボボボ!と激しく音を立てて燃える炎”と“メラメラと静かに燃え伝う炎”というような、性質が全く違う炎エフェクトになりました。太陽の下と洞窟の中ではエフェクトの見え方にかなり差が生じるので、どちらの環境でも確認した方が良いと思います。きちんと色が付いているように見えても、他の光が加わった時に、見栄えが変わってしまう場合もあります。(Grayscaleのエフェクトは日に照らされるとほぼ白色に見えます。)
最後に…㉕Ambient Sound、「環境音」を設定。エフェクトが現れたときに鳴る音です。自分が発動するマントの方にこれを付けておくと最初の一回しか鳴りませんが、Dmgの方に付けると敵がマントに触れて炎上するたびに音が鳴るようになります。
㉖~㉝の項目は、これまでの製作で使用した経験がないので…今後、新たなEffectShaderを作成していく中で使用する必要に迫られたら、記事を加筆していこうと思います!今回の記事は、まだまだ筆者自身も…かなり不明な事が多い内容ばかりですので…もし、ブログに来て下さった方の中に、使い方をご存知の方がいらっしゃいましたら、教えていただけると大変ありがたいです…(^^;)