イルベロ新作の情報が更新されたので、YouTube をチェックしてみよう:

寝る前に個人的に好きな戸愚呂弟の名言集 - YouTubeだけ聴いて寝る。

7:05 起床。納豆と米を食う。出勤。

7:45 現場。今日は珍しい第五木曜日なのでゴミ出しがない。分別のみ。 裏庭のネコフンを片付けたり、館内階段の床のイボを擦り落としたりして時間をつぶす。

10:00 清掃終了。撤収。

イトーヨーカドー曳舟店。体温チェックと手洗い。

10:30 曳舟の部屋に戻る。洗濯機を回す。PC を開いて今月の報告書を執筆する。

10:55 執筆終了。PDF に変換して USB 棒に保存。あとでコンビニに行って紙に印刷する。

11:00 洗濯物を干す。インターネットをチェック。回線が遅い。明日一瞬速くなるが。

11:45 おやつ休憩。ひどい空腹だ。

  • WebGL2 Fog
    • 霧の色と素材の色の内分点を取るのが基本的な考え方。GLSL の関数 mix による。 したがって、霧の量をどう決定するかがキモになる。 カメラから頂点までの距離のような値がいい。
    • ある範囲内の頂点だけの色を変えたいのに smoothstep 関数がお誂え向きだ。 この関数で霧の量を与えることにする。
    • 霧の効果を明らかにするべく、シーンにオブジェクトをたくさん描く。
    • 霧の色と背景色を一致させるのが常識的だ。
    • 最初の例ではカメラから頂点までの距離ではなく、奥行きの距離を使ったため、 オブジェクトをカメラから環状に離れた場所で回転させるときの描画が不自然だった。
    • 霧の量を距離の平方に比例したものに変える。smoothstep をやめて指数関数を導入する。 ただし、この公式は適用範囲という考え方を捨てていることに注意。
    • 他にも、断片シェーダーで gl_FragCoord.z を参照する手法がある。この手法は安くつく。
  • 【野試合】ときめきメモリアル対戦ぱずるだま 2021/09/29 - YouTube: 音だけ聞いている。

12:40 霧 Ver. 1 実装終了。ぱずるだまの戦闘回数、100 でゼロに戻るのか。 この後福祉事務所に行くので早めに昼寝しておく。

15:15 起床。傘ありで外出。 水戸街道に出てユトリロ前のバス停から乗車。本所吾妻橋駅前で降りる。歩いてコンビニへ。

16:00 セブンイレブン墨田吾妻橋一丁目店。30 円。業務報告書の印刷と就労活動報告書テンプレのコピー。

そのまま徒歩で区役所へ。一階で今月分の就労活動報告書の残りを記載、押印。 朱肉は持参しているのだが、ここでこれを持ち物から取り出すと役所のをパクっているように見えるかもしれない。

福祉事務所のフロアに移動。窓口でペラ一枚を提出。担当 I 氏は呼び出さないで逃げる。 仕事が見つからない言い訳がたいへんだからな。

外へ出ると雨が降ってくる。浅草通りのバス停に移動。次のバスで錦糸町駅行きに乗れる。 錦糸公園前で降りる。

16:45 オリナス錦糸町二階ベンチ。携帯電話で時間をつぶす。ちとヒマになる。

17:45 タイトー F ステーションオリナス錦糸町店。ビートマニアコーナー。 MIKAMO プロがダブルプレイで ARENA モードをやっている。かぶりつきで左手の動きを観察したいものだ。 しかし欲張らずに遠目で眺めるのがいいだろう。

18:00 MJ プロ卓東風戦 4 クレ。門前でテンパイしたら、点棒が惜しくない状況でならすべてリーチをかけてみる。 その結果、わりとバランスが取れたようだ?

【SCORE】
合計SCORE:+51.3

【最終段位】
四人打ち段位:十段 経験値:-22.7

【9/30の最新8試合の履歴】
1st|*--*---*
2nd|-----**-
3rd|--------
4th|-**-*---
old         new

【順位】
1位回数:3(37.50%)
2位回数:2(25.00%)
3位回数:0(0.00%)
4位回数:3(37.50%)
平均順位:2.38

プレイ局数:37局

【打ち筋】
アガリ率:29.73%(11/37)
平均アガリ翻:3.82翻
平均アガリ巡目:10.18巡
振込み率:18.92%(7/37)

【9/30の最高役】
・跳満
・跳満

今月はプロ卓から追放されなくて済んだが、時間の問題だろう。

余ったクレジットでビートマニア段位認定六段。レベル 8 はもう難しい。

19:50 カスミオリナス錦糸町店。442 円。クーポンゲット。

  • 生姜焼き丼
  • ブラックチョコ (2)
  • ライス

20:20 ビッグエー墨田業平店。324 円。

  • 絹豆腐 (2)
  • スライスチーズ (5)
  • カレーヌードル
  • メロンパン

20:30 曳舟の部屋に戻る。シャワーを浴びる。風呂から出る。PC を開く。晩飯。

  • WebGL2 Fog 続き
    • 霧の量を奥行きから計算する版を作る。カメラの情報をシェーダーで見たいので、 頂点シェーダーにある一様変数の行列を世界行列とビュー行列に分解して持つように変更する。 霧の量としてひとまず -(u_worldView * a_position).z を採用する。
    • 次に断片シェーダーにさっき読んだ smoothstep を導入する。 このアルゴリズムは確か Hermite 補間だと記憶している。 第三引数 (fogAmount) の三次多項式を評価することになる。
    • あとはそれに伴う自然な変更をコードに加える。
    • そしてキューブを 40 個に増量する。

22:15 キューブ 40 個のコードを動作確認したところで歯磨き&トイレ休憩を挟む。

  • 距離ベースの計算に置き換える演習
    • まずダメなコードを書く。未使用の変数を削除しておく。
    • 実行する。カメラを引いてキューブを覆う霧の感じがおかしいことを確認する。
    • 距離ベースにする。頂点シェーダーが対象となる頂点のカメラ座標系での座標を断片シェーダーに渡すようにする。 断片シェーダーではその距離を計算する。GLSL の関数 length が使える。 その値で奥行きを置き換える。

このシーン、本文でもキューブの側面が描かれないのだが、なぜなのか。

  • 指数ベースの量の置き換える演習
    • fogNear, fogFar を廃止して fogDensity に置き換える。
    • 断片シェーダーの数式。GLSL 関数 exp2(x) は ${2^x}$ の意味だから、 霧の量の基本値

      exp2(-a * a * b * b * log(exp(1), 2))
      

      は結局次を意味する:

      \[2^{-a^2 b^2 \log{2} } = \left(2^{\log{2} }\right)^{-a^2 b^2} = \mathrm{e}^{-a^2 b^2}.\]

      GLSL には exp2 だけでなく exp も用意されている。コードは単純に次でいい:

      exp(-a * a * b * b)
      

      なぜこんな回りくどい公式を使うのか。

    • 実行して結果を見る。
  • 最後の gl_FragCoord.z のコードは省略。

23:30 霧のサンプルを終了する。よく考えたら私はこの技法を必要としていない。次の回が重要だ。

残り時間は昨晩のイルベロをチェックしよう。