2015/08/10

GUI付きのビューアをつくりたいのでocornut/imguiを使ってみた

こんにちは.@rootxです.

レイトレした結果をどう確認していますか?

PNGファイル出力をしていますが,毎回開くのも嫌だし,
入力ファイル指定や途中経過などなどをGUIから行いたいです.

でサクッとビューアをつくろうと思って,
過去に使ったことのあるGLUIを使おうと思いましたが,今回はGLFWを使ってウィンドウ表示するため使えません.

そこで最近のGUIライブラリを調べつつ,ImGuiというライブラリを使うことにしました.

試したGUI

見た目も良さげでhomebrewでインストールできたので試してみましたが,
osxのretinaディスプレイに対応しておらず,描画は可能なもののマウス位置と整合性がとれておらず使用を断念しました.

GWEN(https://github.com/garrynewman/GWEN)

1年くらい更新されていないのと,osx対応されていなさそうなのでやめ.
見た目は一番好みだったのだけれど.

CEGUI

ヘビィそうなのでやめとく.

AdrienHerubel/imgui (https://github.com/AdrienHerubel/imgui)

かなり良さそうだったけれど,あまりにもコミットが少なくメンテされてなさそうなのでNG.

blendish

blender-likeすぎて辛い.あと依存関係がヘビィ.


ocornut/imgui


ハマりポイント

1. 文字がちっちゃい=全体が小さい

retinaに完全対応していないのか,文字が極めて小さく表示されてしまいました.
ボタン等はちゃんとマウス位置に反応しているので,次の2通りの方法のどちらかで,暫定的に回避できました.

フォント読み込み時に,フォントサイズを大きくする.

  io.Fonts->AddFontFromFileTTF("resource/uzura.ttf"16.0fNULL, io.Fonts->GetGlyphRangesJapanese());
→ "16.0f""32.0f" にするとか.

※ README.mdの文字列サンプルは間違ってるので注意.第3引数にNULLを指定する必要があります.

グローバルスケールなるパラメータを2倍にする
次のようにウィンドウサイズとフレームバッファサイズを比べて掛けとく.
    {
        // osx retina 2x
        int w, h;
        glfwGetWindowSize(window, &w, &h);
        int ww, hh;
        glfwGetFramebufferSize(window, &ww, &hh);
        io.FontGlobalScale = ww / w;
        fprintf(stderr, "window(%d, %d) : frameBuffer(%d, %d)\n", w, h, ww, hh);
        
        io.UserData = &input;
    }


2.  2フレーム目から描画されない;

描画は次のような感じで行けますが,適当に拾ってきたModernなOpenGLサンプルでテクスチャ付き四角形を描画していたら,2フレーム目から描画されませんでした.

  while (!glfwWindowShouldClose(window))
    {
        //----- ImGui のセットアップ ----
        ImGuiIO& io = ImGui::GetIO();
        ImGui_ImplGlfwGL3_NewFrame();
        { // 〜〜 ImGuiのメニューなど
        }

        
        // ここら辺に自分の描画したいコードを書く

        ImGui::Render();
        glfwSwapBuffers(window);
        glfwPollEvents();

    }

かなり悩ましい問題でしたが,GUIコントロールのレンダリング時に glEnable(GL_BLEND)されているためでした.
まあそういうこともあるよね.



あまり使用実績がないので,ググってもあまり情報が出てこないのが辛いかな.
コンパクトにいろんな機能が用意されていることと,活発に更新されていることが優位な点なので,今後もウォッチしていきます.

でわでわ.

0 件のコメント:

コメントを投稿