スプライト (映像技術)
スプライト(英: sprite)は、主にビデオゲームで用いる、画面上の小さなキャラクタを高速に合成表示するための技術的な仕組みである。spriteは「妖精」の意味を持つ英語が由来となっている。
概要
[編集]この機能は、通常の画面表示における映像の情報を記憶しているビデオRAMとは別に、多数の小さな画像を画面上の1ピクセル単位で任意の位置にハードウェアで合成して表示するものである。
背景となる画像やテキスト、複数のスプライトで任意の優先順位で重ね合わせて合成表示ができるようになっており、低価格帯の機種などでは単色であったりと、描画表現よりも動くパーツを表現するのに適した機能である。
これはアニメーションにおけるセル画の概念に近く、セル画に例えるなら背景の上にキャラクタの大きさに切ったセルを置いて、1コマ毎にキャラクタのセルを背景上で移動させながら動かしたり、別のセルに置き換えたりしていくというものである。
個々のスプライト画像は例えば32×32の正方形や32×64の長方形のような矩形だが、透過はピクセル単位で行なわれる。これにより、円形や三角形や星形など、任意の形状の図形を背景と合成できる。各スプライトは特定の透過色(抜き色、カラーキー、クロマキー)を持ち、透過色の指定されたピクセルは背景との合成時に描画されず、重ね合わせたときに背景が透けて見える。スプライトを別のスプライトに重ね合わせて透過表示することもできる。
メモリを節約するために、カラースプライトの画像には通例インデックスカラー形式が使われる。スプライト画像ごとにカラーパレットを持つことで、個々のスプライト画像のデータを削減しつつ、最終的に合成されて画面に表示される画像全体としての色数を増やすことができる(最大同時発色数はハードウェアにもよる)。
ビットマスクと論理演算を利用すれば、スプライトの画像と透過情報の画像(マスク画像)を分離することもできる[注釈 1]が、メモリ消費量や合成描画時のメモリアクセス回数が増えるため一般的には使われない。
応用表現
[編集]例えばゲーム上において主人公=プレーヤーがソリに乗るシーンを表現する場合、スプライトを使った映像表現では、座っている主人公が描かれたスプライトの下にソリのスプライトを重ね、ソリが動き出した際にソリや主人公を細かく上下・または左右に小さく動かすことで、主人公の乗ったソリが勢い良く疾走してガタガタと地面の凹凸によって振動する様子が表現できる。
主人公がソリからボートに乗り換える場合には、座っている主人公のスプライトの下にボートのスプライトを置くだけで済む。このように実際に表示されるデータそのものを書き換えるよりも遥かに軽い処理であり、表示そのものよりも動きという点において優れた表現力を発揮する。反面、特にラインバッファ方式の実装ではメモリの速度に横方向の同時表示の数は依存するため、そのキャラクタの大きさや数は、ハードウェアの設計に制限を受ける。スプライト機能が単色のハードウェアで複数色のキャラクターを表現する場合は、色別のキャラクタを複数重ね合わせることで対処する。
プログラミング上における利点
[編集]プログラム上においては、キャラクタを移動させるときは各スプライトの表示位置情報だけを変更すればよい。よってソフトウェアで画像の重ね合わせ処理などを行う必要がなく、CPUにかかる負荷、VRAMのバスに対する負荷、ソフトウェア開発(主にプログラマー)への負担が少なく、プログラムの品質も安定する。優先順位の指定により、奥行きも簡単に表現できる。これは前述の応用表現のように、特に幾つかの部品を別々または一緒に動かす事で動きとしての表現能力を向上させると共に、パーツ単位での合成が容易となり、総データ量の削減に寄与し、制作負荷の低減や少ない記憶容量の媒体でより表現力の豊かなゲームを提供できることにも繋がった。
ハードウェア
[編集]初期にはアーケードゲームにて専用の電子回路を組んで実現されていた。次第に汎用化され、ファミコンなどのゲーム機、パーソナルコンピュータ(パソコン、PC)の一部(MSX、X68000、FM TOWNS)などで利用できるようになった。
その特性から、画面上で多数のキャラクタが同時に動く、シューティングゲームやレーシングゲームで重宝された。スプライト機能を搭載したハードウェアの場合、少ないCPUリソースでキャラクターを画面上で多数スムーズに動かせるため、CPU処理能力の低い時代におけるコンピュータでは滑らかな動きと速度を要求するゲームでその力を発揮した。スプライト機能を持たないハードウェアではCPU処理速度、VRAMの構造などから実現が難しいことであった。
ラインバッファ方式
[編集]ファミリーコンピュータ・MSX・X68000などで使われていた方式である。
モニターに出力する映像信号を生成する直前に、VRAMから読み出した、ビットマップあるいはキャラクタベースのグラフィック面のデータと、スプライトICより送られて来るスプライトのデータを、走査線1ライン分の容量のラインバッファ上で、合成処理する[2]。
この方式のメリットは、グラフィックバスをほとんど消費せず、またキャラクタの合成処理に必要なワークRAMが少なくて済む、という点である。
しかし画面の走査と並行してスプライトを合成するために、そのスプライト用のバッファには高速なメモリを必要とし、横方向へ多数表示した場合、合成処理が追いつかず、間に合わなかったものは表示されないという状況になる。この際、通常は内部のインデックスが遅い(優先順位が低い)スプライトから表示が欠けていき、スプライトの数が増えれば増えるほど、1ライン内での合成処理のタイミングがシビアになる。この仕様を逆手に取り、合成処理の一部として使用しているソフトウェア[注釈 2]も存在する。
これらの制限に対しては、特に最大表示個数に制約が多い家庭用ゲーム機など、多くのソフトウェア上では、表示するスプライトを選別してちらつかせながら表示することで、スプライト欠けを緩和していた。また、水平帰線期間内に制御可能なハードウェアでは、走査線判定、割り込みなどを使用して、実表示が終わったエリアのスプライトの位置情報をまだ走査されていない領域で利用することにより、仕様上の最大表示数を越えた画面表示を行なう「スプライトダブラー」などの処理も開発された(ラスタースクロールも参照)。
フレームバッファ方式
[編集]FM TOWNSや業務用ゲーム機などで使われていた方式である。広義では、3Dグラフィックス機能(ポリゴンとテクスチャマッピング)により疑似的に実現する方法も該当する。
日本の家庭用コンピュータでは、FM TOWNSで初めて採用された。発売当時の家庭用コンピュータで一般的だったスプライト機能の実装方式と異なるため、俗に「擬似スプライト」と呼ばれることがあった[3]。3DOやセガサターンなどの第5世代以降、ゲーム機でも主流となっている。
原理は単純で、スプライトのみ描画するフレームバッファを2画面分確保する。そして1フレーム分のスプライトをオフスクリーンのフレームバッファに全て描画する。描画完了後に現在オフスクリーンのフレームバッファと、オンスクリーンのフレームバッファを切り替える。スプライトの描画が完了したフレームバッファは単なるビットマップグラフィックプレーンとして他のグラフィックプレーンと合成して出力される。これを繰り返す。
メリットはラインバッファ方式と異なり、横方向にスプライトを並べられる数に制限がない。スプライトICによるVRAMへの描画速度とVRAMの速度が向上すれば、リニアにスプライトの表示上限を向上させることができる。このためフレームバッファ式のスプライトは、ラインバッファ式を遥かに上回る最大表示個数を実現していることが多い。また基本的には、CPUが行うかスプライトICが行うかの違いを除けば、VRAMへビットマップデータを描き込むという点では同じであるため、スプライトに対する拡大縮小などの特殊効果の実装に無理がない。
デメリットはVRAMが大量に必要であり、またVRAMへのスプライトデータ(つまりビットマップデータ)の高速な描画能力も必要である。また1フレーム中に表示可能な枚数を越えて表示させようとすると表示バッファを切り換えるタイミングが2フレーム以降になり、この遅れによる表示のもたつきが発生する。なおフレームバッファ方式でも初期の実装(セガのシステム基板など)の場合は、垂直帰線期間に全てスプライトの転送が終わることを前提として1フレーム分しかバッファを設けず、スプライトレイヤの描画タイミングがなんらかの理由で遅延した場合は、優先順位が低いスプライトが丸ごと大量に消えたりする。
ソフトウェア
[編集]プログラミング技法そのものが、広告のキャッチコピーとして多用された時代は、上記ハードウェアスプライトに対して、ソフトウェアによる重ね合わせ、キャラクタ表示の高速処理をソフトウェアスプライトあるいは擬似スプライトと表現していた。必ずしもハードウェアスプライトの持つ特徴、優位性を包含するものではない。その後、Microsoft Windows(PC/AT互換機)等のハードウェアスプライトを持たない環境でもDirectDraw等のAPIを介して、同様の処理はフレームバッファに描画される形で擬似的に実現されている。
PCにおいてはハードウェアスプライトこそ淘汰されたものの、ソフトウェアによるものは依然としてポピュラーな技法である。背景とキャラクターの分離によるデータの削減が可能なため、ノベルゲームのような動きの少ないケースでも重要である。インターネットでもAjaxの普及とCascading Style Sheetsの強化などにより、従来はアニメーションGIFやAdobe Flashで実現されていたウェブサイトの動的なアクセントなどに活用されている。
3Dグラフィックス機能を使用した実装
[編集]上記のような描画の仕組みを持たないPlayStation等でも、グラフィックスハードウェア上に実装された3Dジオメトリエンジンの持つテクスチャマッピングおよびラスタライザの機能を応用し、正面を向いた四角形のポリゴン(ビルボード)を使った処理によって同様のスプライト機能を実現している。ソフトウェア開発キット(SDK)やミドルウェアなどに用意されたライブラリによって提供されていることもある。汎用PCおよびモバイルデバイス上で動作するアプリケーションソフトウェアであっても同様に、Direct3DやOpenGL/OpenGL ESなどの3DグラフィックスAPIを経由して、GPUの機能による合成やエフェクトなどを使用して近似実装されたスプライトが利用されている。
GPUのようなグラフィックスプロセッサでは、ポリゴン頂点またはテクスチャの持つ透過情報を利用して、アルファブレンドをハードウェアで実行することができる。頂点カラーやテクスチャには24ビットのRGB色情報と8ビットの透過情報(アルファチャンネル)を持つRGBA32形式が使われることが多く、頂点ごとあるいはピクセルごとに256段階(0-255)の透過レベルを持たせることができるため、スプライトの透明度を徐々に変化させるフェード表現や、画像の縁がアンチエイリアスされたなめらかな合成などが可能である。
Direct3D (DirectX) 8/9やOpenGL 2.xでは、ポイントスプライトの機能が用意されている。これは、「点」図形の描画に使用されるポイントプリミティブに対してサイズとテクスチャとブレンディングステートを指定することで、テクスチャマッピングされた2つの三角形面による四辺形を自動的に描画するものであり、この機能を使用するとスプライトを簡単に描画できる[4]。Direct3D 10ではこの機能が廃止され、代わりにジオメトリシェーダーを使用することが推奨されている[5]。
スプライトを大量に描画する場合、個別に描画していてはドローコールやレンダリングステート変更のオーバーヘッドが大きい。Direct3D 9/10の拡張ライブラリ(D3DX)では、複数のスプライト描画コマンドをいったんキューイングしておき、まとめてバッチ処理する機能が提供されていた[6][7]。
脚注
[編集]注釈
[編集]- ^ 例えばMicrosoft WindowsのGDIにおける
BitBlt()
(Bit Block Transfer)関数では、画像データの転送に使用するラスターオペレーションコードを駆使することで、フルカラーのスプライトをソフトウェア実装することもできる[1]。 - ^ ファミコン版『ドラゴンクエストIV 導かれし者たち』における出航シーン等。
出典
[編集]- ^ BitBlt function (wingdi.h) - Win32 apps | Microsoft Learn
- ^ Oh!X関係者が語る,あのころのX68000。「X68000 Z」のローンチを記念して,かつての関係者にあれこれ話してもらおう
- ^ 『Oh!FM TOWNS』1993年9月号 p.64
- ^ Point Sprites - Windows drivers | Microsoft Learn
- ^ Deprecated Features (Direct3D 10) - Win32 apps | Microsoft Learn
- ^ ID3DXSprite interface (D3dx9core.h) - Win32 apps | Microsoft Learn
- ^ ID3DX10Sprite interface (D3DX10.h) - Win32 apps | Microsoft Learn