Imaginantia

思ったことを書きます

日記 0730

今日はちょっとお外に出て、現実をやって、昨日諦めきれなかったロンスカと戦って、最高になりました。

良い日ですね。とても。

 

あの服セットについてきたキュロットパンツはあれはあれで良いなと思う部分があるものの、まぁロンスカへの憧れが止められなかったので。

boothをいろいろ探してなんとかだいぶ求めているのに近いものを見つけたんです。もちろん幽狐さん用ではないんですけど。

もうやるしかないと思ってBlenderにつっこんで頂点移動とウェイト調節してなんとか。なんとか求めているものが得られました。

最初に被せてみた時点でだいぶぐっと来たので幸せな気持ちでぽちぽち出来たのがよかったですね。

幽狐さんは腰回りがめちゃくちゃしっかりしてるので細めの服をそのまま合わせるのは厳しくて、全体的に膨らませてなんとか。という感じになりました。

ボーン構造がちょっとむずかしい感じになっていて足に綺麗に追従させられてなかったりと微妙な点もあるんですが、まぁ私が動かなければいいし。

実用上なんとかなりそうだったので。よかったー。

元のセットもそれはそれで好きなのでどっちも使うような気はします。最近アバターがいっぱい増えてうれしいやら困るやらです。うれしいです。

 

これねー。ちょっと感動しちゃった。

なんていうかな。ちゃんとファッション的な衣服を着られている現在と、それがこうやって飾られている状況と。

なんだか嬉しくなりました。

周りの人が結構いろんな服着てる中私はあまり変化させてなかった覚えもありましたし。

理由はまぁ求めている服がなかなか無いからなわけですけど、それを色んな方法でなんとか調達している人も居るわけで。

今回そんな気持ちでやってみたら良い感じに「求めている服」に辿り着けたので。嬉しかった。

現実もこうあってほしい。というかこれになりたい。


さて。久々のちゃんとしたおまけを書こうと思います。

Amebientで作った水面を某所に持っていったりなどしてそこそこいい感じに見えてよかったりするわけですが、Amebientの「あの感じ」にはなっていない。

というのも私はあの水をAmebientの為に細かいパラメータ調節しているので、他でそのまま綺麗になるわけはないんです。あの世界のジオメトリにめちゃくちゃ助けられているんです。

つまり、なんのはなしかというと。

一般に、用途が限られれば限られるほど、良いものが出来るという話。

 

まぁマジでこれは一般論で、ノーフリーランチ定理とかもその表現だと思うし、実用的な最適化の原則だと思うし、物を創るときにフルスクラッチをする根源的な理由だと思うので新規性のあるお話ではないんですけど。

Amebientはこれを逆手に取ってめちゃくちゃ用途が限られたシェーダを書いたんです。代表的にはライトシャフトとスクリーンスペースリフレクション (以後SSR) ですね。

どんなワールドでも綺麗に動くように、というのはなかなか幻想で、状況によって重いとかちゃんと描画されないとかいろいろあるわけです。

1つのワールドに対してのみ動くことを願う場合はそういう細かい制御が幾らでも効くので refine し放題なんですね。

例えば前に組んだ SSR はこれだけ見たらどうみても使い物になりません。

でも一般にSSRは横から見れば見るほど綺麗に映ります。だから遠景に最も向いていて、実際今回は100m先しか映さないことを選択することで良い反射を出すことができたわけです。

同様にライトシャフトはビルのジオメトリが固定であることを利用して予めdepthを計算しておくという方法を取っているし、アーティファクト削減の為にビルが「XZ平面に於いて原点を中心に16m,20mの幅を持つこと」を使ったりもしています。

他にもいろいろとキリがなくて、キリがないというのはこれが程度問題であるということで、例えば「水面は上を向いている」とか「太陽の向きが変わらない」とか「鉄塔が300m先に固定で在る」とか。

世界に存在する様々な情報を暗黙のうちに使うことでどうにか見せかけている。そういうものは本当に多いんです。

 

だから、Amebientでごりごりシェーダ書ける機会は本当に良いもので。そういう局所改善 / ad-hoc対応を使った場合にどこまでいけるかを知ることが出来たんです。

元々私はルックを見て調節するのは結構好きだったしよくやっていたので丁度よかったところはあるんですけどね。あとまぁこれが私が汎用的なシェーダを書けない理由ですよね。

汎用的なシェーダというのは、正しいんです、きっと。物理的に正しいとか、なんらかのモデルに従っているとか、いろいろあると思いますけど。

そういう正しさを基にした絵は、めちゃくちゃ正しく映ります。それはとても良いものです。

だけどまぁ正しさを基にしない絵はそれはそれで良いんですよね。Amebientの雨や雷はどこも正しくなんてないと思いますけど、でも「そう感じられる」と思うんです。

そういう「フォトリアリスティックではない方向」を見てみたい気持ちが私には多分あります。そしてそれを細かく表現するのにシェーダ弄りはとても便利なのです。

 

本当に最悪みたいな調節はたくさん入れていて。

col.rgb *= lerp(pow(_Color, lerp(0.3, 1.5, smoothstep(0,20,depth))), 1, exp(-depth*10));
col.rgb = lerp(baseRefr, col.rgb, smoothstep(0, 0.5, groundDepth));
col.rgb *= lerp(1, pow(_Color, 0.1) * 1.25, smoothstep(0, 0.005, depth));
col.rgb = pow(col.rgb, lerp(1, 1.2, pow(smoothstep(100,400,worldDist), 2)));

海のシェーダの一部ですが、これは順に:

  • 通過した水量が多ければ多いほど固定色に近づける (その固定色はちょっとだけその水量に依って変わる)
  • 水面のすぐ下に床がある場合は反射光を弱める
  • 海の境界付近 (柱など) でない部分は固定色を掛けて明るくする
  • 地平線くらいの海色は濃くする

という、端的に言えばお気持ちによる根拠ないコードです。良く言えばアーティスティックな調節。

現実世界の描画結果をそのまま計算できるほどちゃんとしたモデルを使っているわけではないので、それで再現出来ない部分はこうやって手で仕込んであげる必要があると思って。

で、どこまで再現したいかっていうのは場合によりけりだから。ワールド固有のコードを書かざるを得ない。そう思っています。

余談ですが、パラメータとしてどうにか、みたいなのは願いはするもののそうは済まないケースは多くて。曲線が書きたいことがよくあるとおもうんです。 私は良く pow とか exp とか smoothstep を使っているので、その組み合わせを自由に記述することで求める絵を作りたいんですよね…。

…もちろん「汎用シェーダよりも常に良いものが存在するので汎用シェーダの使い道は無い」みたいなことはないですからね。何故ならその「良いもの」は場合によりけりなのですから。

全てに「使える」程度に良いものは、めちゃくちゃ需要があるんです。それはまぁ現在の市場を見ても明らかです。

…でも。その場合をコントロール出来たらどこまで出来るのか、ということについては。今回提示できたのかなと、ちょっと思っています。

 

…言い方を変えると「私の現在の限界」ということでもあるんですけど。しんどいね。

良いもの、つくりたいですね。


さて。今日は…今度こそAmebientの修正かな。今日もちょっと取り組みはしたんですけど求めている結果にはならなかった。

どうやらモクリのボーン構造がちょっと特殊らしい?んですけど持ってないっていう。懐かしいあのぬいぐるみアバターも特殊だった覚えがあったんだけど再現しなかった。まぁ再現しない理由はいろいろ確認したらわかったんでいいんですけど。

ちょっと探ってみる必要がありそう…ってことで今ダウンロードしてみたんですが。関節が2個なんですね…そうだと思った。

アレは「人の指における第一関節 (指先に一番近い方)」を参照しているんですけど、多分関節が2個の場合はそれぞれが第二関節と第三関節に割り当てられるんでしょう。自然だ。

ということでまぁ第一関節が存在しなかったら第二関節を参照するようにしたら正解かな。それでいきましょう。

…ちょっと前に幽狐さんのボーンの向きがアレなせいでUdonギミックが動かなくて悲しいみたいなことを言っていたわけですが、まぁ多少特殊とは言えこうやってバリアになってしまうのは善くないですね…。

テストが出来ないのが一番めんどくさいところなんだけどね。ちゃんとこっち側の想定通り見えているかすらわからないし。

まぁ、何か問題点があったら気軽に言ってほしいのですよ。素直に遊ぶことができないのは最も悲しいので。

…ちょっと重いのは今の所どうしようもないのだけれど。改善の余地はあるけど。

 

はい。では。そんな感じで。

おやすみなさい。