エイリアシング誤差の可視化

※2015/10/04 やっぱりHLSLのコードが間違えていたようで修正しました。

LogPSMで出てきたエイリアシング誤差の可視化を実装してみました。
実装に当たっては,”Robust Hard Shadows”のAppendix A.3 Sampling rateと,博士論文でない方のLograthimic Perspective Shadowの論文中の式84, 式85を参考にしました。
RobustHardShadows_Fig_5_6

※図はMartin Stingl, 2011, Robust Hard Shadows. p.58より引用。

論文中で使われている下の画像ようなものを表示するためのものです。
LogPSM_Fig_5_32

※図はLloyd, B. 2007. Logarithmic perspective shadow maps. PhD thesis, University of North Carolina. p.116 より引用。
float3 VisualizeError( float2 shadowCoord, float2 shadowMapSize )
{
    const float3 values[] = {
        float3( 0.0f,       1.0/7.75,   1.0f/7.75f ),
        float3( 1.0f/7.75f, 1.0f/3.25f, 1.0f/3.25f - 1.0f/7.75f ),
        float3( 1.0f/3.25f, 1.0f,       1.0f - 1.0f/3.25f ),
        float3( 1.0f,       3.25f,      2.25f ),
        float3( 3.25f,      7.75f,      4.5f ),
        float3( 7.75f,      10.0f,      7.75f ),
    };

    const float3 colors[] = {
        float3( 0.2f, 0.0f, 0.0f ),
        float3( 1.0f, 0.2f, 0.0f ),
        float3( 1.0f, 1.0f, 0.0f ),
        float3( 0.0f, 1.0f, 0.0f ),
        float3( 0.3f, 0.8f, 1.0f ),
        float3( 0.0f, 0.0f, 1.0f ),
        float3( 0.0f, 0.0f, 0.2f )
    };

    float2 ds = shadowMapSize.x * ddx( shadowCoord );
    float2 dt = shadowMapSize.y * ddy( shadowCoord );

    float error = max( length( ds + dt ), length( ds - dt ) );

    float3 result = (float3)1.0f;
    [unroll]
    for( int i=0; i<6; ++i )
    {
        if ( error >= values[i].x && error < values[i].y )
        {
            result = lerp( colors[i], colors[i+1], (error - values[i].x) / values[i].z );
            break;
        }
        else
        {
            result = colors[6];
        }
    }

    return result;
}

Uniform Shadow Mapに適用すると下記のようになります。
test_visualize
うちのサンプルで公開しているものは,それなりによさげに見えます。
Prallel-Split Shadow Mapの方にも適用してみました。
test_visualize2
PSSM適用するまでもないシーンなのですが,一応緑色が占める割合が多いので,適切にシャドウマップが適用されていることが分かりますね。
奥の方はこんだけちっこいシーンなので当たり前ですがオーバーサンプリング気味になっているので,カスケードの枚数を減らしても大丈夫そうな気がします。
再びUSMで2048×2048だったシャドウマップのサイズを256×256に落とすと下記のようになります。
test_visualize3
test_visualize4
奥の方は緑色になっているので確かにシャドウが適切に表示されていますね。
手前部分は赤から黄色に近い色になっているので,確かにちょっと汚いのが見て取れます。
こういう感じでデバッグに結構役立ちそうです。

もし実装間違え等があれば,正しい実装と一緒に指摘していただけると幸いです。

超雑訳 Logarithmic Perspective Shadow Maps (11)

D. Brandon Lloyd氏の博士論文である,Logarithmic Perspective Shadow Mapsを適当に訳していくことにします。
今回は結論について記しているChapter.8を訳していくことにします。
誤訳があったりなど,日本語としては多々見苦しい点があるかと思いますが,そこはご容赦ください。

(さらに…)

超雑訳 Logarithmic Perspective Shadow Maps (7)

D. Brandon Lloyd氏の博士論文である,Logarithmic Perspective Shadow Mapsを適当に訳していくことにします。
前回はChapter.5の途中まで和訳しました。今回はその続きからです。
誤訳があったりなど,日本語としては多々見苦しい点があるかと思いますが,そこはご容赦ください。

(さらに…)

レイトレ合宿3!!! 参加レポート

こんにちわ。
日々Gitのマージコンフリクトと格闘しているPocolです。

今年もレイトレ合宿に参加してきました。
昨年と同じく今年も河口湖カントリーコテージBanにて開催されました。
まず、今年は去年とちがってレクリエーションが充実していました。
レイトレクイズがあり,その後皆でピンホールカメラ作成をしました。

IMG_1871
また,このピンホールカメラの撮影が難しく,シャッター時間何秒にした?などやり取りで,初めての人とも少し話す機会ができ良い時間となりました。
なんとか,自分も最後にはカメラを改良して風景らしきものを写真に収めることができました。
IMG_1875
ちなみに作成したピンホールカメラは下のような感じです。
IMG_1876

ピンホールカメラによる撮影会のあとは,お待ちかねの夕食です。
今年はnikqさんとtomohiroさんが買い出しに行ってくれて,素晴らしい夕食を味わうことができました。
見てください,このステーキの肉。
IMG_1872
VR野郎は唐揚げで盛り上がっているらしいですね。
レイトレ野郎は肉で盛り上がります。結局みんなで8kgを平らげました。



さて,夕食の後はお風呂とセミナーです。
今年は新しい風呂ができたみたいですが,タイミング逃して結局行けずじまいでした。
セミナーはperimさんによるボリュームレンダリング入門から始まりました。
SlideShareにもうスライドが上がっているようですので,気になる方はチェックしてみてください。


続いて,shockerさんによるパストレーシング詳細についての解説がありました。
後日スライドがアップされるようなので,レイトレ合宿3!!!のページをチェックしておきましょう。
その後,CG鑑賞会の予定でしたが,思ったよりも遅い時間になり、そのまま就寝となりました。

翌日,ついに成果発表です。
ちなみに今年は下記のような画像を12分程度でレンダリングしました。
salty3
今年は,仕事の方が忙しくて(実は今も絶賛忙しいのですが…),また引っ越しも重なりあまりレンダラーを書く時間がさけませんでした。最初はフルスクラッチで書き直すぞ~とか思っていたのですが,「あ、やべ。無理」ということに気づき,そこからの方向転換でした。
去年はDOFやIBLを入れられなかったので,まずはそのあたりを入れたくて手っ取り早く取り掛かれそうなのがIBLだと思ったので,IBLを実装してみました。
…が,実はうまく実装できておらず,ライティングしている割には暗い結果になります。ちなみに最初の時点ではピンホールカメラを使っているので,何か実装がまずい点がありそうです。
結局,提出までに直すのは時間的に無理と判断して,明るさを補うためにスフィアライトを一灯焚きました。一応ライト焚いたので,なんとか影が出るようになりました。やっぱり影は重要ですね。
リアルタイムの方でもこれくらい綺麗な影を出したいもんです。
あとは薄レンズも実装しました。わりと手軽に実装出来て,それっぽい画がでるので結構いいですね。
来年はもうちょいちゃんとしたカメラモデルを取り入れたいところです。
あとは,地味にインスタンシングに対応しています。上のシーンですが,読み込んでいるメッシュは3種類です。Coke用のメッシュ,Pepsi用のメッシュ,紙コップ用のメッシュの3種類で,あとはインスタンシング使ってレンダリングするようになっています。
これ,去年色々と表示したいなぁ~と思って,いちいちメッシュコンバートするのが面倒だったので実装しました。これあるとだいぶ楽ですね。
あとは,テクスチャをバイリニアフィルタを利くようにしました。バイリニア程度でも,ちょっと重くなったのでバイキュービックは結局実装しませんでした。
そのほかomochiさんのブログ記事をもとにSAHのBVHも実装してみたりしたのですが,なんか実装がうまくいっていないのか,去年作ったBVHの方が構築もトラバーサルも速かったので,結局去年作ったOBVHのバグ修正をして本番に使いました。早期打ち切りが入ればさらに爆速になるのですが,穴が開くようになってしまったので,こちらも結局使わずじまいです。
はやめにBVHのデバッグ環境を整えなきゃなと思ったので,何とか年内のうちにデバッグできる仕組みを作ろうかと思います。
今年は,色々と去年得たノウハウを元に画づくりしたので,4位という好成績を得ることができました。
来年はもう少し順位上げたいなぁ~と思います。
みなさん、レイトレ面白いのでレイトレしましょう。

レイトレ合宿参加者の皆さん、主催のholeさん,qさんお疲れさまでした。
また,来年の開催期待しています!!