SEUS PTGIで任意のブロックを光源にしたり、不透過にしたりする
SEUS PTGIはレイトレーシング(パストレーシング)を用いた影MODです。以前は支援者向けに配布していましたが、今はだれでも無料でダウンロードすることができます。
光源に対して光が遮られる場所に影ができたり、周りのブロックに反射した光が描写されたりします。すごい。きれい。
ただ一方で、光源の処理が特殊なために従来のシェーダーとは少し勝手が違います。
1つ目の問題点は、明るさを持つブロックをそのまま置いても光ってくれないことがあることです。ビーコンやエンドロッドはそのままだと光らないままです。MODで追加したブロックも光りません。
2つ目の問題点は、MODで追加したブロックが光を透過することです。
光源が光らない問題は、バージョン1.14以降(多分)ではシェーダーのファイル内にあるblock.propertiesファイルをいじることで解決できます。わかりやすく解説している動画Youtubeにありましたので、そちらが参考になると思います。ありがたい。
redditでの記事を見るに同様の方法でMODのブロックも対応できるようです。
MODのブロックが透過してしまう問題も、block.propertiesの透過しないブロックのところに加筆すれば解決できると思います(多分)。
問題はそれより前のバージョン、1.12とかでは、この方法では対応できないということです。ということでソースコードをいじります。この手の改造はあくまで自己責任で行うものということには留意してください。
シェーダーは記事執筆時での最新版であるSEUS PTGI HRR Test 2.1を使います。
1つ目の問題点を解決するには、まずgbuffers_terrain.vshを開きます。一番下まで行きます。
if(mc_Entity.x==133)
materialIDs=MAT_ID_GLOWSTONE;
と書かれていますが、これはブロックIDが133のブロック(エメラルドブロック)を光らせる処理です。SEUS PTGIではエメラルドブロックが光るように設定されています。
同じように
if(mc_Entity.x==56)
materialIDs=MAT_ID_GLOWSTONE;
というのを追加してみましょう。ブロックIDが56のブロック(ダイヤモンドブロック)を光らせることができます。
この状態でシェーダーを読み込むと、
ダイヤモンドブロックは光りますが、影ができます。周りのブロックへの光の反射もありません。
次にshadow.vshを開きます。一番下まで行きます。
vMaterialIDs=mc_Entity.x-255.+39.;
の下に
if(mc_Entity.x==56)
vMaterialIDs=31.;
を書きます。
シェーダーを読み込むと、
しっかり光るようになりました!!
同様の処理を増やしていけば、好きなブロックを光らせることができます。ブロックIDが4096以上のブロックも問題なく対応できました。
ブロックIDを調べるにはworldeditを導入したのち、アイテムをもって//infoってコマンドをうち、そのアイテムで調べたいブロックを右クリックすると表示されます。ただ自分の環境ではブロックIDが4096以上のブロックに対して右クリックすると、表示してくれませんでした。どなたか、マイクラ内で4096以上のブロックIDを調べる簡単な方法を教えてください…。
話を本筋に戻すと、ブロックの光らせ方は何種類かあります。materialIDsはMAT_ID_GLOWSTONE、MAT_ID_TORCHのいずれかにすると光ります(MAT_ID_LAVAも光りますが、違いがよくわからない)。またvMaterialIDsは31か241で光ります。下の画像で違いがわかるかと思います。
もともとのソースコードではブロックで光るものにMAT_ID_GLOWSTONE、31を割り当て、松明にMAT_ID_TORCH、241を割り当てていました。ブロックを光らせたいときには前者、松明のような小さい物を光らせたいときは後者にするといいと思います。
さて、2つ目の問題点であった、MODで追加したブロックが光を透過してしまう問題を解決します。shadow.vshを開いて、先ほどの
vMaterialIDs=mc_Entity.x-255.+39.;
を
vMaterialIDs=30.;
にします。
すると
ちゃんと不透過になっています。左の光源はMODで追加したブロックに、右の光源はクォーツブロックで取り囲まれています。
しかし、この方法だとMODで追加したブロックがすべて不透過になります。光を透過させたいブロックは個別に
if(mc_Entity.x==(透過させたいブロックのブロックID))
vMaterialIDs=1.;
を追加してください。色付きガラスのようにしたい場合はvMaterialIDsを240にしてください(1と240の違いはわかりませんが…)。
なおハーフブロックとかを置くと影が変なところにでますが、これはバージョンが古いために起きます。少なくと1.16.5では起きませんでした。初めて1.12.2の古さを痛感しました…。
追記
書いた後にマイクラしながら感じましたが、建築するのが基本昼間で、太陽光は通常のシェーダーと同様に処理されるので、わざわざシェーダーをいじる必要はあまりないのかなって…。むしろ太陽光の影の処理が変になっちゃうのでしないほうがいいと思います。夜間や室内で光源の処理を生かしたスクリーンショットをとるくらいには使えるはずなので、そうしていただければ幸いです。
(2021/9/23)
ハーフブロックの影が変になる現象ですが、シェーダーのオプション設定/Raytracing Options/Geometry Trace Qualityを0にすると多少は軽減されます。
もっともこれでもやっぱりおかしなことにはなっていて、
ハーフブロックをたくさん並べると上のようになります。
また、シェーダーのオプション設定/Raytracing Options/Screen-Space GI TracingをONにした状態で小さなブロックなどにvMaterialIDs=256.;とかを設定すると
それっぽい影がつきます。
補足ですが、MODで追加したブロックをまとめて
vMaterialIDs=mc_Entity.x-255.+39.;
を
vMaterialIDs=30.;
とするよりかは、一つ一つのブロックIDを指定してあれこれしたほうがいい気がします。
また、同じMODの構成であってもワールドごとにブロックとブロックIDの対応関係が異なることがあり(各々のセーブデータのlevel.dat内に記載されている)、それにあわせてシェーダーを改変することになります。一連の流れを自動化するならForgeUtilsでextrablocks.jsonを作って、それのデータを参照してしかるべきソースコードを出力するものを作ることになると思います。ForgeUtilsに関しては以下の記事をご覧下さい。
(2021/10/20)