過去の独りごち/独りごとは こちら
過去のJavaアプレットは こちら

現在、BBSに書き込みキーを設けています。「書き込みキー」欄に、「MYOMOTO」をカギカッコは抜いて、 半角、小文字で 打ち込んで書き込みをしてください。 このキーワードは時々変更されますが、その都度こちらにて報告します。


5/5 流氷を見たことがあるかい


GLSLでノイズ生成とランドスケープ失敗(クリックで動きます)
かなり重いのでVGAカードを積んだデスクトップPCでの実行が好ましいでしょう
左ドラッグで視点の回転、右ドラッグで視点の上下移動、左右両クリックで視点のリセットができます


iq大明神のサイトを見よう見まねで作ってみました。流氷のような何かが出てきます。僕は流氷なんて見たこと……あれ、あったかなぁ、無かったかなあ。自分の人生の記憶すらあやふやです。GWで実家に帰省している間に書いたのですが、モニタが15年以上前に買ったCRT(17インチのブラウン管!)なもので、モニタがボロいのかコードがボロいのか良く分かりませんでした。でも、NUCはこういう時にいいですね。HDMI→VGA変換プラグさえ買えば実家でも自宅でも普通にコーディングやって遊べます。モバイルモニタがあればスタバでも使えますがそこまでの境地には至っておりません。

思えば遥か昔、2001年にSuCaさんの勧めでXFCで発表させていただいた時のネタがランドスケープエンジンだった気がします。当時はハードウェアT&Lがやっと浸透してきて、ピクセルシェーダ・バーテックスシェーダも世に出たばかりという時期でなんとか低ポリゴン低フィルレートでランドスケープの実装を……といういまいち冴えない内容でした。あの時ビンゴ大会で戴いたファミコン互換機は今も実家に大切にしまってあります。

今回のランドスケープはハイトフィールドをデータとして持たず関数で定義しているので、編集する事などは全く考えていないのですが、その代わりにシェーダの本体のコードの他にデータソースを持たずに実行できる上に二次微分可能な曲面です。とりあえず着目している点をp、XZ座標から地面の高さを返す関数をf(x,z)とすると

\[ p.y < f(p.x,p.z) \]

たったのこれだけでランドスケープとの交差判定が出来てしまい、交差判定が出来ればレイマーチング的なアルゴリズムで自動的にレンダリングできてしまうという「昔の苦労は一体なんだったんだ」という状態です。

ノイズ生成については割合上手くいってると思います。雲が変だったりしますが使い方がマズいというだけでノイズ生成自体は宜しいんじゃないかな……今の今までノイズ生成について真面目に考えたことが無かったのでとても勉強になりました。

で、今回は特に説明するようなことも無いのでこれでおしまいです。最初は雲の切れ間から海へと光が差す様子を描きたかったのですが、海面をノイズで生成しておしまいではまともな物にならないので、適当な閾値で切って「はい流氷」とか言って逃げています。海水の色や氷の色の計算はsubsurface scatteringもどきとかやっていたのですが途中で飽きて適当になってしまいました。空もRayleigh/Mie散乱で計算したのですが、空をいい感じにすると地面が明るくなりすぎたり、逆に地面を抑えると空がうす曇りになったりします。今回もアンビエントオクルージョンを切れば地面が真っ白けになりますし……フレアお線香STGだと何も考えてなかったのですがそれなりに良い見た目になっちゃってたしなあ……肝心のノイズ生成も二次微分可能とか言ってドヤってるわりに数値的に微分してて重いし(iq先生のサイトには自動微分による方法がきっちり載っています)そもそも今回の一番のハマりどころは昔書いた自分のひとりごちに書いてあった式に微妙なミスがあった(Rayleigh散乱の係数の式中のcosΘは、正しくはcosΘ^2だった)事だし、全く笑えません。「自分で書くときは原著論文とか引用元を読んだ方がいいよ」って書いてあるから許して!

とりあえずRayleigh/Mie散乱を上手くコントロールする方法を身に着けたり、あるいはもうちょっと制御しやすくて見栄えも良いフォグの掛け方を学んだ方が良いかもしれませんね。iq先生も「制御しやすくてわかりやすい事が勝利だからRayleigh/Mie散乱に拘るな」といった趣旨の事を仰ってますし。僕はロマン主義の考え方も大好きですから真実は必ずしも公理にさかのぼりうるとは限らず、感情や感覚・直観を通じてしか到達し得ない世界には、逃れようもない現実があるのです(wikipediaより)

それにしても、まともなモニタを持ってないことがだんだん辛くなってきてまして、実家のモニタでは太陽の方を向くと空色だけど太陽に背を向けると深緑がかった不吉な暗い青に表示されました。一方で自宅のモニタでは太陽に背を向けて見ても空色だけど太陽の方を見るとほぼ真っ白に近くなったりと違いすぎていけませんでしたから、自宅に戻ってからぼちぼち手直しをしました。ちなみに自宅のモニタも10年以上前に購入したもので、パネルがすっかり劣化して淡い色使いの線画イラストなどですと何が描いてあるのかほとんど分からなかったりしますから、皆さんの環境で見るのとはずいぶん違うかもしれません……いい加減モニタも買い替えたいところですが4Kにするには時期尚早な感がありますし、NUCには荷が重すぎる気もします、かといって今FullHDというのも「それで10年戦えるのか」という思いがありますし、今使ってるモニタは縦の解像度が1200なので、FullHDにすると却って狭くなっちゃうんですねー。




Hayase Taku(SANDMAN)

戻る