読者です 読者をやめる 読者になる 読者になる

SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

HDRビューア作成

プログラム

気がつけば、2か月くらい放置してしまっていたので、久し振りにレンダラ関連のネタを・・・

4月からうちの研究室の新入生を対象として、レイトレーシングのプログラムを組んでみる、というゼミを行うのですが、そのゼミの資料づくりのついでに自分のレンダラをキレイに組みなおしたりしていました。
昔自分が組んだプログラムを今読みなおしてみると、if文での分岐を避けたかったのか、妙なところで関数ポインタをつかっていたりでものすごく読みづらいものでした。
せっかくC++で組んでいるので、もっとスマートに仮想関数を用いてポリモーフィズムを生かしたプログラムに書き換えてます。

HDRビューア

話は飛びますが、GIに興味あるのになぜか今まで手を出していなかったHDR画像にちょっと手を出してみました。




で、C++/CLIでUIを付けてビューアにしてみましたw
露出を変えてbmpで保存できるってだけなのですが・・
左の方が、後で説明するトーンマッピングの式で露出-1、右が-9くらいにしたものです。

.hdr形式のフォーマット

よく使われるHDRIの形式の、hdr形式を読み込んでみました。
ローダも比較的作りやすいので、今回はこのフォーマットを使いました。
この形式では画像をRGBEの4つの成分で管理します。
RGBがそれぞれ8bitで整数を表して、Eが指数成分です。
このままのデータ構造だと扱いづらいので、hdrファイルを読み込んで、rgbの値をfloatで保持するようにしました。


この形式は、最初の部分がテキスト、その後改行をはさんでバイナリで画像データが続くという構成になっています。
テキストの部分には、画像サイズや画像の並びに関する記述や露出・ガンマのパラメータが書いてあります。
バイナリの部分は、画像の一列分のRの値をランレングス圧縮したもの。次にG,B,Eという順番で格納されています。
フォーマットの解説はt-potの↓このページがわかりやすかった。
http://tpot.jpn.ph/t-pot/program/102_HDRI/index.html

あと、↓ココのページでhdr形式のローダのプログラムが公開されていました。
http://www.graphics.cornell.edu/online/formats/rgbe/
今回はこのプログラムを元に作りました。
(ただ、テキスト部分の読み込みが一部問題アリ。FORMATというパラメータを読み込んだところでテキストの読み込みを途中でやめてしまうので、パラメータを書く順番が違ったり、途中に空白・タブを含んでいるとうまく読めなかったりしたので、その辺を修正して使いました。)


こちらのページにたくさんのhdr画像が公開されています。
http://www.debevec.org/IBL2001/


その他参考ページ
http://lucille.sourceforge.net/blog/archives/cat_iblaaaaaaaaaaaaaa.html

トーンマッピング

HDRのデータはfloatで0.0〜1.0をはるかに超えた大きな値まで入っているので、そのままではディスプレイにうまく表示できません。
画像中の最少値と最大値が0.0〜1.0に入るように線形に変換するだけだと、画像の一部の特に明るい部分が非常に大きな値になるために、ほとんどの部分が暗くなってしまいます。
そこで、うまくHDRのデータをディスプレイに表示できる範囲に収めるように調整するために、トーンマッピングをする必要が出てきます。
トーンマッピングはこの辺の論文がよく話に上るのですが、
http://www.cs.ucf.edu/~reinhard/cdrom/

今回は↓コチラの記事で紹介されていた方法がキレイだったのでこの方法を実装してみました。
http://hdndiary.exblog.jp/1288120/
元ページはココ
http://freespace.virgin.net/hugo.elias/graphics/x_posure.htm
上の画像は、この式でトーンマッピングを行いました。


以下雑文

hdrのフォーマットを読んでて思ったんだけど、このフォーマット無駄に柔軟すぎるんじゃないかな、と。
画像データのランレングス圧縮してる点もだけど、画像データの保存方向が行がXで列がY方向とかその逆とか、いろいろ変えられるようになっていて、すべての形式に対応できるようにローダを作るのはかなりめんどくさそう。
画像データの縦横の並びが変わるのってそんなにメリットあるのかなぁ、と。

fuck!! SxS

読み込みルーチンを作ったあと、ビューアにしてみたくてvisualstudio2008でC++/CLIでUIをつけたのですが、ほかのパソコンにexeを持っていったら動かない・・・・
「アプリケーションの構成が不正です」といったエラーがでてくるのです。
visualstudio2008は.net2.0での開発ができるので、.net2.0で作ったのですが、visualstudio2005を入れていてVS2005のSP1も入れている環境に持っていっても動きませんでした。


いろいろ調べてみたら、visualstudio2005で作成したexeを他のパソコンに持っていくと、マニフェストとかSxS(サイド バイ サイド実行)とかの関係で動かないというトラブルがよくあるようです。
今回は2008で作ったものを持って行ったので、他にも原因があるのかも知れないのですが、要調査ってことで・・・orz