レイトレ合宿6に参加しました。

Share

こんにちわ。
Pocolです。

今年もレイトレ合宿に参加しました。

今回の開催地は神津島で,海がもの凄く青くてとてもよかったです。

昼はholeさん達とバーガー食いに行きました。


バケツポテトは残念ながら上げ底されています。
夕方になると,ホテルからは夕陽が見られ,とても綺麗でした。

さて,レンダリングの方ですが
順位はブービーでしたが,エースコンバット5好きなので,ブービーでもいいかなと思っています。…というのもの、今年準備が間に合いませんでした。個人的には順位はどうでもいいんです。参加することに意義がある!!
ちなみに描画はこんな感じです。

いくつかのフレームで黒画面が出るのはレンダリングが間に合っていないという仕様です(設計バグ)。

本当はボリュームレンダリングをする予定でしたが,間に合わず提出日当日になって,急遽方針を転換してパストレで行くことにしました。
最終提出日にエラーが発生してレンダリングされないなどの不具合があったので,レンダリングされただけもでも御の字かなと個人的には思っています。(本当黒い画像しか表示されないと思っていました)
Next Event Estimationの実装や交差判定処理箇所の設計見直しなど,1日で出来そうなことはとりあえずやりました。所々バグがあるのはまあ実力無さなので,そんなものでしょう。

今年はアニメーション部門に応募しました。
1フレーム12秒でレンダリングして60枚を出力することに目標にしました。
他の静止画部門の方々と比べるとレンダリング時間は1/10程度なので,ノイズまみれだし,特に何にもやっていないので汚いっちゃ~汚いです。(むしろ,こっちは10倍近くサンプルが少ないので,他の人の方が10倍近く綺麗じゃないとそもそもおかしい)
アニメーション部門に応募してみて,色々と課題とか問題があって難しいなと感じる部分を「面白いな」と錯覚してしまったので,来年もアニメーション部門に応募してみようかと思います。人と同じことをしていても面白みがないので,他の人がやらない分野には積極的に力を注ぐひねくれた人ですね。何よりも静止画よりも動画の方が個人的には血が騒ぎます。やりがいがあるし,やっぱり動くものは面白い。

あと今年はシークレットイベントとして,「レイトレ検定」が行われました。

特に難しかったのはサンプリングを選ばせる問題です。皆さん,これ分かります?

自分は,6問中3問正解できたようでした。まだまだ勉強が足りませんね。
検定の最終結果は77点で,何とか赤点は免れることができました!

来年はもう少し落ち着いてレイトレ合宿に時間を割けると思うので,来年こそは頑張りたいなぁと思います。GPUレイトレーサー書きたいなぁ…
日々是精進ですね。

来年も是非参加したい!
レイトレ合宿運営の皆さん,どうもありがとうございました。

レイトレ合宿6Ω

Share

こんにちわ。
Pocolです。

明日からレイトレ合宿6です。
今年の開催地は神津島ということで,ワクワクしています。

合宿終了後にレポートを上げる予定なので,
楽しみにしていてください。

毎年忘れるので

Share

レイトレ合宿の季節ですね。
毎年,提出する際にDLLの同梱を忘れて実行できないことが多々あるので,忘れないようにメモっておこうと思います。

基本的にDependency Walkerで依存を見つけておきます。
次に,動作確認ですが自分の場合はまっさらなマシンで確認します。
さすがに物理マシンを用意するのは面倒なので,仮想PCを用意してWindowsをインストールした直後の状態で起動するかどうかチェックしています。

今回ハマったのは,dllを持ってくる場所。
最初はWindows/SystemWow64あたりから持ってきていたんですが,どうも起動しない。
ググってみたところ,VC直下から持ってこないとダメっぽいです。

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x64\Microsoft.VC140.CRT
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x64\Microsoft.VC140.OpenMP

からDLLを持ってきたところ正常に起動するようになりました。

起動に必要だったのは
msvcp140.dll
vcomp140.dll
vcruntime140.dll
の3つでした。

来年からは実行の際に忘れないように…。

レイトレ合宿に行ってきます。

Share

今年もやってまいりました。
そうです,レイトレ合宿です。

今日・明日と2日間参加してきます。
今年は作品と呼べるものは作れなかった。
今年の失敗を忘れないようにメモとして残しておこうと思う。

そもそも,レイトレに関しての知識がゼロに等しいので,
去年まで作ってきたプログラムはバグが多く,今年は捨てて来年に向けたベースコードを作成することにした。

…でも提出3日前で下記のような状態。

何も表示されなくなって,かなり焦る。
原因はわかっているので,そのまま放置して実装を進める。

あと今年の提出2週間前のテストで,起動できない問題にハマった。たぶんDLLが問題。
OpenMP使っているとdllとか必要になるらしいので,脱OpenMP化した。

これで絵がでるはず!

…と思って,試しにレンダリングさせてみる。
何か絵は出たが,どうもおかしい。その時の描画結果が下図。

OpenMPの時はグローバル変数で参照していたのだが,流石にまずいだろうと思ってスレッドごとに別データにするようにしたら,上記のようなバグが出た。
で,上にも書いてある通りに乱数の更新をしないため,ずっと同じ値を参照していたようで変な結果になっていた。
乱数更新を計算後に入れ忘れていたので,更新するようにしたら解決。焦る焦る。

この時点で,まだメッシュは未対応。これが提出前日です。
ヤバい感じが出てきたので,そろそろメッシュを表示しようと思って対応を始める。
メッシュフォーマットを大きく変えるとめんっどちいので,昨年まで使っていたやつに修正を加えて,表示を試みる。

絵が出た!

よくみると,ちゃんと表示されている。
…が,たぶん普通の人には分からないだろうと思って,ネタとして投稿した。
ご覧のように,全く最適なしていないため計算がゲロ重くてレイが全然飛ばない。
結局前日は,BVHを8割ぐらい実装したところで,力尽きて寝た。

提出当日。
実家から自宅に帰る前にBVHを実装。いざ実行!

「…スタックオーバーフローだってさ」

またもや,バグる。
あぁもう!!なんで~

デバッグ時間が取れないまま実家を後にして,自宅に向かう。
移動時間で2時間をロス。
夜飯を買いに行く時間が無いと思ったので,帰り際にコンビニで昼食と夕食を購入し,自宅に到着。
BVHのデバッグを開始。

「うん!さっぱりわからない…」

時間をものすごく使いそうだったので,SAHの実装は諦め中間分割の実装に切り替え。こっちのほうが実装楽だし,時間が無いということで。
で,ようやくBVHが入る。

メッシュの位置を直すのもめんどいので,そのまま。
実装終えたところで,もう時間が5時間を切っている。
ここから,QBVHの実装に入る。
QBVHは一度躓いているので,サクッと実装できた。
で,実行してみると…

「なんか,普通のBVHよりも遅い」

以前実装したときは,BVHよりも確実に速かったのだが,どうも体感的に何も感じない。
で, またバグっていた。衝突判定の実装ミス。
無駄な計算をかなりやっているコードになっていた。焦ってコード書くとろくなことにならないね。皆さん落ち着いて書きましょう。
直したところで,実行。
時間計測するコードを書く時間も惜しいので,レンダリング画像を目視して確認。とりあえず,速くなっているっポイ。
続いて,OBVHの実装に移る。
こちらも,すんなり終わるかと思いきや…。

「なぜかビルドエラーが出る」

なんか,_mm256_cvtss_f32() が無いって怒られる。なぜだ?clangのドキュメントには書いてあるのに。
残り時間も3時間ぐらいになってきたので,ネットの情報を元に自前で関数追加してビルドエラーに対処。
自宅のメインPCがAVXサポートしていないので,サブに使っているノートPCで動作チェック。
とりあえず,絵は出るっポイ。

ここで,残り時間が2時間。
流石に,IBLをMISを入れるのは無理と判断。
最終レンダリング用のアセットをここから探し始める。一応,用意していたアセットはあるんだけども,あんまり見栄えしないのでボツにした。
で,もう時間もなく探している時間もないので適当に基本形状を配置することに。

プログラムが起動できない問題が解決できていないので,ようやくチェックすることに。

Visual Studioでexe起動時にログ出力されるdllを取り合えず片っ端から,batでコピーして実行ファイルに同梱してみたのだが,上の結果。
とりあえず,エラーを再現するために,Virtual BoxにWindows 7をインストール。
VirtualBoxで動作させてみたら,案の定同じエラーが出た。
で,結局DLLが問題っぽいので,DLLを使わないようにVCのビルド設定で「マルチスレッドDLL」になっている設定を「マルチスレッド」に変更して,軌道を試みる。

「お、出た」

これで,めでたく起動した!
この時点で,残り時間が既に1時間を切っている。

流石にそろそろzip用意しないとまずいので,提出用スライドの作成に入る。
前日に力尽きて寝る前に,色々とページ作っていたけど時間が無いし,今年は負け戦なのでアピールするべきことも無いのでバッサリ省略。
スライド作成中にレンダリングをさせておいて,最新のレンダリング画像を添付。

exeの起動を確認して,急いでzipに固めて提出。
残り時間20分。

レンダリング画像を見ると,やっぱり背景がどうも気に入らないので
HDR画像を差し替えて,シーンファイルも更新。
起動して,1枚目の画像が出力されるところまで確認して,大慌てでzip化して再び提出。

残り4分だった。

来年はこういうことが無いように,ちゃんと準備したい。

上記で書いた以外にも,画像サイズを変えると描画結果がおかしくなるバグとか色々とあって,
そのあたり直したので,来年はもう少しまともなレンダリングで出来るはず

…であってほしいなぁ。

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

Share

こんにちわ。
日々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さんお疲れさまでした。
また,来年の開催期待しています!!

もうすぐレイトレ合宿。

Share

来週はレイトレ合宿です。
例年のように今年も参加します。相変わらず絵はへぼいですが…。
ここ最近では,1年に1度の楽しみになっています。
レンダラーを書くとかなりグラフィックスの勉強になります。
書いたことない人は是非書くことをおススメします!
たぶん、来年も開催するでしょうから我こそは!と思う人は今から準備しておくと良いかもしれません。

レイトレ合宿が終わったら,D3D12の記事をアップしていこうかと思っています。
何か記事にしてほしい実装ネタがあれば,可能な範囲で要望を受け付けます。
コメント等で書いていただけると幸いです。

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

Share

こんにちわ,Pocolです。
皆さん元気にレイを飛ばしていますか?
今日は,先週参加してきたレイトレ合宿2!!についてレポートすることにします。
まず最初に結果ですが,今年の目標である「ビリ脱出!」をめでたく達成することができ7位入賞(7/15)を果たしました。
商品としてフィギュアで有名なグッドスマイルカンパニーさんのトイレットペーパーを頂きました。
10702239_630702457044562_7227892388743719624_n
あと,今年レンダリングした画像は下記のようになります。
frame_20140905_234109
一応わかりづらいので説明を追加しておくと,一番奥側がミラーになっていて手前のものが反射して見えるようになっています。右側はグロッシー(Phong)を表現するためのマテリアルに設定しています。
プレゼン資料をSlideShareにアップロードしたので興味がある方は見てください。



あと,各参加者のレンダリング画像と,レンダラーのソースコードおよびスライドがレイトレ合宿2!!のサイトに公開されているので,興味があるかたは是非見てみてください。

レイトレ合宿2!!ですが,今年は河口湖カントリーコテージBanにて開催されました。
Bw5IpQ-CIAAcZp1
10665075_630701617044646_2850027269058581096_n
去年は電車で行きましたが,荷物等を考えると色々と面倒なので,今年は自家用車にて現地に向かいましたが,東名高速で途中ゲリラ豪雨にあい,前が見えない状態で車を運転しました。
本当にマジゲリラ豪雨やばい。後ろから追突されないか非常に不安で,できるだけ車間をとって運転まじで神経使いました。さすがに疲れるので所々のPAで休憩をとりつつ無事に現地に到着。出発前はめちゃくちゃいい天気で,今日はBBQ日和だな~なんて思っていたのですが,現地に着いたら雨。これBBQできるのか?なんて思っていたのですが,屋根つきの場所だったのでみんなでおいしくお肉を頂くことができました!!
BBQの時に自己紹介があったのですが,八田さんが「レイトレ合宿のおかげで転職できました!」と言っていたのが印象深かったです。転職したいときにはレイトレすると良いのかもしれません。
BBQの後は各自お風呂に入って,その後セミナーという流れになりました。
今年のセミナーは内容が凄く濃くて非常に良かったです。以下はセミナーに参加した際のメモ内容です。


2014/09/06(Sat)
21:30~
kgussan 「フォトンマッピングGPU実装最新手法」
詳細は,http://www.slideshare.net/ssuser2e676d/gpu-h2609kgussan2-38830113を参照。

論文を読んでの内容を紹介。
大域照明は現行では2次までが多い。
アルゴリズムの比較について → raytracing.jpを参照。
リアルタイムレイトレーシング → 5FacesのMatt svobodaさん
今回紹介するリアルタイムフォトンマッピング処理 → Deep GBufferと,Alchemy AOやっている人による論文。
実装手法は4つ,3D Bounds, 2.5D Bounds, Hash Grid, Tiled。
手法の違いは,フォトンでループを回すか?ピクセルで回すか?射影するジオメトリ?どの空間?などで異なる。

(1) 3D Bounds
グラフィックスパイプラインのラスタライザを使う。
フォトンは20面体。
フォトンは格納せずラスタライズするときに直接つかっている感じで力技。
デメリット→ラスタライズでブルートフォースなので,ラスタライズの処理能力で頭打ちになる。

(2) 2.5D Bounds
スクリーンスペースでやる。ローカルリフレクションっぽい感じのやつ。
フォトンベースのループで,(1)よりも速い。
オクル―ジョンがある寄与の影響が出ない。

(3) HashGrid Cells
セル上にフォトンを分配して,スクリーンのピクセル座標を3D空間に投影する。
その座標に近いフォトンを3D空間上で探索・収集する。
離散下サンプル手法を使っているけどノイズがでるのでバイラテラルフィルタをかける。

(4)タイルベース手法
スクリーンスペースでタイル状にピクセルを区切って,そのタイルごとにフラスタムを生成。
フラスタムにのりしろをつけてフォトンを分配する。
タイルベースレンダリングのライトの代わりにフォトンを使ったような手法。

実行結果 → 2.5D BoundsとTiled Algorithmの結果が良好。

まとめ
データ構造で性能が大きくことなる。
映画ではフォトンが6桁ぐらい違うので,まだ適していない。
ネックはメモリバンド幅。
メモリレイテンシが追い付かない。

Q&A
・この技術使っているゲームある?
まだない。研究レベルでは多少例がある。
すごく限定的にすれば使えるのではないか?例えば懐中電灯をつかったドアップとか,ダイアを探せとか。

 


22:10~
shocker 「Monte Carlo Ray Tarcing アルゴリズム超概略」
詳細は,http://www.slideshare.net/shocker_0x15/2-38791622

・モンテカルロ積分
 期待値が真値に一致する。
 任意のPDFを使える

・重点的サンプリング
 理想的なPDFを求めることは困難。

・グローバルイルミネーション
 カメラに到達するあらゆる光経路の寄与を積分する。
 モンテカルロ積分を使って解く。

・Path Tracing
 入射方向を確率的にサンプル。
 光源に当たれば寄与が取れる。
 でもなかなか当たらない。

・Next Event Estimation
 光源上の点を明示的にサンプルし,視線経路と接続する。
 スペキュラーは使わない。

・Multiple Importance Sample
 光源とつなげる。
 一長一短がある。
 2つの戦略を重みをつけて合成するのがMIS。いいとこどり。
 MISウェイト
 バランスヒューリスティック。

・Bidirectional Path Tarcing
 MISを一般化。
 任意の経路に一般化。
 視線パスと光源パスの各頂点を接続。
 長さ(3, 1) → 目から3頂点,光源から1頂点を表す。

・Metropolis Light Transport
 ごく一部の領域の光輸送経路が重要となるシーンに弱い,そこでMLT。
 既存の有効パスへの変異を加えて新たなパスを生成。有効なものだけをとっていく。

・Primatry Sample Space MLT
 経路のもとになる乱数レベルで変異を加える。
 オリジナルのMLTよりも実装が簡単かつ,元よりもロバスト。

・Photon Mapping
 1.フォトントレーシング
 2.密度推定
 フォトンマッピングは経路をゆるく接続する。

・Progressive Photon Mapping
 あらかじめ輝度計算点を生成しておく
 フォトントレーシングを繰り返して統計量を更新。

・Stochastic PPM
 PPMはアンチエイリアスとかDOFが苦手。
 これらの効果は平均放射輝度推定を必要とする。
 正確な推定には無限の輝度推定点が必要。
 領域内で探索半径などの統計量を共有。
 すべてをまとめることで,平均輝度の推定値をプログレッシブに真値に近づけられる。

・PPM:Probabilistic Approach
 半径を徐々に小さくしていったオリジナルのフォトンマッピングの結果を重ね合わせるだけ。

・Adaptive Markov Chain Monte Calro PPM
 PPM(SPPM)の問題点。
 上からくる場合。
 不可視なフォトン経路=無駄な経路。
 PPM + PSSMLT + α
 可視なら採択していく。
 変異パラメータの自動調整も行う。
 ズームしても破綻しない。自動調整の結果。

・Unified Path Sample(Vertex Connection And Mergin)
 BPT
  光沢面の多いシーン得意
  SDSパス苦手

 PPM
  光沢面の多いシーン苦手
  SDSパス得意

 MISを使えばいいんじゃね?
 しかし問題がある。
 サンプリング次元が違う。
 バランスヒューリスティックで問題。単位が違う
  視線パスの端点をずらして光線パスの端点を追加。

・Path Space Regularization
 パストレをもう一度考える
 DRDFをぼかして寄与をとれるようにする。
 反復ごとに本来のBSDFへ近づいていく=本質的にはPPMの半径縮減と同じ。
 ディフューズ面には適用しない。
 Regularized MLT綺麗。
 さらに +MEで綺麗。

・Multiplexed MLT
 PSSMLTでは1つの提案分布と採択・棄却を組み合わせて目標分布を達成する。
 BPT等で実現されるマッピング(=提案分布)があまりよくない→棄却が増える。
 PSS内の変異を加えてマッピングの変更も行う。

・最新手法は基本的にMIS and/or (PSS)MLTの理論を使っているイメージ
 ボリュームレンダリングに関しては今回触れなかった。 
MLT系はアニメーションに向いていない。画面がちらつく,動画向きじゃない。

 


23:15~
perim 「MCMC based rendreing techniques」
詳細は,http://www.slideshare.net/OtsuHisanari を参照。

難しいシーン グロッシーとか
なぜ難しい?

解決手法
 マルコフチェインモンテカルロ
 MCMCを用いることによってエネルギー分布に従う光路をサンプリングできる。

目的
 ある分布に従うようなマルコフ連鎖を作る

MLT
 状態空間:Path space
 光路を直接変更することで変異を行う。

Metropolis-Hasting法 
 採択確率を決める

状態空間
 一様乱数列
 写像により光路変換。
 複雑な関数よりも特徴を抜き出した関数をいくつかサンプリングした方が効率的では?ということ

(このあと以降は難しすぎて理解できなかったのでメモるのをやめた。詳細はスライドを参照してください)

 


今日はレイトレ合宿2!!

Share

今日はレイトレ合宿2!!のために河口湖カントリーコテージに来ています。
今年は,20人弱の参加で,先ほどみんなでBBQを行いました。
これからセミナーが行われるので,明日以降でレポートを行いたいと思います。

Bw5IpQ-CIAAcZp1