見出し画像

ゲーム開発のための2D描画とAPI

ぼっちgamedev Advent Calendar 2018の3日目。
・基本的な2D描画の仕組み
・ベクタグラフィックス
・DirectX(Direct3D)
・OpenGL/Vulkan
・Metal
・SDL
・HTML5 Canvas
・Rust向けグラフィックスライブラリ
について書く。

基本的な2D描画の仕組み

ゲーム機を含むコンピュータの画面の描画の仕組みは、ハードウェアやOSによって異なる。一般的なPCとゲーム機はビデオメモリ(VRAM)に値を格納してディスプレイに反映する仕組みだが、RGBカラーコードを格納するかキャラクタ(文字・画像)IDを格納するか、といった点で異なる。

例えば任天堂のファミコンはPPU(Picture Processing Unit)という独自のユニットを持ち、メモリにあるキャラクタパターンとカラーパレットにより生成される8x8の画像を画面に並べるという仕組みで描画を行っている。これは安価で高性能なゲーム機を提供するための企業努力らしい。

一方、現代的なPCではVRAMにカラーコードを書き込む方式となっている。が、直接書き込むということは無く、OS等が提供するAPIを介して書き込むのが普通だ。

近年はゲーム機のハードウェア構成がPCと同等になり、OSはUnixベース(macOSもUnixベース)のものが増えている。そのため、現代はPCとゲーム機で同じレンダリング方式を取っていると言える。

ベクタグラフィックス

単純にVRAMに1ピクセルずつカラーコードを書き込んでいくことを考える。近年はディスプレイの高解像度化が進み、フルHD(1920x1080)では200万ものピクセルを扱う必要がある。ドット絵が主流だった時代は数百程度の解像度で、ドットが目立っても違和感は無かった。しかし高解像なディスプレイ上ではドットが却って目立ってしまう。例えば下図。

上図左側がアンチエイリアス無し、右側がアンチエイリアス有りの領域で、その中に太さ1pxの線分を表示した。アンチエイリアス無しだとギザギザでやや太く見える。このように高解像度の世界では特にアンチエイリアスが重要である。

ゲームでは画像を頻繁に拡大・縮小・回転など変形するが、ビットマップ画像を元にして変形しようとすると、増えたピクセルが周辺ピクセルで補完されるため品質の劣化が生じてしまう。さらに元の画像にアンチエイリアスが掛かっていると、全体的にぼやけた印象の画像となることもある。

ベクタグラフィックスは、線や面を構成する座標、その集まりによって図形を表現する形式であり、全ての座標のカラーコードを持つビットマップ画像とは対照的である。ベクタグラフィックスでは拡大・縮小・回転などの変形を考慮して線や面を再描画するため、画像の劣化は生じない。現実的にはディスプレイで表示出来るのはビットマップのみであることから、都度描画領域が計算され、ビットマップ化される。

近年はPCゲーム需要やスマートフォンの登場により画面解像度が多様化しているため、ベクタグラフィックスを採用するゲームが増えている。また、3DCGのレンダリングもベクタグラフィックスに似た仕組みとなっている。

ベクタグラフィックスは幾何学的な図形の集まりによって表現されるため、描画領域の計算に大きなコストが掛かる。そのため基本的にはGPUを用いて実現されることが多い。

DirectX(Direct3D)

DirectX(Direct3D)はMicrosoftが開発したMS製品向けグラフィックスAPIであり、GPUを利用して高速なレンダリングを可能とするものである。

OpenGL/Vulkan

OpenGLはKhronos Groupが策定しているオープン標準規格のグラフィックスAPIである。仕様がオープンであるため、様々なOS・環境で動作するライブラリが存在し、その多くはGPUを利用するものとなっている。DirectXとは異なり、Windows以外のOSでも利用可能である。

VulkanはOpenGLの後継としてKhronos Groupが策定しているグラフィックスAPIである。OpenGL時代に蓄積されたレガシーな仕様を撤廃し、ローレベルなハードウェア制御を行えるようにすることを目的としているため、より高速なレンダリング性能が期待出来る。Nintendo SwitchがVulkanに対応したという発表もあり、今後コンシューマゲーム業界でも普及していくと考えられる。

Khronos GroupからはOpenGL/Vulkan共にC/C++のみヘッダーファイルが公開されているが、様々な言語のバインディングが存在する。

Metal

MetalはAppleが提供するローレベルグラフィックスAPIである。Vulkanや最新のDirectXに似た仕様であり、macOSとiOSでのみ動作する。AppleはMetalの発表と同時にApple製品でのOpenGL/Vulkan非推奨化を行った。そのためApple製品上でVulkanを動作させるためにKhronos GroupがMoltanVKというMetal上で動作するVulkan実装を提供している。

SDL

SDL(Simple DirectMedia Layer)はクロスプラットフォーム向けに提供されているマルチメディアライブラリ群である。様々なプラットフォーム固有の音声・描画処理などを1つの抽象的なAPIとしてまとめ、比較的簡単に扱えるようになっている。レンダリングに関しては、DirectX・OpenGL・その他グラフィックスAPIの中で、そのプラットフォームに最適なAPIが内部で利用される。

HTML5 Canvas

HTML5で<canvas>要素が導入されたことで、Webブラウザ上でJavaScriptによる2D/3Dグラフィックスレンダリングが可能となった。これの登場によりAdobe Flash Playerが置き換えられ、これまでFlashで提供されてきたサービスやブラウザゲームが次々とHTML5 Canvasベースのものへと移植されている。

Canvas APIはJavaScript向けの抽象グラフィックスAPIとも考えられ、Webブラウザ内部ではSkia(2Dベクタグラフィックスライブラリ)やOpenGLなどが利用されている。

Rust向けグラフィックスライブラリ

gl-rs: OpenGLバインディング
gfx-rs: Vulkan/DirectX/Metal/OpenGLの抽象インターフェース
vulkano: Rustの思想に基づいてVulkanをラップしたライブラリ
rust-sdl2: SDL2のRustバインディング
nanovg-rs: NanoVGのRustバインディング
cairo: CairoのRustバインディング
ggez: 軽量なgfx-rsベースの2Dゲームエンジン
piston: モジュール方式のゲームエンジン
amethyst: データ駆動型のゲームエンジン

まとめ

・VRAMにカラーコードを書き込むことで2D描画する
・PCとゲーム機は同じレンダリング方式
・ベクタグラフィックスは変形による画質の劣化が生じない
・ベクタグラフィックスも3DCGもGPUを利用して高速化
・OpenGL/Vulkanは唯一のクロスプラットフォームグラフィックスAPI
・一般的にはSDLのようなライブラリから間接的にOpenGL等を使う

明日は描画のためのデータ構造について書きたい。

この記事が気に入ったらサポートをしてみませんか?