【リソパシェーダー紹介】第5回 コマンドとの連携
リソパシェーダー紹介第5回となる今回の記事ではシェーダーとコマンドとの連携方法に関して紹介しようと思います
前回の記事ではGLSLにて様々な表現が可能である事を紹介しましたが、これにより設定した数値と連動する形で画面表示を変えていくことが可能になりました
マイクラにおいては、コマンドから設定した数値でリソパシェーダーのGLSL(json→vsh→fsh)を実行することで、画面表示を変えていくことが可能になったという訳です。
jsonから変数を設定する
リソパシェーダー上ではjsonにてシェーダーの処理で読み込む変数を設定することが可能です
attributesでinから読み込める変数を、
samplersとuniformsでuniformから読み込める変数を設定できます
△読み込みは attributes → in、 uniforms, samplers → uniform
例えば、目立った変数としては以下のようなものが設定されています
IViewRotMat:プレイヤーの視線回転
FogColor:霧の色合い
Sampler:読み込んだフォントやテクスチャの画像情報
ColorModulator:表示用に設定された色情報
ScreenSize:画面のピクセルサイズ
GameTime:時間情報
上記以外にも多くの変数が用意されています
以下のリンク先に、リソパシェーダーで使われている変数がまとめられています
英語wiki:https://github.com/McTsts/Minecraft-Shaders-Wiki/blob/main/Uniforms.md
日本語wiki(※準備中):https://github.com/MCJE-Tech-Community/Resourcepack-Wiki/wiki
これらの変数の設定(jsonファイル)とGLSLの記述(vsh,fshファイル)によって頂点の位置、ピクセルの色が決まり、最終的な画面の出力が決定します
つまりjsonファイルで設定した変数をコマンドから変えることができれば、シェーダーの表示をコマンドで切り替えることが可能になるとも言えます。
coreシェーダーとpostシェーダー
全体の処理を見直すと、リソパシェーダーではcoreシェーダー→postシェーダーの順に処理が実行されているのが分かりますが
これはcoreシェーダーにて読み込んだ変数を、postシェーダーへ持ち越せるという事でもあります
ただし、変数の受け渡しの際には画面への描画を一旦挟む形になるので少々厄介です
もしもcoreシェーダーのみで処理が完結できる場合にはそれに越したことはないです
それぞれの特徴を見直すと以下の通りとなります
<Coreシェーダー>
各要素の頂点位置や、要素を限定させた表示の変更が可能
<Postシェーダー>
画面状態の保存や読み込みができ、coreシェーダーから変数の持ち越しも可能
コマンドとの連携手段
以上を踏まえた上で、コマンドと連携する際のシェーダーの選択肢としては以下のものが存在します
<Coreシェーダー>
・視線回転式
プレイヤーの視線回転情報をIViewRotMatとして読み込みます
これを使用している間はプレイヤーの視線について制御された状態になってしまいますが
tpコマンドから回転情報をシェーダーへ受け渡すことが可能となります。
(コマンド:tp → 変数:IViewRotMat)
・バイオーム式
少し癖がありますが、ディメンションから設定したバイオームのFogColorをシェーダーへ変数として受け渡します
コマンドから実行するというよりは、プレイヤーの位置によって実行されるような物となります
biomeコマンドを使用する事で、動的に変えさせる事も可能です。
(コマンド:biome → 変数:FogColor)
・エフェクト式
effectコマンドなどでプレイヤーにエフェクト効果が掛かった際の画面効果をシェーダー側で検知します
例えば盲目によるFogColorや、速度上昇の画角変化によるProjMatの値の変化を読み取ります
ただし、画面効果の競合や、プレイヤーの設定変更による意図しない画面変化など不安定要素もあります。
(コマンド:effect → 変数:FogColor, ProjMat)
・タイトル式
プレイヤーへtitleコマンドを実行し、表示されたカスタムフォントや色を変数としてシェーダーへ受け渡します
マクロを用いればあらゆる色を変数として使用することができます
安定性や実用性は抜群で、演出に使うのにはもってこいです。
(ただしcoreシェーダーとしては頂点を弄れないのが少し残念)
(コマンド:title → 変数:Sampler, Color)
<Postシェーダー>
・アウトライン式
Glowingなどによる発光のアウトラインとその色を変数としてシェーダーへ受け渡します
主に、発光したエンティティをsummonコマンドで召喚してプレイヤーに見せることで実行させます
またdisplay系エンティティを用いればあらゆる色を変数として使うことができます。
(コマンド:summon → 変数:ColorModulator)
・transparency式
実質的にあらゆる手段で変数を読み込める万能シェーダーです、主にparticleコマンド等を使用します
画面状態の読み込みや保存など、あらゆることが可能であるため、特殊な演出などを行うことが可能です
ただし、使用するためにプレイヤーへ予め設定を強要する必要があるため、実用性は皆無に等しいです。
(コマンド:particle等 → 変数:ColorModulator等)
まとめると以下の通りとなります
以上より、コマンドと連携可能な実用性があるシェーダーとしては
・タイトル式coreシェーダー
・アウトライン式postシェーダー
の2つが個人的には挙げられると思います。
次回の記事では、これまでの内容を踏まえて、実際にコマンドからリソパシェーダーを実行してみた例や
先人たちが既に作られて公開されている様々なリソパシェーダーについて紹介していこうと思います。
つづく
リソパシェーダーに関する質問など以下のDiscordサーバーにて受付けています