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)されているためでした.
まあそういうこともあるよね.



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

でわでわ.

2015/08/02

買った本

こんにちは.@rootxです.



昨日のお昼くらいにポチったのですが,約8時間で受け取れました.
お急ぎ便は早いな!

 でわでわ.

2015/08/01

読んだ

最近読んだもの。


The comprehensive PBR guide

基礎基礎の確認に丁度いいです。
ただし、エンジニアというよりモデラーとかそっちの人向けかな。
Substanceを開発してる企業。

日本語版も公開されている方がいます.
http://www.slideshare.net/nyaakobayashi/pbr-guide-vol1jp
http://www.slideshare.net/nyaakobayashi/70100srgb180255

(ボーンデジタルでも配布していたけれど,認証が必要でしたので未確認)




2015/07/25

とりま

こんにちは.@rootxです.






> RenderTime: 28171.4
いけてなさすぎる.

 でわでわ.

メモ

レイトレ系の話は,別のblogに書いてたのだけれど,
bloggerがエラーを出して死んでしまったのでこちらに移植しました.

何が行けなかったんだろう….
独自ドメインで動かそうとしたからかなあ.
でも設定自体は済んでて,ちゃんと独自ドメインでアクセスできるようになってたのに.

ううん.

XCodeのLLVM(clang)でOpenMPを使おう(解決)

こんにちは.@rootxです.

高速化って大切ですよね.
結果が出るまで待てない,AWSに余計なお金を払いたくない,などなど,進化した計算機といえどもCPU資源を使いきって高速に処理する需要はなくなることはありません.

CPU自体の進化も,クロックの高速化競争の集結を迎え,シングルスレッド性能は頭打ちになってきています.
この背景には,半導体プロセス微細化によるリーク電流や,数GHzを超えると電子の移動速度も際どくなる等が要因として挙げられていたと記憶しています.
# 消費電力あたりの性能,という指標は個人的には好きではありません….

そのため,現在のCPUではマルチコア,ハイパースレッド等の技術によって,処理を複数同時に実行できることでCPU全体としての性能向上を維持しています.


プログラミング技術においてもその方向に進んでいて,いかに並列処理をするか,というのが現代的なプログラムの重要なポイントの1つとなっています.


様々な並列処理手法がありますが,C++で開発する際に,お手軽に並列化する方法の1つにOpenMPというライブラリがあります.
このOpenMPは,名前がちょっとOpenGLに似ていますが全然関係なくて,並列処理を簡易的に実装する

しかも最近のVisual Studio(VS2010以降?)では標準的に使えるようになっていて,
プロジェクト設定をちょいちょいと変えてあげるだけで有効になる,とってもとっても便利なライブラリで,特にレイトレのような並列化の容易なアプリケーションでは,たった1行追加するだけでバリバリ並列化できちゃう夢のような仕組みです.


しかし残念なことに,OSX上のXCodeで開発している場合は,VSほど簡単に有効にすることはできないようです.これはXcodeの標準コンパイラがLLVM clang3.5であり(MacOS 10.9.5 Xcode6.2時点),ちゃんと対応されていないバージョンのためです.
そのうち標準対応されるのではないか,と想像していますが,現時点では望めません.

# 10.10の環境は未調査.今のところ,あのフォルダアイコンのださいOSをメイン環境として使う気がないため.


ということで,自前でスレッド処理するが,gccに切り替えて使うべきか,いっそのことWindowで開発するか,といった悩ましい問題が目の前に立ちはだかっているのです.

いろいろ探していましたが,OpenMPを有効化したclang-ompが配布されていたので導入す


ここから本題です.


Xcodeで clang-omp の使い方



  1. homebrew でclang-ompをインストール: brew install clang-omp
  2. Xcodeプロジェクトを作成
  3. ビルドセッティング(Build Setting)で:
    1. 新しいユーザ定義設定 CC を次の値で作成:/usr/local/bin/clang-omp
    2. -fopenmpOther C Flagsに追加
    3. /usr/local/includeHeader Search Pathsに追加
    4. Enable Modules (C and Objective-C)Noにセット
  4. ビルドフェーズ(Build Phases)で:
    1. /usr/local/lib/libiopm5.dylibLink Binary With Librarianに追加
  5. (*)/usr/local/binにhomebrewでインストールされたclang-omp++というエイリアスがあるので,clang++-ompに名前を変更


これで完了.あとは #include <libiomp/omp.h>して,#pragma omp〜〜を使うだけ?.

注意

なぜかビルドできませんでしたが,上記手順の5を追加することで上手く動くようになりました.
どうやらXcodeは,C++のコンパイル時にCCに定義されたものを自動的に置換しているようです.その際に,末尾に++を追加するのではなく,clangをclang++に置換するようです.(途中のバージョンで仕様が変わったのかな…)

ということで,暫定的な対策ですが,clang-omp++の名前をclang++-ompにすることで,上手くそれを使ってくれるようにできました.




補足

glmがコンパイラを認識できずに次のエラーを出しましたので対応しました.
/usr/local/include/glm/detail/setup.hpp:287:2: error: "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message."#error "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message." ^1 error generated.Command /usr/local/bin/clang-omp failed with exit code 1

TODO

後日,効果を検証します.
なんかビルド時のエラーの出かたが変化した気がする…


でわでわ.

1024 x 768 with 20 path /subpx and 2x2 subpixel

こんにちは.@rootxです.



うーん遅い.

でわでわ.