Heliodor 2021/07/23 12:45

少しだけ詳しく水たまりプログラム説明 その6

最近ちょっといいことから悲しいことまで、色々あって更に暑さでグッタリしていました、ヘリオドールです(挨拶)。



というワケで少しだけ詳しく水たまりプログラム説明 その5の続きです。
とうとう最終回です。無駄に長かった。


前回の記事でピクセルシェーダーに手を出して世界が変わったわけですが、ここで念願だったス〇ラトゥーンもどきをやってみます。
とりあえずプレイヤーが歩いた後にバシャバシャと液体がばらまかれるわけですが、きちんと水の飛び散りを計算して……とか面倒なことはやらずに、テクスチャでごまかします。


こんなテクスチャを用意しまして、プレイヤーが移動するごとにランダムで1枚のしぶきを、ランダム角度、ランダムサイズでマスクテクスチャに書きこみます。

マスクテクスチャとは、水深をグレースケールで表した画像で、これによって水のある場所と無い場所を表すことができます。
1.0(白)ならば水がある、0.0(黒)ならば水が無いといった具合です。

これは、波の高さに対する乗算マスクと考えてもかまいません。計算の結果波が高くなったとしても、水深 0.0 で乗算すると波の高さも 0.0 になるので、それ以上外側に波が広がらなくなる、という理屈です。


で、とりえあずどんなマスクテクスチャができるかといいますとこんな感じです。
※動画が横長なので全画面表示推奨

ちなみに左上のテクスチャーが無加工のマスクで、左下はところどころぼかす処理を入れたものです。

場所によってが輪郭のハッキリしていたり、ぼやけていたりしていますね。
これは適当な2次元のパーリンノイズを参照して、ノイズの白の部分だけをぼかす みたいにしてやっています。


パーリンノイズというのはこういうヤツです。CGツールでよくある雲模様ですね。

ちなみにこの画像を生成するのには stb_perlin.h にお世話になりました。
https://github.com/nothings/stb/blob/master/stb_perlin.h





……で、あやかし紅白戦では使う予定はありませんが、ここまできたら色も変えられるようにしたいですよね。将来気が変わって使うかもしれんし。

というわけで、プレイヤーの状態に応じて異なる色の液体をばらまくようにしてみました

無理矢理1つの画面に収めたので見にくいのですが、左側にある3個のテクスチャの一番上が色選択用のテクスチャです。
色の違いは波の計算には一切影響せず、描画するときにだけ利用する感じです。


この色用テクスチャにも1フレームごとにシェーダーを適用していて、だんだん隣接する色と混ざりあうようにしています。

まあたくさん混ざるとどんどん黒くなっていって汚くなるのですが……望まない形でリアルな挙動になりましたね。



真ん中のテクスチャーは水として計算する領域を表しています(この記事の最初の方で既出のヤツです)

で、一番下のテクスチャーが波の計算結果です。
Rチャンネルが水面の高さ、
Gチャンネルが水面の速度(上昇または下降)、
Bチャンネルが水面の傾き(X方向、Y方向の傾きの平均値)を表しています




正直、一番最初に考えていたモノよりもずっとそれっぽいモノができた気がします。


リアルタイムでこんなに白濁液まみれになるゲームって結構珍しいんじゃないかな?と満足しています。……まあ探せばありそうな気もしますがw

1件のチップが贈られています

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索