前回、Cinder上でImGuiの環境を整えた筆者が、Cinderがデザイン系の処理がメインの環境だということを知り、より汎用的な環境であるGLFWとImGuiの環境を整えようとした記録です。
慣れないC++の環境、Makefileやgccの仕様に悩まされました...。
<環境>
Windows10 Home 64bit
gcc 4.8.1
・ImGuiとは?
ImGuiはOpenGLやDirectXで動く軽量のGUIのツールを簡単に作ることができるフレームワークのことです。
主にデバッグやシミュレーションでの値の調整に使われるみたいですね。
コードの少なさとデザインよさで最近注目を浴びているようです。
個人的にドット感が好きなので選択しました。
・ImGuiを動かすOpenGLの環境選び
さて、ImGuiというものが分かったところで、次に環境選びです。
OpenGLの中にも色々環境があり、個人で自由に選ぶことができます。
前回選択したCinderは、グラフィック関係の人が好んで使う環境みたいです。
どんな環境でやるかを迷ったときは、海外のサイトですけど、OpenGLのWikiを参考にしてみるといいかもしれません。
( https://www.khronos.org/opengl/wiki/Related_toolkits_and_APIs )
今回はGLFWという環境で作っていきます。
・環境整備(ダウンロード)
ということで、GLFWを入れていきます。
まずは、GLFWのサイトに行きましょう
GLFWのサイト( http://www.glfw.org/ )
次に、上のダウンロードを押します。
「32-bit Windows binaries」のボタンを押してダウンロードしましょう。
これでGLFWを入手できました。
次に、今回のメインであるImGuiをダウンロードします。
Githubからダウンロードできるので、ちゃちゃっとしましょう。
(URL: https://github.com/ocornut/imgui )
これでダウンロードするファイルは全部です。ファイルの設置に移りましょう。
・環境整備(ファイル設置)
まずは、GLFWを適当なディレクトリに解凍しましょう。
そして、lib-mingwの中にある.aファイルを別の場所に置いておきましょう。
この処理をしないと、あとでエラーが出ます。
次に、ImGuiを適当なディレクトリに解凍しましょう。
ファイルの設置は以上です。
...ですが、これだけではImGuiは動きません。
そして、なによりもファイルが複数あるので管理が面倒です。
ということでファイルを静的ライブラリにまとめましょう。
まず、私が作ったImGuiのファイルをまとめてくれるbatファイルをダウンロードしてください。(実行にはgccが必要)
(URL: https://www.dropbox.com/s/l06nr4f1wh8wuqt/glfw_imgui.zip?dl=0 )
まず、ダウンロードしたファイルの中にある『generate_folder.bat』の中の
set GLFW_PATH=
に、GLFWのパスを書いてください。
(『C:\~~~~~\glfw-3.2.1.bin.WIN32』のようになると思います)
そして、このファイルを先ほど解凍したImGuiの『imgui-master\examples\opengl3_example』に置き、実行してください。
すると、『include』というフォルダにヘッダファイルが、『src』というフォルダにソースファイルがまとまると思います。
これで使いやすくなりました。
このままでも使いやすいのですが、次に、編集することがないであろうsrc内のファイルをコンパイルしてまとめてあげます。
『build_Mingw.bat』というファイルを同じように『imgui-master\examples\opengl3_example』に置き、実行してください。
すると、『mingw_obj』というフォルダに何個かの『.o』ファイルと『libImGui.a』ができたと思います。
この.aファイルをコンパイル時に組み込むことで、ImGuiをGLFW上で使用することができるようになります。
・ImGuiを実行する
それでは、ファイルを作っていきましょう。
まず、main.cppを作ります。(さっきのzipのsampleフォルダ内に置いてあります)
GLFWでImGuiを行う場合は次のようなヘッダが必要になります。
#include <imgui.h>
#include <imgui_impl_glfw_gl3.h>
#include <GL/gl3w.h>
#include <GLFW/glfw3.h>
このヘッダが一つでもないとエラーが出ます。
詳しいことはGLFWのリファレンスとImGuiのリファレンスを読んでくださいね。
あとは、sample内のmain.cppのように書いていきます。
int main()
{
// GLFWの初期化
if (!glfwInit()) {
return -1;
}
GLFWwindow* window = glfwCreateWindow(640, 480, "hoge", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
//glfwShowWindow(window);
gl3wInit();
ImGui_ImplGlfwGL3_Init(window, true);
while (!glfwWindowShouldClose(window)) {
// バッファのクリア
glClearColor(0.2f, 0.2f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplGlfwGL3_NewFrame();
ImGui::Begin("config 1");
ImGui::Text("Hello ImGui on GLFW!!!!");
ImGui::End();
ImGui::ShowTestWindow();
ImGui::Render();
// ダブルバッファのスワップ
glfwSwapBuffers(window);
glfwPollEvents();
}
ImGui_ImplGlfwGL3_Shutdown();
// GLFWの終了処理
glfwTerminate();
return 0;
}
ちなみに、
gl3wInit();
ImGui_ImplGlfwGL3_Init(window, true);
ImGui_ImplGlfwGL3_NewFrame();
ImGui::Render();
ImGui_ImplGlfwGL3_Shutdown();
この5つは必須の要素です。
これが書けたら、コンパイルをしましょう。
コンパイル時に
・先ほど作ったmingw_objファイルのパス
を-Iオプションで、
・GLFWのmingw-libのライブラリのパス
を-Lオプションで、
・opengl32
・glfw3
を-lオプションで追加する必要があります。
エラーが出る場合は上のどれかが抜けている場合だと思うので、ご確認を。
そして、できたexeを実行すると次のような画面が出ると思います。
実行するためにglfw3.dllをexeと同じフォルダにコピーしましょう。
すると、
これでImGuiをGLFW上で動かすことができました!
長かった...
・余談
Makefileを利用すると簡単にできますので、お試しを。
sampleにあるMakefileは、
IMGUI_EXAMPLE_PATH:=
GLFW_LIB_PATH:=
に、ImGuiのOpenGL3のサンプルのパス、GLFWのmingw-libのパスを入れて、mingw32-makeをすると簡単に作ることができます。
-mwindowsオプションをつけるとコマンドプロンプトの画面が出ない設定でコンパイルができるのでつけておくといいかもしれませんね。
Comments