C++で使える、クロスプラットフォームな低レベルグラフィックスライブラリ比較

(英語版も書きました: Comparison of C++ Low-Level Graphics, Cross-Platform Frameworks and Libraries)

最近OpenGLばっかり書いていて、ふと、MetalやDirectXでも動くクロスプラットフォームなアプリも書きたいなと思ったので調べてみた。

今回調べてみたライブラリの特徴は、

なお、今回は低レベルグラフィックスAPIへの対応を重視しているので、ゲームエンジンとしての比較は他記事を参照。今回紹介するライブラリをベースにした、独自のゲームエンジンが多数存在する。

追記: 本文が結構長くなったので、目次として まとめ の表をここに記載。(リンクは各見出しに飛びます。)

良い点 :white_check_mark: 悪い点 :x:
LLGL 豊富なAPIに対応 個別対処・難易度 高
The Forge 対応端末数・完成度 個別対処・難易度 高
Diligent Engine 同一ソースで複数対応 Metal非対応
bgfx 同一ソースで複数対応・簡単 テッセレーション対応△
oryol / sokol_gfx 組み込み・Web向き 計算シェーダ非対応
Methane Kit Windows / Mac に特化 モバイル非対応
bs::framework ゲームエンジン基盤 Windows以外は開発途上

LLGL (Low Level Graphics Library)

4506fdd3-2291-2b76-1390-89142d4c64f8-min.jpg

DirectX Metal Vulkan OpenGL OpenGL ES
Windows :white_check_mark: - :white_check_mark: :white_check_mark: -
Mac - :white_check_mark: - :white_check_mark: -
Linux - - :white_check_mark: :white_check_mark: -
Android - - :x: - :white_check_mark:
iOS - :white_check_mark: - - :x:
Vertex Fragment Compute Geometry Hull (TC) Domain (TE)
:white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:

※ シェーダはクロスコンパイル式ではなく、プラットフォーム別に準備が必要(glsl/hlsl/metal/spv)

依存ライブラリが少なく、ビルドは短時間で簡単 (cmake)。
DirectX / Metal / Vulkan / OpenGL (ES) に対応していて、各種シェーダも全て使えるので、最も網羅的に使える印象。

低レベルアクセスについては、共通するAPIは最低限だけ提供して、それぞれのプラットフォームに必要な処理はマクロ等で切り替えて個別のプラットフォームごとに対応するスタイル。そのため性能要求に応えやすくメンテしやすいが、必要な知識と難易度は高め。(とはいえ、APIのラッピングと共通化は行ってくれているので、可読性とメンテナンス性は高い。)

シェーダも個別に準備する必要があるが、他のライブラリのように自分で spirv-crossshaderc を利用してクロスコンパイルすれば問題ない。逆に捉えれば、API同様、各プラットフォームごとに特化した処理を書くことができる。

The Forge

a7491fa8-f2cd-3c28-b809-5bbb3cf4922a-min.jpg

DirectX Metal Vulkan OpenGL OpenGL ES
Windows :white_check_mark: - :white_check_mark: :x: -
Mac - :white_check_mark: - :x: -
Linux - - :white_check_mark: :x: -
Android - - :white_check_mark: - :x:
iOS - :white_check_mark: - - :x:

XBOX, PS4, Switch, Stadia にも公式対応

Vertex Fragment Compute Geometry Hull (TC) Domain (TE)
:white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:

※ シェーダはクロスコンパイル式ではなく、プラットフォーム別に準備が必要(glsl/hlsl/metal/spv)

かなり完成度の高いフレームワークで、ゲームエンジンのレンダリング基盤としての使用を強く意識して作られている。ただし、OpenGL (ES)には非対応なので、古いモバイル機器やRaspberry Piなどでは使えない。

非常に作り込まれている印象で、CIや単体テストを多用していることからも安定性の高さが伺える。実際の導入実績も多い。

使い勝手は前述のLLGLに近く、個別のプラットフォームに対する知識は必要だが、高い要求性能に応えることができるフレームワークだと感じる。

Diligent Engine

ef1bf02d-23cd-8910-78a7-01d3bbf60458-min.jpg

DirectX Metal Vulkan OpenGL OpenGL ES
Windows :white_check_mark: - :white_check_mark: :white_check_mark: -
Mac - :x: :white_check_mark: (MoltenVK) :white_check_mark: -
Linux - - :white_check_mark: :white_check_mark: -
Android - - :x: - :white_check_mark:
iOS - :x: :white_check_mark: (MoltenVK) - :white_check_mark:
Vertex Fragment Compute Geometry Hull (TC) Domain (TE)
:white_check_mark: :white_check_mark: :white_check_mark: (※2) :white_check_mark: :white_check_mark: :white_check_mark:

※1 HLSLをクロスコンパイルさせる方式。
※2 OpenGL4.3未満ではコンピュートシェーダ使用不可のため、MacのOpenGLでは使えない。

依存ライブラリが少なく、ビルドは短時間で簡単 (cmake) 1。名前にエンジンと付いてはいるが、軽量で使いやすいフレームワーク。

APIとシェーダは各プラットフォームで完全に共通化されており、同じソースコードで各プラットフォームに対応できるのが特徴。

ただし、Metalに対応していないのがすごく残念…。そのため、MacのOpenGLではコンピュートシェーダが使えない。その点を除けば、後述の bgfx と同様の軽量フレームワークとして、使い勝手が良いと感じる。(bgfxと比べると、後発だけあってAPIがモダンで実装効率もよく、拡張性が高い。)

bgfx

762db1a0-0944-f7d2-9b2d-4b9dccd73c6f-min.jpg

DirectX Metal Vulkan OpenGL OpenGL ES
Windows :white_check_mark: - :white_check_mark: :white_check_mark: -
Mac - :white_check_mark: :question: :white_check_mark: -
Linux - - :white_check_mark: :white_check_mark: -
Android - - :question: - :white_check_mark:
iOS - :white_check_mark: :question: - :white_check_mark:

WebGLに対応。Emscriptenやasm.js、Raspberry Piなどにも対応。

Vertex Fragment Compute Geometry Hull (TC) Domain (TE)
:white_check_mark: :white_check_mark: :white_check_mark: :x: :x: (※2) :x: (※2)

※1 GLSLのサブセットの独自言語を、クロスコンパイルさせる方式。
※2 DirectXとOpenGLについては、hull/domainシェーダーに対応させる非公式フォークあり。メンテナンスされていないが…。

2015年から開発されていて、導入実績と実装例、質問投稿などがすごく豊富。コンパイルも簡単で、cmake以外にもGENieという独自のビルドマネージャー搭載。

同じソースでマルチプラットフォームで動作するのが特徴。APIがとてもシンプルで使いやすく、拡張性が高い。一方で、テッセレーション系シェーダに非対応なのが残念だが、コンピュートシェーダでテッセレーションに対応させることは可能 (公式Exampleも存在) 。Diligent Engineと違ってMetalに対応しており、MacやiOSでもコンピュートシェーダが使えるのは大きい。

シェーダーにはGLSLに似た独自言語が使えるが、専用のヘッダファイルなどを定義する必要がある。ちょっと独特だが、各プラットフォームで共通のシェーダーが使えるのは嬉しい。

開発方針として、同一ソースにおける、各プラットフォームでの互換性が重視されているため、テッセレーションの件も含め、コマンドバッファなどに一部制限がある。また、今回紹介しているライブラリの中では最も登場時期が早いためAPI設計がやや古く、Dilligent Engineと比べると実装効率の面などで劣る点もあるが、今も活発に更新されているので改善に期待。

oryol / sokol_gfx

https://github.com/floooh/oryol
https://github.com/floooh/sokol

ed19ec55-2d89-29e9-cfc8-b0adbfc78f3c-min.jpg

DirectX Metal Vulkan OpenGL OpenGL ES
Windows :white_check_mark: - :x: :white_check_mark: -
Mac - :white_check_mark: :x: :white_check_mark: -
Linux - - :x: :white_check_mark: -
Android - - :x: - :white_check_mark:
iOS - :white_check_mark: :x: - :white_check_mark:

※ WebGLにも対応
※ Raspberrry Piにも正式対応 (OpenGL ES)

Vertex Fragment Compute Geometry Hull (TC) Domain (TE)
:white_check_mark: :white_check_mark: :x: :x: :x: :x:

※1 oryolは、GLSLに似た独自言語を、クロスコンパイルさせる方式。sokol_gfxは個別に準備が必要。

oryol と sokol_gfx は、どちらも同じ作者が制作したライブラリで、sokol_gfxが C言語用のシングルヘッダーライブラリ であるのに対し、oryolは C++用の軽量ライブラリ。C++11未満でも使えるよう配慮されており、組み込み用途を強く意識しているのが特徴。

非常に軽量なライブラリでありながら、必要な機能は十分備えている。さらにWebGLに対応しており、asm.js/wasmによってウェブサイト用にコンパイルして使うことができ、その際のファイルサイズも小さい。

コンピュートシェーダーが使えないのだけが残念だが、作者は別のアドオン的なライブラリとしての制作を検討している模様。今後に期待。

Methane Kit

087fc62c-afc9-b0fa-daf2-2aeb42ff3f60-min.jpg

DirectX Metal Vulkan OpenGL OpenGL ES
Windows :white_check_mark: - :x: :x: -
Mac - :white_check_mark: :x: :x: -
Linux - - :white_check_mark: (※1) :x: -
Android - - :x: - :x:
iOS - :x: :x: - :x:

※1 Linux/Vulkan 版は現在開発途中。

Vertex Fragment Compute Geometry Hull (TC) Domain (TE)
:white_check_mark: :white_check_mark: :x: :x: :x: :x:

※ HLSL 5.1を、クロスコンパイルさせる方式。

C++17を基準に作られた、デスクトップに特化したライブラリで、Windows/Macでの互換性・再現性の高さが特徴。Windows/Macともに同じコード・シェーダーで書くことができる。最近になってLinux/Vulkan版が発表された。

GitHubに公開されてまだ1年で、活発に更新が行われている。

bs::framework

3997370c-2403-14ef-35c6-d97f135fc2b1-min.jpg

DirectX Metal Vulkan OpenGL OpenGL ES
Windows :white_check_mark: - :white_check_mark: :white_check_mark: -
Mac - :x: :x: (※1) :white_check_mark: (※2) -
Linux - - :white_check_mark: :white_check_mark: -
Android - - :x: - :x:
iOS - :x: :x: (※1) - :x:

※1 MoltenVK経由での実装の議論は、執筆時点で進行中。
※2 執筆時点でMac版の動作に難あり。

Vertex Fragment Compute Geometry Hull (TC) Domain (TE)
:white_check_mark: :white_check_mark: :white_check_mark: (※2) :white_check_mark: :white_check_mark: :white_check_mark:

※1 HLSLのサブセットである独自言語 (BSL) を、クロスコンパイルさせる方式。
※2 MacでMetal/Vulkan非対応のため、Macではコンピュートシェーダ利用不可。

今回の他のライブラリに比べて、これだけ少し規模感が異なり、ゲームエンジンとしての機能を統合的に提供するフレームワークBanshee 3D Engineの作者が作っていて、ゲームエンジンの基盤として意識して作られている模様。初期バージョンがリリースされてからまだ1年で、未だベータ版。

C++14を基準に作られており、UnityやUE4のようなシーン・コンポーネントシステムや物理演算、各種ファイル読み込み機能、アニメーション機能、音声再生等、低レベルグラフィックAPIだけにとどまらず、1つのフレームワークで幅広い機能を提供している。

ドキュメントは比較的豊富だが、全体的に開発途上で、安定性に欠けるモバイル未対応なのとMetal非対応なのも辛い。現状ではWindows版のみ安定動作している印象2

その他

注意: 今回はテーマの都合上、OpenGL系の openFrameworksCinder などは意図的に除外したが、実はそれぞれVulkanでの実装 (openFrameworks-vk, Cinder-Vulkan) も一応存在する。ただ、いずれも実験的で、メンテナンスされているかというと微妙な感じ。

ちなみにOpenGL系のフレームワークについては awesome-creative-coding などの記事がおすすめ。

その他、C++以外で類似のフレームワーク

まとめ

書いてみると意外と分量が多くなった。簡潔に比較すると以下の通り。

良い点 :white_check_mark: 悪い点 :x:
LLGL 豊富なAPIに対応 個別対処・難易度 高
The Forge 対応端末数・完成度 個別対処・難易度 高
Diligent Engine 同一ソースで複数対応 Metal非対応
bgfx 同一ソースで複数対応・簡単 テッセレーション対応△
oryol / sokol_gfx 組み込み・Web向き 計算シェーダ非対応
Methane Kit Windows / Mac に特化 モバイル非対応
bs::framework ゲームエンジン基盤 Windows以外は開発途上

もし自分が実践で使うとしたら、今のところ簡単さと互換性で bgfx かなぁ…。

要求性能が高いところでは LLGL か The Forge という感じだけど、この2つはもはや新しいゲームエンジンを作成する基盤として使えるレベル。ある意味で Unity / UE4 との比較になってくる気がする。

参考記事

  1. 執筆時点では、Windows用のスクリプトが準備されていないので、ビルド時・テスト時には、Mac/Linux用のシェルスクリプトを参考にしながらコマンドを打つ必要あり。

  2. ビルドについては、Hello Worldはすぐビルドできるものの、Examplesはビルド時に追加ファイルが多く、ダウンロードに失敗するケースもあり、ビルドまでにcmakeを修正したりと時間と手間がかかる。また、Macでは配布されているバイナリv1.1.0では執筆時点で正しく動作しないケースがあるようで、筆者環境では配布バイナリでもmasterからビルドしても正常動作せず。