ひとことで
四角い板(2 枚の三角形)に画像を貼り、その板の正面を毎フレームカメラの方へ向け直す描画方法です。煙・炎・光・木の葉の遠景など、本物の立体で作ると重すぎるものを、ほとんどコストをかけずに「どの角度から見ても厚みのある物体」に見せられます。パーティクル描画の最も基本的な形です。
ゲームでの使いどころ
- 煙・炎・爆発・魔法の光:ほぼすべてのパーティクルエフェクトの粒は、ビルボードです。
- 遠景の木や草:遠くの木を 1 枚の板(インポスター)に置き換えて描画負荷を下げる。
- UI 的な表示:敵の頭上の HP バー、名前、ダメージ数値、クエストマーカー。
- レンズフレア・光のにじみ:光源の位置に置く光の板。
しくみ
ビルボードの頂点は、ワールド座標ではなくカメラ空間(ビュー空間)で広げるのが最も簡単です。
- 粒子の中心 をビュー空間に変換する:
- 板の角のオフセット に大きさ を掛け、ビュー空間の に足す
- 射影行列を掛けて画面に出す
ビュー空間の 軸は常に画面の横と縦なので、板は必ずカメラに正対します。回転させたい場合は を 2D で回転してから足します(煙の渦の表現によく使います)。
用途に応じて、向け方にはいくつかの種類があります。
| 種類 | 向け方 | 用途 |
|---|---|---|
| スクリーン整列 | 画面と平行(上の方法) | 煙、光、火の粉 |
| 軸固定(円柱) | 縦軸は固定し、水平方向だけカメラへ | 木、草、たいまつの炎 |
| 速度方向 | 画面上の速度の向きへ伸ばす | 雨、火花(ストレッチビルボード) |
実装のポイント
- インスタンシングでまとめて描く:板 1 枚ずつ描画命令を出すと重いので、数千枚を 1 回の描画で済ませます。
- 半透明の合成:光や炎は加算合成(明るさを足す)、煙は通常のアルファ合成が基本です。アルファ合成では奥から手前へ描く並べ替えが必要になります。境界のにじみを防ぐには乗算済みアルファを使います。
- 地面への刺さり:大きな煙の板が地面や壁と交わると硬い線が見えます。ソフトパーティクルで和らげます。
つまずきやすい点
- 板の薄さがばれる:カメラ正対でない(ワールドに固定した)板は、横から見ると紙のように薄く見えます。デモの「ワールドに固定」で確認できます。
- 真上から見たとき:軸固定のビルボードは、真上から見ると線になってしまいます。見下ろし視点のゲームでは向け方を工夫します。
- オーバードロー:大きな半透明の板が何枚も重なると、同じ画素を何十回も塗ることになり GPU が重くなります(オーバードロー)。枚数より 1 枚の大きさが効きます。
デモで試すこと
- 視点が自動で回っていても、煙は常に厚みのある柱に見えます。これは 70 枚の板が毎フレームカメラへ向き直っているからです。
- 「板の輪郭を表示」をオンにすると、煙が四角い板の集まりであることが分かります。
- 「ワールドに固定」に切り替え、視点が横へ回ったときの見え方の違いを比べてください。