昨日の日記に書きそびれたが、マイルシュー台の裏の G ダライアス Ver. 2 を誘惑に負けてワンゲームやったのだった。 上コース三面(デルタか)で全滅した。道中とボスで残機を削って全滅だ。 オリジナルもその傾向があったが、ボス前のアイテムを取り逃しやすいので困る。

YouTube のデータが出来ていないようでストリーミングがプツプツ切れる。続きは明日にしよう。

0:40 WebGL2 Load Obj の本のデモをトレースする。 直前の椅子のデモに着色対応をしたもので、フラグメントシェーダーと parseOBJ に主な変更がある。

2:10 寝る。

10:45 起床。何か変な夢を見たが、今日は思い出せない。 納豆とミニいなりを食う。やることがないので PC をとりあえず開く。

  • WebGL2 Load Obj with Mtl
    • OBJ ファイルのような感じで MTL ファイルというのがある。それの解析器を実装する。 光学密度 Ni 以外のすべての項目を拾う。
    • 鏡面反射の値を指定するのに白黒画像を応用するらしい。風車の例。
    • 椅子
      • 表面材対応版のコードを仕込む。
        • parseMapArgs は未実装で置く。
        • parseMTL の構造は parseOBJ と同じ。キーワード処理の集合と出力形式だけ違う。
        • .map(parseFloat) は覚えておこう。この手法は一般に使える。
        • 断片シェーダーの照光処理を実装する。おそらく旧 OpenGL で可能な照光処理機能全部を書いている。
        • render での twgl.setUniforms への材質の渡し方が変わる。
      • データファイルのダウンロードをしておく。chair.mtl だけ追加的に得れば動作する。
    • 風車
      • 上記椅子コードから差分を実装する。サンプルのコピー&ペーストでは学習にならない。
      • 断片シェーダーに sampler2D diffuseMap; 追加。
      • parseMTL 内に map_Kd, etc. を追加。中身は微妙。
      • 描画準備でテクスチャー準備を追加。マテリアルと並行して準備する。
      • obj.geometries.map の処理の戻り値をデバッグ中に確認すること。
      • データファイルのダウンロードをしておく。windmill.{obj,mtl} のパスだけがわかっている。 MTL ファイルの中で JPEG ファイルを数枚参照している。それらもダウンロードする。 サイズが比較的大きい。ドラクエ 5 よりデカイ。
        • wget のコマンドライン引数を工夫すること。一枚ごとダウンロードするな。
      • JPEG を画像ビューワーでチェックすると、用途がなんとなく察せられる。
      • デバッグ。テクスチャー座標をシェーダーに入れるのをごっそり忘れていた。 真っ黒な風車が描画されてしまった。
      • 第二版で鏡面反射対応。これで窓と風車の羽が角度によって鏡のように反射する。 ここで culling をオンにするコードを追加すると、風車の羽の裏側が描画されなくなる。 この反射がキツイので法線マップで対応する。 理論は別記事で議論されているとあるが、まだ書かれていない。 今回のキモは関数 generateTangents だろう。数学的な処理は説明が良くて後回しになりがちだ。
    • モダンなレンダリングでは法線やテクスチャーの定義が重要だとわかる。

13:40 ランセレエクハ放送を聴きながら上記作業を進めて、ここで作業のほうが先に終わる。 放送時間をチェックしたら残り 30 分弱か。おやつを食いながらエンディングをチェックするか。

14:35 回線が細い。やっと再生が終わる。本当に即終了で良かった。

15:55 室内がいつの間にか暑い。外出。

スカイツリータウン二階へ。トイレ。書店で雑誌チェック。祝日だった。 アエラをまだチェックしていなかったので中身をパラパラ確認。将棋の記事が複数ある。

バス停。錦糸町駅行きに乗車。錦糸公園前で降りる。オリナス錦糸町二階へ。ベンチで休憩。

17:55 タイトー F ステーションオリナス錦糸町店。MJ プロ卓東風戦 6 クレ。 5 クレ目の東三局でキツイ放銃をしてタイム切れになって、オーラスが私の親なのでコンティニューする。 今日はおとといよりも体感的には悪い。

【SCORE】
合計SCORE:-74.5

【最終段位】
四人打ち段位:闘王 幻球:4

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

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

プレイ局数:44局

【打ち筋】
アガリ率:11.36%(5/44)
平均アガリ翻:3.00翻
平均アガリ巡目:12.00巡
振込み率:6.82%(3/44)

【9/20の最高役】
最高役のデータがありません。最高役は、跳満以上のアガリが対象となります。

19:50 カスミオリナス錦糸町店。361 円。クーポン使い忘れ。

  • オクラ茄子丼
  • とり天ハニーバター
  • ブラックチョコ

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

  • 絹豆腐
  • 大きなコロッケバーガー
  • カレーヌードル
  • あんパン

20:30 曳舟の部屋に戻る。子供携帯電話の充電をセット。シャワーを浴びる。明日は洗濯日。

風呂から出て晩飯と PC いじり。ハニーバターはおかずというかおやつだな。 今日は祝日だからメールチェックをしない。

  • 【BPL 2021】セミファイナルステージ第3試合 ROUND1 vs APINA VRAMeS - YouTube
    • 三日連続でイベントはすごい。
    • 接戦になると画面から目が離せなくなる。これが醍醐味か。
    • 自分の得意分野がはっきりとあるプレイヤーがやはり強い。
    • 生放送なので解説席とリングとで中継がある。選手インタビューが長くなって良い。
    • 決勝戦ルール説明と抽選を生放送で実施するのは良い。
    • 最後の DJ はねこまた先生だ。こちらも久々。
  • WebGL2 3D - Data Textures: テクスチャーの記事がまだ残っているのでそちらを消化しにいく。
    • いきなり表の羅列から始まるのはつらい。凡例があり、OpenGL/WebGL/GLSL の仕様書に準じているようだ。
    • 8 のような単一の数字は、0 から 1 に正規化される 8 ビットを意味する。 s8 のように s が先行する数値は、-1 から 1 に正規化される符号付き 8 ビットの数値を意味する。 f16, i8, ui8 などの意味は素直にとればよい。
    • GPU が内部で使用するフォーマットと、WebGL に与えるデータのフォーマットがある。
    • 手始めに 3x2 ピクセルの R8 テクスチャーを作成する。これは一ピクセルあたり赤のデータしかないことになる。
    • 4 の倍数ルールはよく憶えておくことだ。そうでないとき gl.pixelStorei(gl.UNPACK_ALIGNMENT, ???); が意味を持つ。
    • コード初版ではエラー WebGL: INVALID_OPERATION: texImage2D: ArrayBufferView not big enough for request となるはず。それを上の関数呼び出しを補うことで解決する。
    • 2x3 のテクスチャーを正方形に貼り付けるので、赤黒い 1/2 x 1/3 サイズの四角が敷き詰められている。

23:00 Data Textures のほうが先に終わる。次の回はフレームバッファーネタで、 少しひっかかりやすい点があるので時間をおいてから取り組む。

  • WebGL2 Rendering to a Texture
    • gl.texImage2D の最後の引数に null を指定するケースを取り扱う。
    • フレームバッファーを作成する。復習すると、これはテクスチャーやレンダーバッファーの集まりとみなせる。
    • gl.framebufferTexture2D の役割を正確に理解すること。
    • フレームバッファーが束縛されると、描画コマンド gl.clear, gl.drawArrays, gl.drawElements などがキャンバスではなくフレームバッファーに作用するようになる。
    • 本書でたびたび述べられているように、アスペクト比がキャンバスとそれ以外とで異なることに注意する。
    • 初版の生成画像からして相当な衝撃がある。こんなことができるのか。 と思ったが、私はアタッチメントをビデオ (mp4) で実現したことがあったのだ。
    • 著者は再三ビューポートのリセットを忘れるなと言っている。
    • 本当のテーマは奥行きバッファーをフレームバッファーにどう定義するかにある。
    • gl.checkFramebufferStatus(gl.FRAMEBUFFER); の戻り値を確認すること。

23:40 ビデオも終わった。このあとは何をする?