数百円で買える小さなマイコン「ESP32-S3」で、水面に景色が映り込む3Dゲームを動かす。そんな自作の3D描画エンジン「Jet」を、開発者のPhonicUK氏が公開した。リアルタイムの水面反射や波のゆらぎ、レンズフレアまで表現し、毎秒およそ50コマで動く。見た目は、スーパーファミコンの「スターフォックス」を思わせる。
表示に使うのは、SPIという一般的な接続方式の480×320の液晶で、80MHzで駆動する。ESP32-S3は、電子工作で広く使われる安価なマイコンで、本来こうした3D描画を想定した部品ではない。それでもPhonicUK氏は、限界だと思うたびに新しい速さを見つけてきたという。当初の目標がスターフォックス並みの絵で、そこから機能を足し続けた。
注目したいのが、水面反射の作り方だ。Jetは「ペインターズアルゴリズム」という、遠くのものから先に描く方式を使う。遠くの景色を描き終えてから手前の水面を描くため、水面を描く時点で、映り込む対象はすでに画面のメモリ上にある。だから反射のために描き直す必要がなく、一度の処理で済む。波のゆらぎは、映す位置を上下に少しずらすだけで、昔の2Dゲームの水面表現と同じ手口だ。
速さの工夫もある。模様(テクスチャー)を貼った三角形は、画素ごとの計算が要るため遅い。Jetは、面を単色で塗る三角形を中心にすることで、行ごとにまとめて塗りつぶし、速さを稼ぐ。表示の負荷を抑えるため、毎回画面の半分だけを更新する「インターレース」も使う。2つあるコアのうち片方を画面表示に、もう片方を描画とゲーム処理に充てている。
入力もひと工夫している。8ビットのシフトレジスタ「SN74HC595N」を1個使い、4本のピンで8個のボタンを読み取る。コースは計算で自動生成し、モデルはOBJ形式を使う。PhonicUK氏は、より高性能な「ESP32-P4」と高解像度の液晶も試したが、描く画素が増えてかえって追いつかず、今の構成のほうが速いと結論づけた。エンジンのソースコードはGitHubで公開している。