タグ付けされた質問 「pathtracing」

物理的に正確なグローバルイルミネーションまたはそのバリアントのパストレースモンテカルロアルゴリズムについての質問。

2
Cook-Torrance BRDFをトレースするパス
- 「ので、長い記事のために申し訳ありませんが、私はそのように行うことを好む悪魔は細部にある。」:) 私はスクラッチからパストレーサーを書いており、完全に拡散した(ランバート)表面に対してうまく機能しています(つまり、ファーネステストは-少なくとも視覚的に-それがエネルギーを節約しており、レンダリングされた画像がミツバレンダラーで生成されたものと一致することを示しますパラメーター)。現在、いくつかの金属表面をレンダリングするために、オリジナルのCook-Torranceマイクロファセットモデルの鏡面反射用語のサポートを実装しています。しかし、このBRDFは受け取ったエネルギーよりも多くのエネルギーを反映しているようです。以下のサンプル画像を参照してください。 上の画像:ミツバリファレンス(正しいと仮定)画像:直接光サンプリング、重要度半球サンプリング、最大パス長= 5、32層化spp、ボックスフィルター、表面粗さ= 0.2、RGBによるパストレーシング。 上の画像:実際のレンダリング画像:ブルートフォースナイーブパストレース、均一な半球サンプリング、最大パス長= 5、4096層化spp、ボックスフィルター、表面粗さ= 0.2、RGB。レンダリング設定に関していくつかの違いはありますが、レンダリングされたイメージが前に示した参照に収束しないことは明らかです。 私はそれが実装の問題ではなく、レンダリング方程式フレームワーク内でのCook-Torranceモデルの適切な使用に関する問題だと思う傾向があります。以下に、鏡面反射光BRDFをどのように評価するかを説明します。適切に行っているかどうか、そしてそうでない場合はその理由を知りたいです。 重要な詳細を説明する前に、レンダラーは非常に単純であることに注意してください。1)総当たり攻撃ナイーブパストレーシングアルゴリズムのみを実装します。直接光サンプリング、双方向パストレーシング、MLTはありません。2)すべてのサンプリングは、交点の上の半球で均一です-重要なサンプリングはまったくなく、拡散サーフェスでもありません。3)光線経路の最大長は5に固定されています-ロシアンルーレットなし; 4)放射輝度/反射率はRGBタプルで通知されます-スペクトルレンダリングはありません。 クックトーランスマイクロファセットモデル 次に、スペキュラBRDF評価式を実装するためにたどったパスを作成しようとします。レンダリング方程式ですべてが開始 pは表面での交点であります、W oは視線ベクトルであり、wは私Lo(p,wo)=Le+∫ΩLi(p,wi)fr(wo,wi)cosθdωLo(p,wo)=Le+∫ΩLi(p,wi)fr(wo,wi)cos⁡θdω L_o(\textbf{p}, \mathbf{w_o}) = L_e + \int_{\Omega} L_i(\textbf{p}, \mathbf{w_i}) fr(\mathbf{w_o}, \mathbf{w_i}) \cos \theta d\omega pp\textbf{p}wowo\mathbf{w_o}wiwi\mathbf{w_i}光線ベクトルは、ある沿って出射放射輝度であるW 、O、L iが時輝度入射するPに沿ってW Iとのcos θ = N ⋅ W iが。LoLoL_owowo\mathbf{w_o}LiLiL_ipp\textbf{p}wiwi\mathbf{w_i}cosθ=n⋅wicos⁡θ=n⋅wi\cos \theta = \mathbf{n} \cdot \mathbf{w_i} 上記の積分(つまり、レンダリング方程式の反射項)は、次のモンテカルロ推定器1で近似できます。 ここでpは、サンプリングベクトルwkの分布を記述する確率密度関数(PDF)です。1N∑k=1NLi(p,wk)fr(wk,wo)cosθp(wk)1N∑k=1NLi(p,wk)fr(wk,wo)cos⁡θp(wk) \frac{1}{N} \sum_{k=1}^{N} \frac{ L_i(\textbf{p}, …

3
ロシアンルーレットは本当に答えですか?
パストレースの一部の実装では、ロシアンルーレットと呼ばれるアプローチを使用して、一部のパスをカリングし、他のパス間でその寄与を共有することを確認しました。 貢献の特定のしきい値を下回るまでパスをたどり、それを放棄するのではなく、別のしきい値が使用され、そのしきい値を下回る貢献のパスはわずかな確率で終了することを理解しています。他のパスは、終端されたパスからの失われたエネルギーを共有することに対応する量だけ寄与が増加します。これがテクニックによって導入されたバイアスを修正することなのか、それともバイアスを回避するためにテクニック全体が必要かどうかは、私にはわかりません。 ロシアンルーレットは公平な結果をもたらしますか? ロシアンルーレットは公平な結果を得るために必要ですか? つまり、小さなしきい値を使用し、そのしきい値を下回る瞬間にパスを終了するだけで、より偏った結果またはより偏りのない結果が得られますか? 任意の数のサンプルが与えられた場合、両方のアプローチは不偏の結果の画像に収束しますか? ロシアンルーレットアプローチを使用する根本的な理由を理解したいと考えています。速度や品質に大きな違いはありますか? 総エネルギーを保存するために、他の光線にエネルギーが再分配されることを理解しています。ただし、レイがしきい値に達した後にランダムに決定された寿命を持つのではなく、固定されたしきい値を下回るとレイが終了した場合、この再配布はまだ実行できませんか? 逆に、エネルギーを再分配せずにレイを終了することによって失われるエネルギーが最終的に失われる場合(再分配されるレイも最終的に終了するため)、これは状況をどのように改善しますか?

1
レイトレーシングでのアンチエイリアス/フィルタリング
レイトレーシング/パストレースにおいて、画像のアンチエイリアスを行う最も簡単な方法の1つは、ピクセル値をスーパーサンプリングし、結果を平均化することです。IE。ピクセルの中心を通してすべてのサンプルを撮影する代わりに、サンプルをある量だけオフセットします。 インターネットを検索してみると、これを行うために多少異なる2つの方法が見つかりました。 必要に応じてサンプルを生成し、フィルターで結果を比較します 1つの例はPBRTです フィルターの形状に等しい分布を持つサンプルを生成します 2つの例は、smallptとBenedikt Bitterliのタングステンレンダラーです。 生成と計量 基本的なプロセスは次のとおりです。 必要に応じてサンプルを作成します(ランダム、成層、低差異シーケンスなど) 2つのサンプル(xおよびy)を使用してカメラレイをオフセットします。 レイでシーンをレンダリングする フィルター関数とピクセル中心を基準としたサンプルの距離を使用して重みを計算します。たとえば、ボックスフィルター、テントフィルター、ガウスフィルターなど) レンダリングから色に重みを適用します フィルターの形で生成する 基本的な前提は、逆変換サンプリングを使用して、フィルターの形状に従って分散されるサンプルを作成することです。たとえば、ガウスの形で分布するサンプルのヒストグラムは次のようになります。 これは、正確に実行するか、関数を個別のpdf / cdfにビニングすることで実行できます。smallptは、テントフィルターの正確な逆累積分布関数を使用します。ビニング方法の例はこちらにあります ご質問 各方法の長所と短所は何ですか?そして、なぜあなたは他の上に1つを使用するのですか?私はいくつかのことを考えることができます: Generate and Weighは最も堅牢であるようであり、任意のサンプリング方法と任意のフィルターの任意の組み合わせが可能です。ただし、ImageBufferの重みを追跡し、最終的な解決を行う必要があります。 フィルターの形状で生成は、負のpdfを持つことができないため、正のフィルター形状のみをサポートできます(つまり、Mitchell、Catmull Rom、またはLanczosはサポートしません)。ただし、前述のように、重みを追跡する必要がないため、実装が簡単です。 ただし、最終的には、メソッド2はメソッド1の単純化と考えることができます。これは、本質的に暗黙的なボックスフィルターの重みを使用しているためです。

1
パストレースでの反射または屈折の選択
私は自分のパストレーサーに屈折と透過を実装しようとしていますが、その実装方法が少しわかりません。まず、いくつかの背景: 光が表面に当たると、その一部が反射し、一部が屈折します。 反射光と屈折光の量は、フレネル方程式で与えられます 再帰的なレイトレーサーでは、単純な実装は、反射用のレイと屈折用のレイを撮影し、フレネルを使用して加重合計を行うことです。 RTLo=Fresnel()=1−R=R⋅Li,reflection+T⋅Li,refractionR=Fresnel()T=1−RLo=R⋅Li,reflection+T⋅Li,refraction\begin{align*} R &= Fresnel()\\ T &= 1 - R\\ L_{\text{o}} &= R \cdot L_{\text{i,reflection}} + T \cdot L_{\text{i,refraction}} \end{align*} ただし、パストレースでは、1つのパスのみを選択します。これは私の質問です: 偏りのない方法で反射するか屈折するかを選択する方法 私の最初の推測は、フレネルに基づいてランダムに選択することです。別名: float p = randf(); float fresnel = Fresnel(); if (p <= fresnel) { // Reflect } else { // Refract } これは正しいでしょうか?または、何らかの補正係数が必要ですか?私は両方の道を進んでいないので。

3
環境マップの重要度サンプリング
MISベースの単方向パストレーサーおよび同様のタイプのレンダラーでサンプリングされた環境マップ(EM)について、現在知られている、理想的には製品検証済みのアプローチとして最も良いものは何ですか?私は、非常に複雑で理解しにくい実装のコストで完全なサンプリングを提供するソリューションよりも、合理的に機能的でありながら合理的に機能するソリューションを好むでしょう。 私がこれまでに知っていること EMをサンプリングするいくつかの簡単な方法があります。BSDFとEM関数の両方のシェイプを無視する、余弦加重法で必要な半球をサンプリングできます。その結果、動的EMには機能しません。 サンプリングを使用可能なレベルに改善するには、球体全体のEMの輝度をサンプリングします。比較的簡単に実装でき、結果は非常に良好です。ただし、サンプリング戦略では、半球の可視性情報と余弦係数(およびBSDF)も無視されているため、EMの高輝度領域によって直接照らされない表面に高いノイズが生じます。 論文 このトピックに関する論文をいくつか見つけましたが、まだ読んでいません。これらのいずれかを読み、順方向単方向パストレーサーで実装する価値がありますか? 環境マップの構造化重要度サンプリング(2003)Agarwal et al。 Kartic SubrとJim ArvoによるSteerable Importance Sampling(2007)。彼らは、「...コサインの重みを考慮しながら、任意の表面の局所的な向きによって定義される正の半球でサンプルを生成する環境マップの効率的な層別重要度サンプリングのアルゴリズムを提示すると主張しています。「重要なサンプリング球面調和関数」という論文は次のようにコメントしています。これは、クランプコサインを任意の方向に効率的に回転できる操縦可能な基盤を形成します。」 Petrik ClarbergとTomasAkenine-Möllerによる、直接照明用の​​実用的な製品重要度サンプリング(2008)。環境マップの照明と表面反射率の積をサンプリングするためのアルゴリズム。ウェーブレットベースの重要度サンプリングを使用します。 Jarosz、Carr、およびJensennによる重要度サンプリング球面調和関数(2009)。要約では、「...球面調和関数(SH)として表される重要度サンプリング関数の最初の実用的な方法を提示しています...」 トーンマップされた平均シフトベースの環境マップサンプリング(2015)(Feng et al。)これはかなり新しく、私はそれへの参照も論文自体も見つけませんでした。

1
明示的な光サンプリングによるプログレッシブパストレース
BRDFパーツの重要度サンプリングの背後にあるロジックを理解しました。ただし、光源を明示的にサンプリングすることになると、すべてが混乱します。たとえば、シーンに1つの点光源があり、各フレームで常に直接サンプリングする場合、モンテカルロ統合のもう1つのサンプルとしてカウントする必要がありますか?つまり、1つのサンプルをコサイン加重分布から取得し、もう1つのサンプルを点光源から取得します。合計2つのサンプルですか、それとも1つのサンプルですか?また、直接サンプルからの放射輝度を任意の項に分割する必要がありますか?

1
パストレーサー-多層材料と重要度サンプリング
現在、モンテカルロパストレーサーを実装しようとしています。私はいくつかの研究を行ってきましたが、材料への一般的なアプローチは、階層化モデルを使用することです。このようなもの: 光が表面に当たると、フレネルは、その光のどれだけが最初の層で反射され、どれだけが2番目の層に行くかなどを示します。 それで、私は似たようなことをしましたが、よりシンプルになりました。鏡面反射の1つのレイヤーと拡散の1つのレイヤーだけです。透過率はまだありません。これまでのところ、拡散反射光には単純なコサイン加重brdfを使用し、鏡面反射にはCook-Torranceマイクロファセットモデルを使用しています。 ここで難しい部分があります:光線が表面に到達したらどうすればよいですか?通常、表面材料に対応するbrdfを選択し、入射光の方向をサンプリングし、brdfを評価し、正しい確率分布関数で除算します。 しかし、ここでは、サーフェスヒットは事実上複数のマテリアルに対応しています。これを処理する素朴な方法は、各レイヤーヒットに対して1回サンプリングすることです。しかし、これは明らかに大きなパフォーマンスヒットの原因であり、私の道が事実上ツリーになります。 より良い解決策はありますか?

2
パストレースでテントフィルターを使用する理由
99行のCパストレーサーSmallptは、レンダリングするピクセルごとに2x2サブピクセルグリッドをレンダリングし、次にテントフィルターを実行してそれらを結合します。 ここでコードを説明する興味深いプレゼンテーションがあり、テントフィルターに言及していますが、なぜ存在するのかは説明していません。 この場合、ボックスブラー(単なるサンプルの平均化)よりもテントフィルターの方が望ましい理由を誰でも説明できますか? バイキュービックエルミート補間など、テントフィルターよりも優れたものを使用する方が高品質でしょうか?

2
拡散エリアライトの総放射パワー
私は、Physical Based Rendering(Pharr、Humphreys)という本を読んでいます。ライトの章では、さまざまな種類のライトの総放射電力の概算について説明します。たとえば、ポイントライトの合計パワーはintensity * 4 * piです。ここで4piは球全体の立体角を表します。強度*立体角=パワー(または放射束)なので、これは私には理にかなっています。これも単位で確認できます。強度はW / srで、立体角はsrなのでW/sr * sr = W、電力はワットで測定されます。チェックアウトします。 ただし、の対応する計算がわかりませんDiffuseAreaLight。本についての私の理解から、拡散エリアライトから放出される総パワーは次のように計算されemitted radiance * area * piます。放射輝度の単位はW /(sr * m ^ 2)なので、面積を乗算するとW / srが得られます。これにより、円周率は立体角を表すと思いますが、なぜ1piだけなのでしょうか。エリアライトの各ポイントは完全な半球で放射するため(2piステラジアンに対応)、私は2piを推測したでしょう。 この本に記載されている実際のコードは、こちらにあります。 私は何を誤解していますか?なぜtotal emitted power = emitted radiance * area * pi拡散エリアライトに意味があるのですか?

1
完全なモンテカルロ体積測定散乱
パストレーサーに完全なモンテカルロボリューム散乱を追加したいのですが、その方法を調べるのに苦労しています。私が何をしたいのかを説明しましょう: 光線が材料に入り、BTDFを適用します。その後、ある距離の後に体積散乱イベントが発生し、その後(等方性の場合)、光線は任意の方向に散乱します。球。これは、光線が別のBTDFで材料を出るまで繰り返されます。 私の質問は次のとおりです。 散布イベント間の距離を選択するにはどうすればよいですか?直感は、特定の距離の後に散乱する確率を与える、ある種の散乱PDFがあるべきだと私に教えてくれますか? これは正しいでしょうか? pdfは等方性材料の線形関数になりますか? この関数には、Googleが使用できる名前または何かがありますか? Beer-Lambertはまだスキャッターイベントの間に適用されますか? 私はそうは思いません。Beer-Lambertは実際の散乱計算を単純化したものであるため。 また、Beer-Lambertはマイクロスケールでの計算であり、パストレースはマクロスケールである可能性があります。 BSDFに相当する体積は何ですか?Henyey-Greensteinなどの位相関数を使用して新しい方向を決定できるようですが、減衰には何を使用しますか? 最後に、モンテカルロ体積散乱のより良いGoogleフレーズは何ですか? 体積散乱(SSS)を検索すると、完全なモンテカルロシミュレーション(双極子、内部散乱、外部散乱、拡散など)の簡略化に関する論文、方法、ブログ投稿が表示されます。

2
パストレースとマテリアル
パストレーサーで次のイベントのレイヤードマテリアルをサンプリングするときに使用する手法について疑問に思っています。私は3つのレイヤーを持つマテリアルを持っています:ベースディフューズ、スペキュラー、光沢ローブ。次の光線方向に向けてサンプリングする個別のレイヤーを選択するにはどうすればよいですか?これはランダムな選択ですか?もしそうなら、レイヤーに等しい重みが割り当てられていますか、それともローブの最終的な寄与に基づいて重みが使用されていますか?このサンプリング段階についての洞察をありがとう。 〜M

2
パストレースから高周波ノイズを除去するアルゴリズム
私はしばらく自分のレンダラーに取り組んでいますが、収束するまで長時間待つ以外に、レンダリングされた画像からモンテカルロノイズを削除する方法はあるのでしょうか。 私が見つけた方法は、画像の品質/シャープネスを大幅に低下させるため、画像をぼかすことですが、これはあまり役に立ちません。さらに、サンプル数の多い小さな画像をレンダリングしてから拡大することで、同じことを実現できます。 パストレースで画像のノイズに対処するために設計されたアルゴリズムはありますか?

1
このロシアのルーレットのコードは正しいですか?
レンダラーの実装方法を学ぶために、他のリソースの中でwww.scratchapixel.comを使用しています。このページから次のコードを見ています。マテリアルを通過するフォトンのパケットが検討されています。フォトンパケットごとに、重みが初期化されます。は吸収の確率です。www111dwdwdw 私にとって混乱するのは、からを引くときです。は光子の吸収されていない割合であるため、パケットのフルウェイトが場合、これが理にかなっていることがわかります。例えば、吸収の確率がある場合次いでと光子のが残っています。これが後続の反復でどのように意味をなすかわかりません。たとえば、反復2では、なので、この反復では3番目ではなく半分の光子が吸収されます。dwdwdwwww1111−dw1−dw1 - dw33%33%33\%w=1−0.33=0.67w=1−0.33=0.67w = 1 - 0.33 = 0.6767%67%67\%w=0.67−0.33=0.34w=0.67−0.33=0.34w = 0.67 - 0.33 = 0.34 int photons = 10000; ... int m = 5; // there's 1 over 6 chances for the packet to be absorbed for (int i = 0; i < nphotons; ++i) { float w = …

1
誰もが「1秒あたりの光線数」をどのようにカウントしますか?
最近、モンテカルロパストレーサーを開発しています。トレーサーのパフォーマンスを測定するために、1秒間にトレースできる光線の数をカウントする単純なメカニズムを実装することにしました。次に問題が発生します。単一の光線を定義するには2つの方法があります。 完全なレイ。つまり、カメラから始まり、終了するまでシーンの周囲をバウンドします。 光線は各交点から発生しました。 多くの人が「レイ/秒」を使用してレイ/パストレーサーのパフォーマンスを測定しますが、「レイ」をどのように認識するかは私には不明確です。多分誰かが知っていますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.