ゲームに登場する船、「どうすれば船内に水面が貫通しないのか」開発者らが徹底議論。正攻法から“力技”まで十人十色のアプローチ

Redditのゲーム開発者向けコミュニティにて、「水に浮かんでいる船は、なぜ内部に水面が入り込まないのか」を問う投稿がおこなわれた。

Googleでお気に入り登録

海外掲示板Redditのゲーム開発者向けコミュニティ「r/gamedev」にて、「水に浮かんでいる船は、なぜ内部に水面が入り込まないのか」を問う投稿がおこなわれた。この質問に対し、さまざまな開発者から十人十色の実装方法が紹介され、注目を集めている。

発端は、RedditユーザーLalaCrowGhost氏が投稿した“浮かぶ船”にまつわる疑問だ。船が水に浮かんでいる以上、船内の一部は水面より低い位置にあるはずなのに、多くのゲームでは船内に水面が描画されることはない。いったいどうやって、船内から水面を取り除いているのか、ほかの開発者たちにその実装方法を尋ねているのだ。

ちなみにLalaCrowGhost氏自身は、FPSゲームなどで用いられる、プレイヤーが手にした銃を常にほかのオブジェクトより手前に描画する手法に近いのではないかと推測していた。しかし、船と水面の奥行き関係がおかしくなってしまうとのことで、避けたほうがいいとする声が寄せられた。

レンダリングによる解決策

同氏の疑問に対し、多くの開発者が“定番のテクニック”として挙げているのが、ステンシルを活用したマスク表現だ。ゲームエンジンでは、画面上の各ピクセルに対応するステンシルバッファ(Stencil Buffer)という領域に値を書き込むことで、「描画する部分」と「描画しない部分」を区分することができる。船内にあたる領域のピクセルのステンシルバッファに特定の値を設定し、水面の描画時にその領域を除外することで、表示しないようにできるわけだ。

Comment
byu/LalaCrowGhost from discussion
ingamedev

また、マスク表現を実現するもう一つの方法としては、深度情報を利用する手法も紹介されている。深度バッファ(depth buffer)は、画面上の各ピクセルについて、カメラから見た物体の奥行きデータを一時的に保持する領域だ。

これを利用する場合、不可視のメッシュを配置する方法が考えられる。このオブジェクトは画面上には表示されず、自身の深度値だけを深度バッファへ書き込む。すると、カメラから見てボリュームの背後にある水面部分は、より手前の深度値を持つボリュームに遮られるかたちになり、深度テストに失敗し、描画されない。結果として船内から水面を取り除いたように見せることができるわけだ。ただしこの方法を扱う場合、「船内のオブジェクト」→「不可視メッシュ」→「水面」という順番でレンダリングしないと、水面のみならず船内の一部まで描画されない可能性があるため、レンダリングの順序に注意を払う必要があるという。

なおコメントでは同様の手法に関して、オリジナル版の『アサシン クリード IV ブラック フラッグ』の小型ボートについて検証した解説動画も紹介されている。それによれば、船内を蓋のように覆う不可視の平面メッシュが用いられた可能性が高いそうだ。動画の内容は、投稿者のブログにおいても詳しく解説されている。

どこまで妥協するかも重要

また開発者の中には、そもそも「見せない」という発想でこの問題に対処する開発者もいる。Landeplagen氏はこの手法が通用するのは大型船で、大きな波がない場合などに限られると前置きしつつ、デッキと室内を繋ぐ通路を設け、その間に窓など外が見える要素を置かなければ、カメラが室内にある間は水面をまるごと非表示にするだけで済むと説明した。つまり、水面と水面下の領域を同時に描画するシーンを避ければ、そもそも両者を同時に処理する必要がなくなるというわけだ。こうしたシンプルな解決策を採用するのも一つの手だろう。

一方でcatplaps氏によれば、水面のメッシュ自体を変形させる方法も考えられるという。船体の形に沿うように水面のメッシュにくぼみを作り、水面を毎フレーム更新することで、水面が船内を突き抜けることを避けられるというわけだ。ただし、こうした方法は前述したバッファを用いた方法よりも複雑で、処理コストも大きい。作業量が増えるうえに処理速度も遅いとして、一般的には採用されることは少ないようだ。

Comment
byu/LalaCrowGhost from discussion
ingamedev

さらに同氏は、この原理を発展させることで、完全な流体シミュレーションで水面を生成することも可能だと語る。水の粒子の位置や、一定区間ごとの水量を計算することで、船体と水面の相互作用を物理的に再現するのだ。とはいえ同氏いわく、2026年現在においても、基本的には計算コストが高すぎて現実的ではない模様。現実の物理現象をどこまで再現し、どこから簡略化するのか。その最適な落とし所を探ることも、ゲーム開発には重要というわけだろう。

「水面」の処理一つをとっても、その実装方法はさまざまあり、処理負荷や開発の難易度もかわってくる。普段何気なく目にしているゲーム内の表現にも、多くの工夫や技術が隠されていることを感じさせる議論だ。

この記事にはアフィリエイトリンクが含まれる場合があります。

Googleでお気に入り登録
Kousetsu Taguchi
Kousetsu Taguchi

レトロゲームショップに入ると真っ先にセガサターンのコーナーを確認するタイプです。

記事本文: 186