512 日目(晴れ)私にとっては無意味な祝日
昨日の日記に書きそびれたが、マイルシュー台の裏の G ダライアス Ver. 2 を誘惑に負けてワンゲームやったのだった。 上コース三面(デルタか)で全滅した。道中とボスで残機を削って全滅だ。 オリジナルもその傾向があったが、ボス前のアイテムを取り逃しやすいので困る。
- 第3回 Lv12ランセレエクハ落ちたら即終了 - YouTube: 筐体貸し切り時間の三時間を完走すれば成功という条件のようだ。 今回の放送時間は何分保つかな。
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 回線が細い。やっと再生が終わる。本当に即終了で良かった。
- ドラクエ4リバスト伝説【KFゲーム広場】 - YouTube: この前の続きが気になるのでよそのリストでチェック。 コメント欄には戦闘を飛ばすなという文句がチラホラあるが、 シナリオを確認したい視聴者としてはこれでいい。
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 ビデオも終わった。このあとは何をする?