gam0022のブログスマートフォン用の表示で見るgam0022のブログWebGL(three.js)のカスタムシェーダにチャレンジ中!!読者ターゲットは自分です。参加しました!この広告は、90日以上更新していないブログに表示しています。開発8月27,28日に八丈島で開催されたレイトレ合宿4に参加しました!忘れないうちに、レイトレ合宿前の準備から当日の様子などをまとめておきたいと思います。概要をまとめた資料を貼っておきます。前々からコンピュータ・グラフィックの研究用にハイエンドなPCが欲しいと思っており、良い機会だったので思い切って20万円弱のデスクトップPCを購入しました。i7-6700Kを積んだPCで書類作成しています。JPの2015年版の「パストレーシングで始めるオフライン大域照明レンダリング入門」を読みました。2015のholeさんのパストレの章を10回くらい読み返すことで、レンダリング方程式をおおよそ理解できた。従ったサンプリングの実装を踏まえた解説などが分かりやすく説明されており、とても素晴らしいパストレーシングの入門記事だと感じました。この章のおかげで、パストレーシングに最低限必要な知識を網羅的に得ることができました。レンダラー実装編パストレーシング×レイマーチングholeさんが開発した、eduptというシンプルなパストレーシングのレンダラーをベースに、レンダラーを開発する作戦にしました。eduptでは、表示できるプリミティブとして球体しか対応していませんでした。eduptのデフォルトのシーンはコーネルボックスですが、このコーネルボックスの壁も巨大な球体で表現されていました。そこで、eduptをベースに距離関数によるオブジェクトも表示できるように改造しました。距離関数で表現されたオブジェクトとレイの交差判定はレイマーチングという手法を用いました。eduptをベースにして、距離関数で定義したメンガーのスポンジをレイマーチングで衝突判定して、パストレーシングでレンダリングするレンダラーを作った。2016年8月14日これが、自作レンダラー第1号による作品です。...今年のレイトレ合宿では、実行時間は5分以内という制限があったので、大幅にオーバーしてしまいました。レンダリングに5時間もかかってしまった原因は、レイマーチングとパストレーシングを組み合わせたことにあります。レイマーチングは漸近的に交差点を求めるため、1回のレイとオブジェクトの交差判定をするために、何度も距離関数を計算する必要があります。シーンの複雑さに依存するのですが、普通は50〜200回くらい距離関数を計算する必要があります。このため、CPUで処理するには重すぎる手法です。パストレーシングはノイズが見えなくなるまで同じピクセルを何度もサンプリングする必要がありますので、やはり重たい手法だと言えます。これもシーンに依存するのですが、数百〜数千回はサンプリングしないとノイズが消えた綺麗な画像にはなりません。2つの重い手法を組み合わせてしまったため、掛算的に計算量が増えてしまったという訳です。擬似表現パストレーシングとレイマーチングを組み合わせるのは無謀だと感じ、結局パストレーシングを諦めることにしました。パストレーシングなしでは間接照明を考慮しない不自然な画像になってしまいます。そこで、擬似AOや擬似コーティクスで品質を向上させることにしました。結果として、10秒弱でレンダリングを終了することができました!擬似AO擬似AOの有無による結果の違いを比較しました。AOありの方が穴の部分が暗くなっており、より自然な印象になっていると思います。今回実装した擬似AOについて簡単に説明します。2次レイの先端からの距離関数です。