OpenGL な UI を作るライブラリ一覧

自分が確認出来ているものをリストアップします

# AntTweakBar

古くからある GUI ライブラリ

 - http://anttweakbar.sourceforge.net/doc/

![atb.png](https://qiita-image-store.s3.amazonaws.com/0/3984/e22a52af-5ec2-cbe8-be9e-94d10521735e.png)

## 特徴

 - Windows/OSX/Linux 対応のクロスプラットフォーム仕様
 - インターフェースは C だが内部的には C++ で実装
 - Compatible/Core プロファイルに両対応
  - DirectX9-11 にも対応
 - ライセンスは zlib

## 長所

 - ドキュメント（オンライン）及びサンプルが比較的揃っている
 - ひと通りの UI が揃っており、回転や方向を設定するための UI もある
  - エフェクトやパラメータエディタであれば間違い無くこれひとつで組み立てられる
 - GLUT/SDL1.2/SDL2/SFML/GLFW2 用のイベント処理をするためのラッパーがある
 - 軽量

## 短所

 - Makefile 型なので細かいビルドが難しい
 - パラメータ設定に癖がある
  - 特にグルーピングはなれないと難しいかもしれない
 - 日本語のようなマルチバイト文字に対応していない

# GWEN

Garry's Mod の開発元が開発しているライブラリ

 - https://github.com/garrynewman/GWEN

![gwen.png](https://qiita-image-store.s3.amazonaws.com/0/3984/2758b42e-1cfb-8a99-4a41-cd64a9996128.png)

## 特徴

 - Windows/OSX/Linux 対応のクロスプラットフォーム仕様
 - 比較的デスクトップに近い GUI を提供し、見た目が変更可能
  - 1枚のテクスチャを GUI のスキンとして扱う
 - premake4 でビルドする
 - ライセンスは MIT

## 長所

 - レンダリングエンジンの差し替えが可能
  - デフォルトで以下のレンダリングエンジンを持つ
   - Allegro5
   - CrossPlatform (OpenGL)
   - Direct2D/Direct3D
   - OpenGL
   - SFML/SFML2
   - WindowsGDI
 - 凝った作りでなければこれひとつで GUI アプリケーションが出来る
 - マルチバイト文字に対応

## 短所

 - Windows 以外だとコンパイルに失敗する
  - 原因は Gwen::UnicodeString (std::wstring) のメソッドに C++11 なものに依存しているため
  - また MacOSX だと OpenGL のヘッダパスの違いを考慮していない
 - タグ付けがされておらず、開発版しか無い
 - ドキュメントがほとんどなく、サンプルがたより
 - 2014年以降更新されていないため保守が厳しい

# libRocket

モバイル方面で比較的使用実績のある UI ライブラリ

 - http://librocket.com/wiki

## 特徴

 - Windows/OSX/Linux 対応のクロスプラットフォーム仕様
 - HTML/CSS で記述する
 - CMake でビルドする
 - ライセンスは MIT

## 長所

 - HTML/CSS のためビューの分離が明確にできる
 - 冒頭にある通りモバイルの実績がそれなりにある
 - デバッガがあり、ロジックは Python で拡張できる（未検証）

## 短所

 - ドキュメントはひと通り揃ってるが、サンプルが少なく応用が難しい

# CEGUI

Ogre3D で真っ先にあげられる GUI ライブラリ

 - http://www.cegui.org.uk/wiki/index.php/Main_Page

![CEGUI.png](https://qiita-image-store.s3.amazonaws.com/0/3984/b632bb59-886b-1a8b-2ac9-ae32db50247e.png)

## 特徴

 - Ogre3D との強い連携（CEGUI 単体利用も可能）
 - DirectX/OpenGL(Core含む)/OpenGLES に対応する
 - CMake でビルドする
 - ライセンスは MIT (0.5.0 までは LGPL)

## 長所

 - ドキュメントとサンプルがかなりある
  - かなり柔軟な GUI 設計が可能
 - 日本語などのマルチバイト文字表示に対応

## 短所

 - Windows 以外だと ICU ではなく旧式である libiconv を CEGUI_STRING_CLASS 関係なく強制的に使用する
  - 個人的には ICU にしてほしい感がある...
  - 10.8 にバンドルされてる libiconv だとリンクに失敗するので macports から入れること

# imgui

 - https://github.com/AdrienHerubel/imgui

![imgui.png](https://qiita-image-store.s3.amazonaws.com/0/3984/1fe59ea7-a74d-6ac1-6097-a28c99d640d4.png)

## 特徴

 - Box2D の新しいデモで使われる予定の UI ライブラリ
 - [Recast & Detour](https://github.com/memononen/recastnavigation) に含まれる GUI ライブラリから引っ張ってきたもの
  - ちなみに Recast & Detour の開発者は後述の milligui の開発者でもある
 - ライセンスは zlib

## 長所

 - 小規模なため直接組み込みやすい
  - imgui.{cpp,h} と stb_truetype.h と imguiRenderGL2.{cpp,h} か imguiRenderGL3.{cpp,h}
 - OpenGL Core Profile に対応
 - プリミティブを描画する API がある
  - 線分、矩形、角丸つき矩形、テキスト

## 短所

 - ドキュメントがない
  - sample_gl[23].cpp が実質的なドキュメント
 - 初期化時フォントを読み込む必要があるのでフォント必須
  - 日本語フォントを読み込ませても日本語表示に対応していない
 - GLEW に依存
 - コミット数が非常に少なく、2013 年以降更新されていない

## その他

これの fork として現在 NanoUI を開発中。そのうち公開する予定

<blockquote class="twitter-tweet" lang="en"><p><a href="https://t.co/v1SmVuo1x8">https://t.co/v1SmVuo1x8</a> の NanoVG 使用 + 日本語表示対応版を内部設計と見た目をだいたいおなじにして NanoUI として自作した。そのうち github に上げる予定 <a href="http://t.co/uA9oaeenWM">pic.twitter.com/uA9oaeenWM</a></p>&mdash; しまぴょんさん@秋でもがんばらない (@shimacpyon) <a href="https://twitter.com/shimacpyon/status/516049724407697408">September 28, 2014</a></blockquote>

# milligui

比較的最近になって開発が行われるようになった新しい GUI ライブラリ

 - https://github.com/memononen/milligui

![millgui.png](https://qiita-image-store.s3.amazonaws.com/0/3984/cc656a88-572a-a451-cd43-66f5c545ba89.png)

## 特徴

 - [NanoVG](https://github.com/memononen/nanovg) と [NanoSVG](https://github.com/memononen/nanosvg) を使って描画する
  - nanovg は Core Profile 含むデスクトップの OpenGL 及び OpenGL ES 2/3 に対応する
  - 開発者は milligui と同じ
 - C言語で書かれている
  - このことは上記の nanovg/nanosvg も同様
 - 開発中なためかライセンス不明
   - 2014 年以降更新されていないためもしかしたら開発中断疑惑あり

## 長所

 - 小規模のため直接組み込みやすい
  - src/mgui.{c,h} と lib/nanos?vg
 - imgui と違い日本語フォント読み込ませた上での日本語表示に対応
  - これは [fontstash](https://github.com/memononen/fontstash) のおかげだろう
   - さらにいうと fontstash の開発者も milligui と同じである

## 短所

 - 開発中のため API はまだ不安定
 - 上記理由なためドキュメントなし
  - example/example.c が実質的なドキュメント

# blendish

[NanoVG](https://github.com/memononen/nanovg) を使って Blender 2.5 な UI を作るライブラリ。コミットログみると最初のコミットが2014年7月と執筆時点では非常に新しい

 - https://bitbucket.org/duangle/oui-blendish/overview

![blendish.png](https://qiita-image-store.s3.amazonaws.com/0/3984/a9d7eec2-065b-0f81-b5ca-0448ec5eb06c.png)

## 特徴

 - Blender な UI を作ることが出来る
  - NanoVG を使用している関係で日本語表示に対応している
  - その場合は [源真ゴシック](http://jikasei.me/font/genshin/) などの TTF フォントを使用すること
 - MIT ライセンス
 - 10/2 時点のバージョンでは nanovg をレポジトリ直下、すなわち blendish.h と同じディレクトリに配置する必要がある

## 長所

 - ヘッダーのみのため組み込みやすい
 - 小さいながらも使用できる UI コンポーネントが多い

## 短所

 - Blender な UI を好まない人にはつらい

# ImGui (a.k.a dear, imgui)

機能豊富で実績が多い GUI ライブラリ

github のトレンドに何度か上がってたので知ってる人知ってるかもしれない。名前が上記にあがってる https://github.com/AdrienHerubel/imgui とかぶってるので注意。

 - https://github.com/ocornut/imgui

どんな使い方ができるかは https://github.com/ocornut/imgui/issues/123 をみるとよいかもしれない。

![ImGui](https://qiita-image-store.s3.amazonaws.com/0/3984/c1f352ff-a910-6772-6d6e-c5d00f8006a9.png)

2015 年後期に筆者が当該ライブラリ採用を行って現在も watch を続けている唯一のライブラリ

## 特徴

 - 豊富な UI コンポーネント
 - MIT ライセンス

## 長所

 - 使い勝手の良い UI コンポーネントが多くたいてい事足りる
 - カスタムレンダリングに対応している
   - NanoVG ほどではないがプリミティブな描画が可能な API がある
   - [簡易なノードエディタが作れるレベルには使い勝手あります](https://github.com/ocornut/imgui/issues/306)
 - 組み込みやすい
   - 初期と比較して必要なファイル数が若干多いがそれでも 10 ファイル未満
   - カスタムアロケータも利用可能
 - デモが非常に網羅的でやりたいことはデモのソースコードを見ればだいたい出来る
 - レンダラに依存しない
   - サンプルとして DirectX9 と OpenGL の2つがある
   - サンプルとして実装されているレンダラが多く、Vulkan にも対応している
     - OpenGL
     - OpenGL Core Profile
     - DirectX9
     - DirectX10
     - DirectX11
     - Vulkan
   - 主要なライブラリと連携するサンプルも
     - SDL/SDL2
     - Allegro5

## 短所

 - ~~ビットマップフォントを必要とするため、非 ASCII 圏にはつらい~~
   - ~~英数字のみ、あるいはあらかじめ必要となる文字が決まっているならありか~~
 - 上記は TTF 読み込みからのテクスチャアトラス化に対応したので解消された
   - ただちょくちょく文字が `?` になる問題がありこれの問題が対策が不明

# QtQuick Controls

Qt 5.1 で導入されたコンポーネントで QtQuick の力を使っており、OpenGL で描画されている。

Qt 5.1 はやや古いマシンで遅くなる場合があり、デプロイが非常に面倒であったが Qt 5.2 で QtQuick のレンダリングエンジンの改良がなされたため実用的な速度で動くようになり、デプロイが容易になった。

![qtquick.png](https://qiita-image-store.s3.amazonaws.com/0/3984/c0575c86-495b-74a4-3d1a-7c252b3c9519.png "qtquick.png")

ちなみに執筆者が開発している [VPVM](http://hkrn.github.io/MMDAI/) というアプリケーションも QtQuick Controls を使ってます。

![VPVM.png](https://qiita-image-store.s3.amazonaws.com/0/3984/e89d413b-cc01-7be8-9637-c276fdefb850.png "VPVM.png")


## 長所

 - Qt との連携がすごく簡単
 - QML+JavaScript の構成のため UI 変更の度にコンパイルを必要としない
  - これはつまり毎回動的に解釈されるというデメリットでもある
 - IME 対応が十分なされている

## 短所

 - Qt が必要であり、かつ依存するライブラリが多くサイズが肥大化しがち
  - QtCore + QtGui + QtQml + QtQuick + QtNetwork + QtWidgets
 - 現時点で OpenGL Core Profile での動作をサポートしない

# kiUi

5/8 に github の C++ のトレンドに上がったライブラリ。おそらくキーウィ (kiwi) とかけてる

 - https://github.com/novembermonk/kiui

http://novembermonk.github.io/kiui/livedemo/kiui.html で emscripten を使った実際に動作するデモがあるので試すことが出来る

## 特徴

 - テクスチャによるスキン変更が可能
 - 入力に GLFW を、描画のバックエンドに NanoVG を使用したコードが最初から付属
 - emscripten にはじめから対応している
 - C++ で書かれている
 - zlib ライセンス

## 長所

 - 比較的豊富なコンポーネントを最初から擁している
 - （原理的に）プラットフォーム及びレンダリングエンジン中立
   - とはいうものの　GLFW を使う関係からか OpenGL 寄りの設計か
 - 外部依存性が少ない
   - NanoVG と YAML はソース組み込みで、外部のものは GLFW 以外なし
 - 日本語表示に対応している
   - NanoVG をバックエンドに採用しているから当然か
  - blendish と同じように使用する場合は [源真ゴシック](http://jikasei.me/font/genshin/) などの TTF フォントを使用すること
 - CMake でビルドできる

## 短所

 - NanoVG 以外のバックエンドを書くのは難しいかも
 - まだ開発中でドキュメントは example から読み解く必要がありそう
 - 日本語入力は不可

# GXUI

Google 社員によって現在開発中の主に Go で書かれている OpenGL の UI ライブラリ

 - https://github.com/google/gxui

評価するにはサンプル実装が少ないため一旦保留。現時点では以下でパッケージをインストールすればサンプルをビルドできる

```
go get code.google.com/p/freetype-go/freetype
go get github.com/go-gl-legacy/gl
go get github.com/go-gl/glfw/v3.1/glfw
go get github.com/google/gxui
```

# Nuklear

C 言語 (C89) のみで書かれている GUI ライブラリ

![Nuklear](https://qiita-image-store.s3.amazonaws.com/0/3984/934ec3ba-554b-5ae2-6415-0af997f4d437.png)

 - nuklear.h でビルドできる
   - ただしロジックと描画命令のみ
   - レンダリングバックエンドは別に用意する必要がある
     - demo みると以下のライブラリを使用した連携例がある
       - Allegro5
       - GLFW
       - SDL2
       - X11
    - カスタムアロケータも一応利用出来る
 - `vurtun/gui` -> `vurtun/zahnrad` の変遷歴がある
   - `Nuklear` になってから [stb](https://github.com/nothings/stb/) を明らかに意識した作りになってる 
 - パブリックドメイン

https://github.com/vurtun/nuklear

# Game-GUI

未検証。C++ で書かれている

 - 「東京」の文字を表示させてる SS みると日本語含む UTF-8 の表示に対応しているようだ
 - Visual Studio のプロジェクトしかないことからクロスプラットフォーム対応の観点で怪しい
   - 少なくともビルドするには Windows 上で Visual Studio を使うしかない
 - MIT ライセンス

https://github.com/sp4cerat/Game-GUI

# NanoGUI

2015年 に登場した GUI ライブラリ。C++ で書かれており、cmake でビルドする

https://github.com/wjakob/nanogui ([Go の移植版もある](https://github.com/shibukawa/nanogui-go))

 - OpenGL 3.x かつ C++11 な環境が必要
 - Eigen + GLFW + nanovg に依存する
   - OSX 上ではファイルダイアログのためのソースが用意されておりファイルダイアログが機能する
 - Roboto 固定のためフォントを変更する際は `theme.cpp` をいじる必要がある
   - 内部的には `nvgCreateFontMem` を呼んでるので原理的にはいじれば日本語含むマルチバイト文字に対応出来ると思われる
 - 静的ライブラリとしてビルドすると 4MB ほどの大きさに
 - MIT ライセンス

![nanogui.png](https://qiita-image-store.s3.amazonaws.com/0/3984/44dd9f13-3176-4c59-d8fb-c561fe04e176.png)

# NVIDIA Widgets

未検証。C++ で書かれており、cmake でビルドする

https://code.google.com/p/nvidia-widgets/

 - NVIDIA の SDK サンプルで使われている UI ツールキット
 - 最終更新が 2009 年でおそらくもう保守されていない
 - MIT ライセンス

## MicroUI

https://github.com/rxi/microui

- 見た目は nuklear に近い
- サイズを重視しており本体となる `microui.c` は 1200 行ほど
  - その分提供される機能は少ない
  - デモバイナリも 100KB 満たない
- 描画は自分で書く必要がある
  - 実装方法は [デモのソースコード](https://github.com/rxi/microui/tree/master/demo) (OpenGL) をみるしかなさそう
- MIT ライセンス

![microui.png](https://qiita-image-store.s3.amazonaws.com/0/3984/3caf2427-193a-3498-a5bc-22db2c2bcc02.png)

# その他

他にも同じ目的を持つライブラリとして [SFGUI](http://sfgui.sfml-dev.de/) と [Gorilla](https://github.com/betajaen/gorilla) があるけど両者とも特定のライブラリに強く依存している点 (SFGUI は [SFML2](http://www.sfml-dev.org/) に依存し Gorilla は [Ogre3D](http://www.ogre3d.org/) に依存する) で一旦選択肢から外した。

1 から作りたい場合は [NanoVG](https://github.com/memononen/nanovg) が OpenGL を使った UI の実装デザインの参考になるだろう。NanoVG については著者が書いた「[NanoVG で HTML5 Canvas の力を C/C++ にも](http://qiita.com/shimacpyon/items/b6c0f2e031a4f4d6aefa)」を参照すること。