!名前 Naoki !実装する論文 Triple Product Wavelet Integrals for All-Frequency Relighting !実装ログ !2004/05/10 実装開始!! とりあえず去年の 「All-frequency shadows using non-linear wavelet lighting approximation」 の実装をした秘密のソースを改造していく。 いきなりトリプルプロダクトを実装するのは困難なので、去年のデモのwavelet分解の部分を昨年度のMRA(多重解像度解析)から今年やっている分解に切り替える。 去年の分解方法(MRA)は、高周波を切り出して低周波のみを分解して行く方法。 それに対して今年の方法は、高周波、低周波の区別なく全ての周波数帯をHaarWaveletで分解する方法と言えます。(論文では、ScaleFunctionが最も低い周波数で、レベルが深くなるにつれて高周波成分の分解になっている。と思います) そのため、私の予想ではMRAよりも圧縮率(係数を落とす割合)を高くしても大丈夫だと思います。まずはそこらへんをチェックしてみたいので、今年の分解方法に切り替える部分を実装してみたいと思います。 まずは論文にあるようにHaarWaveletのMotherWaveletの符合の配列を作ります。 // sign static float quad_signs[ 3 ][ 4 ] = { { 1.0f, -1.0f, 1.0f, -1.0f }, { -1.0f, -1.0f, 1.0f, 1.0f }, { -1.0f, 1.0f, 1.0f, -1.0f } }; 論文にある関数 // return sign inline float sign_of_quadrant( const unsigned int type, const unsigned int qx, const unsigned int qy ) { return quad_signs[ type ][ qy * 2 + qx ]; } 残りも書こうと思ったのですが、あまりにも長いので添付しました {{ref wavelet.cpp}} *decomposeという関数が、今年の分解方法を実装した関数です。 *calcWaveletCoeffという関数は、補助関数で式(18)のM, l, i, j を指定してWavelet係数を返す関数です。 !2004/05/13 先日実装した今年度の分解方法をテストしてみた。結果は、MRAと比べておよそ30%ほど係数を少なくしてもほぼ同じくらいのクオリティを出す事ができました。凡そ一頂点辺り200〜300くらいの係数で十分です。画像を見せたいのですが、とある理由により現在は公開できず・・・。もうちょっとしたら画像出せます・・・。 今年度の目玉であるBRDFの部分を実装を開始した。とりあえずPhongのBRDF(もちろんModified Phongです)を試作してみている。ソース自体は大体できたので、これまた近日中にきちんとできているかテストする予定。ここを超えればいよいよ三重積の部分の実装です。 !2004/05/17 多分できました!!荒いメッシュでやっていたのであれですが、それっぽい質感になりました。数日中に細かいメッシュでの画像をお見せできると思います。一段落したらちゃんと解説しようと思います!! !2004/05/19 本日レース管理委員会より警告状が来て、きちんとソースを公開しないと出走資格を取り消すぞ。オラオラーとの事でした。上に書いてあるとおり、秘密のソースなので公開できない部分が多いのですが、トリプルプロダクトに関しては公開できるのでソース公開しまっす。解説をしたいのですがどこからすべきなのでしょう・・・ wavelet関係のHeader {{ref wavelet.h}} wavelet関係のSource {{ref wavelet.cpp}} BRDF class にはBRDF用のwavelet係数、また論文にあるようなparent_sumのTableを 保持する変数を持っています。wavelet係数に関しては8bitに量子化します。 parent_sumのTableは数が比較的大きくなるので量子化していません。 その他decompose用の関数なども書いてあります。 三重積の計算を行うSource {{ref relighting.cpp}} 論文に書いてあったような組み合わせで三重積を行う部分です。しかし論文にあったような係数では上手くいかず、数式から正しいと思われる係数を再計算してある。これは論文の間違い??基本的には、可視情報を主体にループを回している。